diff --git a/AUTHORS b/AUTHORS
index 596eaf3..60b619ca 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -13,6 +13,7 @@
 Aaron Leventhal <aaronlevbugs@gmail.com>
 Aaron Randolph <aaron.randolph@gmail.com>
 Aaryaman Vasishta <jem456.vasishta@gmail.com>
+Abdu Ameen <abdu.ameen000@gmail.com>
 Abhijeet Kandalkar <abhijeet.k@samsung.com>
 Abhishek Agarwal <abhishek.a21@samsung.com>
 Abhishek Kanike <abhishek.ka@samsung.com>
diff --git a/DEPS b/DEPS
index bdb4bfb7..63e770e 100644
--- a/DEPS
+++ b/DEPS
@@ -129,11 +129,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': 'd521ce39e99f99651be0ff2ba46376b60b6bc7d9',
+  'skia_revision': 'ee90eb42fe4ff3c740da1747c37fcf1479108ac5',
   # 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': 'c6fbb279f3137a8cdc09ae48eb0b84744004079a',
+  'v8_revision': '457ad5c971e46bdaa18d6fb52ea03cbe9cc5e693',
   # 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.
@@ -145,7 +145,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
-  'swiftshader_revision': '64da4ae84db22545e72b8bd1f732bd358899380a',
+  'swiftshader_revision': '7804e8109a0a4171cd1da01756e6bf52ed4b0fe9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
@@ -196,7 +196,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': 'd7f22e29c4a1be844b5eb8153cb3b95775f2af7e',
+  'catapult_revision': 'bbeee6d77ff6922fce39198566a907c67df6e41b',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -252,7 +252,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'spv_tools_revision': 'dca3ea5e1719ef996111fa53582fc592d5f891ed',
+  'spv_tools_revision': '64faf6d9cb551f7eadca163128c6757bd831a93c',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -268,7 +268,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '15d4c2e63b7281d622eba063c615be73358af260',
+  'dawn_revision': '9286adcb0f7e46b1cb628315cdfb75b0f6a1afd6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -830,7 +830,7 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '7a2205ca50c854f82bf7325478d80e85b74ce920',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '99d965d911f3cdb32d4fd5154664251764bf6691',
 
   'src/third_party/devtools-node-modules':
     Var('chromium_git') + '/external/github.com/ChromeDevTools/devtools-node-modules' + '@' + Var('devtools_node_modules_revision'),
@@ -1074,7 +1074,7 @@
   },
 
   'src/third_party/libvpx/source/libvpx':
-    Var('chromium_git') + '/webm/libvpx.git' + '@' +  'da5be113f3205544658db52201a66273cf7d6e70',
+    Var('chromium_git') + '/webm/libvpx.git' + '@' +  'e50f4e4112a0e031dfc9df7a115fb0f8931bd4e1',
 
   'src/third_party/libwebm/source':
     Var('chromium_git') + '/webm/libwebm.git' + '@' + '51ca718c3adf0ddedacd7df25fe45f67dc5a9ce1',
@@ -1183,7 +1183,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' +  '999374532cec467910846b6af52df01aae7278ea',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' +  'dfd2f8c4fcb0dcab4ddcb873aa37cc71084c184f',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + 'ac0d98b5cee6c024b0cffeb4f8f45b6fc5ccdb78',
@@ -1395,7 +1395,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@75c4cbfa717ae8cb1a946886dce1c863bfc7833b',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@5557cd43e22efa539bce5c5715b8f778ac469921',
     'condition': 'checkout_src_internal',
   },
 
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 01cef896..23439a4 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
@@ -32,6 +32,9 @@
 import org.chromium.net.test.util.TestWebServer;
 
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
 /**
  * The tests for content postMessage API.
@@ -47,43 +50,77 @@
 
     // Inject to the page to verify received messages.
     private static class MessageObject {
-        private boolean mReady;
-        private String mData;
-        private String mOrigin;
-        private int[] mPorts;
-        private final Object mLock = new Object();
+        private LinkedBlockingQueue<Data> mQueue = new LinkedBlockingQueue<>();
 
-        @JavascriptInterface
-        public void setMessageParams(String data, String origin, int[] ports) {
-            synchronized (mLock) {
-                mData = data;
+        public static class Data {
+            public String mMessage;
+            public String mOrigin;
+            public int[] mPorts;
+
+            public Data(String message, String origin, int[] ports) {
+                mMessage = message;
                 mOrigin = origin;
                 mPorts = ports;
-                mReady = true;
-                mLock.notify();
             }
         }
 
-        public void waitForMessage() throws InterruptedException {
-            synchronized (mLock) {
-                long deadline = System.currentTimeMillis() + TIMEOUT;
-                while (!mReady && System.currentTimeMillis() < deadline) {
-                    mLock.wait(deadline - System.currentTimeMillis());
-                }
+        @JavascriptInterface
+        public void setMessageParams(String message, String origin, int[] ports) throws Exception {
+            mQueue.add(new Data(message, origin, ports));
+        }
+
+        public Data waitForMessage() throws Exception {
+            return waitForNextQueueElement(mQueue);
+        }
+    }
+
+    private static class ChannelContainer {
+        private MessagePort[] mChannel;
+        private LinkedBlockingQueue<Data> mQueue = new LinkedBlockingQueue<>();
+
+        public static class Data {
+            public String mMessage;
+            public Looper mLastLooper;
+
+            public Data(String message, Looper looper) {
+                mMessage = message;
+                mLastLooper = looper;
             }
         }
 
-        public String getData() {
-            return mData;
+        public void set(MessagePort[] channel) {
+            mChannel = channel;
         }
 
-        public String getOrigin() {
-            return mOrigin;
+        public MessagePort[] get() {
+            return mChannel;
         }
 
-        public int[] getPorts() {
-            return mPorts;
+        public void notifyCalled(String message) {
+            try {
+                mQueue.add(new Data(message, Looper.myLooper()));
+            } catch (IllegalStateException e) {
+                // We expect this add operation will always succeed since the default capacity of
+                // the queue is Integer.MAX_VALUE.
+            }
         }
+
+        public Data waitForMessageCallback() throws Exception {
+            return waitForNextQueueElement(mQueue);
+        }
+
+        public boolean isQueueEmpty() {
+            return mQueue.isEmpty();
+        }
+    }
+
+    private static <T> T waitForNextQueueElement(LinkedBlockingQueue<T> queue) throws Exception {
+        T value = queue.poll(TIMEOUT, TimeUnit.MILLISECONDS);
+        if (value == null) {
+            throw new TimeoutException(
+                    "Timeout while trying to take next entry from BlockingQueue");
+        }
+        return value;
     }
 
     private MessageObject mMessageObject;
@@ -197,9 +234,9 @@
         loadPage(TEST_PAGE);
         InstrumentationRegistry.getInstrumentation().runOnMainSync(
                 () -> mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, targetOrigin, null));
-        mMessageObject.waitForMessage();
-        Assert.assertEquals(WEBVIEW_MESSAGE, mMessageObject.getData());
-        Assert.assertEquals(SOURCE_ORIGIN, mMessageObject.getOrigin());
+        MessageObject.Data data = mMessageObject.waitForMessage();
+        Assert.assertEquals(WEBVIEW_MESSAGE, data.mMessage);
+        Assert.assertEquals(SOURCE_ORIGIN, data.mOrigin);
     }
 
     @Test
@@ -494,62 +531,6 @@
         expectTitle("2");
     }
 
-    private static class ChannelContainer {
-        private boolean mReady;
-        private MessagePort[] mChannel;
-        private final Object mLock = new Object();
-        private String mMessage = "";
-        private Looper mLastLooper;
-        private int mCount;
-        private int mWaitCount;
-
-        public ChannelContainer() {
-            this(1);
-        }
-
-        public ChannelContainer(int n) {
-            mWaitCount = n;
-        }
-
-        public void set(MessagePort[] channel) {
-            mChannel = channel;
-        }
-        public MessagePort[] get() {
-            return mChannel;
-        }
-
-        public void setMessage(String message) {
-            synchronized (mLock) {
-                mMessage += message;
-                mLastLooper = Looper.myLooper();
-                if (++mCount < mWaitCount) return;
-                mReady = true;
-                mLock.notify();
-            }
-        }
-
-        public int getMessageCount() {
-            return mCount;
-        }
-
-        public String getMessage() {
-            return mMessage;
-        }
-
-        public Looper getLastLooper() {
-            return mLastLooper;
-        }
-
-        public void waitForMessage() throws InterruptedException {
-            synchronized (mLock) {
-                long deadline = System.currentTimeMillis() + TIMEOUT;
-                while (!mReady && System.currentTimeMillis() < deadline) {
-                    mLock.wait(deadline - System.currentTimeMillis());
-                }
-            }
-        }
-    }
-
     private static final String ECHO_PAGE =
             "<!DOCTYPE html><html><body>"
             + "    <script>"
@@ -578,14 +559,14 @@
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             channel[0].setMessageCallback(
-                    (message, sentPorts) -> channelContainer.setMessage(message), null);
+                    (message, sentPorts) -> channelContainer.notifyCalled(message), null);
             mAwContents.postMessageToFrame(
                     null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(), new MessagePort[] {channel[1]});
             channel[0].postMessage(HELLO, null);
         });
         // wait for the asynchronous response from JS
-        channelContainer.waitForMessage();
-        Assert.assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage());
+        ChannelContainer.Data data = channelContainer.waitForMessageCallback();
+        Assert.assertEquals(HELLO + JS_MESSAGE, data.mMessage);
     }
 
     // Verify that a message port can be used immediately (even if it is in
@@ -602,14 +583,14 @@
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             MessagePort[] channel = mAwContents.createMessageChannel();
             channel[0].setMessageCallback(
-                    (message, sentPorts) -> channelContainer.setMessage(message), null);
+                    (message, sentPorts) -> channelContainer.notifyCalled(message), null);
             mAwContents.postMessageToFrame(
                     null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(), new MessagePort[] {channel[1]});
             channel[0].postMessage(HELLO, null);
         });
         // Wait for the asynchronous response from JS.
-        channelContainer.waitForMessage();
-        Assert.assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage());
+        ChannelContainer.Data data = channelContainer.waitForMessageCallback();
+        Assert.assertEquals(HELLO + JS_MESSAGE, data.mMessage);
     }
 
     // Verify that a message port can be used for message transfer when both
@@ -623,12 +604,12 @@
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             MessagePort[] channel = mAwContents.createMessageChannel();
             channel[1].setMessageCallback(
-                    (message, sentPorts) -> channelContainer.setMessage(message), null);
+                    (message, sentPorts) -> channelContainer.notifyCalled(message), null);
             channel[0].postMessage(HELLO, null);
         });
         // Wait for the asynchronous response from JS.
-        channelContainer.waitForMessage();
-        Assert.assertEquals(HELLO, channelContainer.getMessage());
+        ChannelContainer.Data data = channelContainer.waitForMessageCallback();
+        Assert.assertEquals(HELLO, data.mMessage);
     }
 
     // Post a message with a pending port to a frame and then post a bunch of messages
@@ -739,8 +720,8 @@
             mAwContents.postMessageToFrame(null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(),
                     new MessagePort[] {channel[0], channel[1]});
         });
-        mMessageObject.waitForMessage();
-        Assert.assertEquals(WORKER_MESSAGE, mMessageObject.getData());
+        MessageObject.Data data = mMessageObject.waitForMessage();
+        Assert.assertEquals(WORKER_MESSAGE, data.mMessage);
     }
 
     private static final String POPUP_MESSAGE = "from_popup";
@@ -782,15 +763,14 @@
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             MessagePort[] channel = mAwContents.createMessageChannel();
-            channelContainer.set(channel);
             channel[0].setMessageCallback(
-                    (message, sentPorts) -> channelContainer.setMessage(message), null);
+                    (message, sentPorts) -> channelContainer.notifyCalled(message), null);
             mAwContents.postMessageToFrame(
                     null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(), new MessagePort[] {channel[1]});
             channel[0].postMessage(HELLO, null);
         });
-        channelContainer.waitForMessage();
-        Assert.assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage());
+        ChannelContainer.Data data = channelContainer.waitForMessageCallback();
+        Assert.assertEquals(HELLO + JS_MESSAGE, data.mMessage);
     }
 
     // Test if WebView can post a message from/to an iframe in a popup window.
@@ -806,15 +786,14 @@
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             MessagePort[] channel = mAwContents.createMessageChannel();
-            channelContainer.set(channel);
             channel[0].setMessageCallback(
-                    (message, sentPorts) -> channelContainer.setMessage(message), null);
+                    (message, sentPorts) -> channelContainer.notifyCalled(message), null);
             mAwContents.postMessageToFrame(
                     null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(), new MessagePort[] {channel[1]});
             channel[0].postMessage(HELLO, null);
         });
-        channelContainer.waitForMessage();
-        Assert.assertEquals(HELLO + JS_MESSAGE, channelContainer.getMessage());
+        ChannelContainer.Data data = channelContainer.waitForMessageCallback();
+        Assert.assertEquals(HELLO + JS_MESSAGE, data.mMessage);
     }
 
     private static final String TEST_PAGE_FOR_UNSUPPORTED_MESSAGES = "<!DOCTYPE html><html><body>"
@@ -841,16 +820,15 @@
         final ChannelContainer channelContainer = new ChannelContainer();
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             MessagePort[] channel = mAwContents.createMessageChannel();
-            channelContainer.set(channel);
             channel[0].setMessageCallback(
-                    (message, sentPorts) -> channelContainer.setMessage(message), null);
+                    (message, sentPorts) -> channelContainer.notifyCalled(message), null);
             mAwContents.postMessageToFrame(
                     null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(), new MessagePort[] {channel[1]});
         });
-        channelContainer.waitForMessage();
-        Assert.assertEquals(JS_MESSAGE, channelContainer.getMessage());
+        ChannelContainer.Data data = channelContainer.waitForMessageCallback();
+        Assert.assertEquals(JS_MESSAGE, data.mMessage);
         // Assert that onMessage is called only once.
-        Assert.assertEquals(1, channelContainer.getMessageCount());
+        Assert.assertTrue(channelContainer.isQueueEmpty());
     }
 
     private static final String TEST_TRANSFER_EMPTY_PORTS = "<!DOCTYPE html><html><body>"
@@ -868,17 +846,18 @@
     @Feature({"AndroidWebView", "Android-PostMessage"})
     public void testTransferEmptyPortsArray() throws Throwable {
         loadPage(TEST_TRANSFER_EMPTY_PORTS);
-        final ChannelContainer channelContainer = new ChannelContainer(2);
+        final ChannelContainer channelContainer = new ChannelContainer();
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             MessagePort[] channel = mAwContents.createMessageChannel();
-            channelContainer.set(channel);
             channel[0].setMessageCallback(
-                    (message, sentPorts) -> channelContainer.setMessage(message), null);
+                    (message, sentPorts) -> channelContainer.notifyCalled(message), null);
             mAwContents.postMessageToFrame(
                     null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(), new MessagePort[] {channel[1]});
         });
-        channelContainer.waitForMessage();
-        Assert.assertEquals("12", channelContainer.getMessage());
+        ChannelContainer.Data data1 = channelContainer.waitForMessageCallback();
+        Assert.assertEquals("1", data1.mMessage);
+        ChannelContainer.Data data2 = channelContainer.waitForMessageCallback();
+        Assert.assertEquals("2", data2.mMessage);
     }
 
     // Make sure very large messages can be sent and received.
@@ -898,15 +877,14 @@
 
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             MessagePort[] channel = mAwContents.createMessageChannel();
-            channelContainer.set(channel);
             channel[0].setMessageCallback(
-                    (message, sentPorts) -> channelContainer.setMessage(message), null);
+                    (message, sentPorts) -> channelContainer.notifyCalled(message), null);
             mAwContents.postMessageToFrame(
                     null, WEBVIEW_MESSAGE, mWebServer.getBaseUrl(), new MessagePort[] {channel[1]});
             channel[0].postMessage(longMessage, null);
         });
-        channelContainer.waitForMessage();
-        Assert.assertEquals(longMessage + JS_MESSAGE, channelContainer.getMessage());
+        ChannelContainer.Data data = channelContainer.waitForMessageCallback();
+        Assert.assertEquals(longMessage + JS_MESSAGE, data.mMessage);
     }
 
     // Make sure messages are dispatched on the correct looper.
@@ -914,28 +892,26 @@
     @SmallTest
     @Feature({"AndroidWebView", "Android-PostMessage"})
     public void testMessageOnCorrectLooper() throws Throwable {
-        final ChannelContainer channelContainer1 = new ChannelContainer(1);
-        final ChannelContainer channelContainer2 = new ChannelContainer(1);
+        final ChannelContainer channelContainer1 = new ChannelContainer();
+        final ChannelContainer channelContainer2 = new ChannelContainer();
         final HandlerThread thread = new HandlerThread("test-thread");
         thread.start();
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             MessagePort[] channel = mAwContents.createMessageChannel();
-            channelContainer1.set(channel);
-            channelContainer2.set(channel);
             channel[0].setMessageCallback(
-                    (message, sentPorts) -> channelContainer1.setMessage(message), null);
+                    (message, sentPorts) -> channelContainer1.notifyCalled(message), null);
             channel[1].setMessageCallback((message, sentPorts)
-                                                  -> channelContainer2.setMessage(message),
+                                                  -> channelContainer2.notifyCalled(message),
                     new Handler(thread.getLooper()));
             channel[0].postMessage("foo", null);
             channel[1].postMessage("bar", null);
         });
-        channelContainer1.waitForMessage();
-        channelContainer2.waitForMessage();
-        Assert.assertEquals("bar", channelContainer1.getMessage());
-        Assert.assertEquals(Looper.getMainLooper(), channelContainer1.getLastLooper());
-        Assert.assertEquals("foo", channelContainer2.getMessage());
-        Assert.assertEquals(thread.getLooper(), channelContainer2.getLastLooper());
+        ChannelContainer.Data data1 = channelContainer1.waitForMessageCallback();
+        ChannelContainer.Data data2 = channelContainer2.waitForMessageCallback();
+        Assert.assertEquals("bar", data1.mMessage);
+        Assert.assertEquals(Looper.getMainLooper(), data1.mLastLooper);
+        Assert.assertEquals("foo", data2.mMessage);
+        Assert.assertEquals(thread.getLooper(), data2.mLastLooper);
     }
 
     // Make sure it is possible to change the message handler.
@@ -943,29 +919,29 @@
     @SmallTest
     @Feature({"AndroidWebView", "Android-PostMessage"})
     public void testChangeMessageHandler() throws Throwable {
-        final ChannelContainer channelContainer = new ChannelContainer(1);
+        final ChannelContainer channelContainer = new ChannelContainer();
         final HandlerThread thread = new HandlerThread("test-thread");
         thread.start();
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             MessagePort[] channel = mAwContents.createMessageChannel();
             channelContainer.set(channel);
             channel[0].setMessageCallback((message, sentPorts)
-                                                  -> channelContainer.setMessage(message),
+                                                  -> channelContainer.notifyCalled(message),
                     new Handler(thread.getLooper()));
             channel[1].postMessage("foo", null);
         });
-        channelContainer.waitForMessage();
-        Assert.assertEquals("foo", channelContainer.getMessage());
-        Assert.assertEquals(thread.getLooper(), channelContainer.getLastLooper());
-        final ChannelContainer channelContainer2 = new ChannelContainer(1);
+        ChannelContainer.Data data = channelContainer.waitForMessageCallback();
+        Assert.assertEquals("foo", data.mMessage);
+        Assert.assertEquals(thread.getLooper(), data.mLastLooper);
+        final ChannelContainer channelContainer2 = new ChannelContainer();
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             MessagePort[] channel = channelContainer.get();
             channel[0].setMessageCallback(
-                    (message, sentPorts) -> channelContainer2.setMessage(message), null);
+                    (message, sentPorts) -> channelContainer2.notifyCalled(message), null);
             channel[1].postMessage("bar", null);
         });
-        channelContainer2.waitForMessage();
-        Assert.assertEquals("bar", channelContainer2.getMessage());
-        Assert.assertEquals(Looper.getMainLooper(), channelContainer2.getLastLooper());
+        ChannelContainer.Data data2 = channelContainer2.waitForMessageCallback();
+        Assert.assertEquals("bar", data2.mMessage);
+        Assert.assertEquals(Looper.getMainLooper(), data2.mLastLooper);
     }
 }
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 1234f9cf..48f67db5 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1360,6 +1360,8 @@
     "//chromeos/services/assistant/public:feature_flags",
     "//chromeos/services/assistant/public/mojom",
     "//chromeos/services/multidevice_setup/public/mojom",
+    "//chromeos/services/network_config/public/cpp",
+    "//chromeos/services/network_config/public/mojom",
     "//chromeos/services/power/public/cpp:controller",
     "//chromeos/services/power/public/mojom",
     "//chromeos/settings",
@@ -1967,6 +1969,8 @@
     "//chromeos/services/assistant:test_support",
     "//chromeos/services/multidevice_setup/public/cpp:test_support",
     "//chromeos/services/multidevice_setup/public/mojom",
+    "//chromeos/services/network_config/public/cpp:test_support",
+    "//chromeos/services/network_config/public/mojom",
     "//chromeos/system",
     "//components/account_id",
     "//components/arc:notification_test_support",
@@ -1986,6 +1990,7 @@
     "//services/device/public/cpp/bluetooth",
     "//services/media_session/public/cpp/test:test_support",
     "//services/media_session/public/mojom",
+    "//services/viz/public/cpp:manifest",
     "//services/ws:test_support",
     "//services/ws/public/cpp/input_devices:test_support",
     "//services/ws/public/mojom",
@@ -2042,6 +2047,7 @@
     ":ash_service_resources",
     ":ash_service",
     "//ash/resources:ash_test_resources_100_percent",
+    "//services/viz",
   ]
 
   data = [
diff --git a/ash/DEPS b/ash/DEPS
index 361b20b1..7dc3dfb1 100644
--- a/ash/DEPS
+++ b/ash/DEPS
@@ -75,6 +75,7 @@
   "+chromeos/services/assistant/public" ,
   "+chromeos/services/assistant/test_support",
   "+chromeos/services/multidevice_setup/public",
+  "+chromeos/services/network_config/public",
   "+chromeos/services/power/public",
   # TODO(https://crbug.com/644361): Eliminate this.
   "+chromeos/settings/timezone_settings.h",
diff --git a/ash/accessibility/accessibility_focus_ring.cc b/ash/accessibility/accessibility_focus_ring.cc
index c42b192..509d804 100644
--- a/ash/accessibility/accessibility_focus_ring.cc
+++ b/ash/accessibility/accessibility_focus_ring.cc
@@ -93,8 +93,13 @@
   return ring;
 }
 
+constexpr int kScreenPaddingDip = 2;
 }  // namespace
 
+int AccessibilityFocusRing::GetScreenPaddingForTesting() {
+  return kScreenPaddingDip;
+}
+
 // static
 gfx::Rect AccessibilityFocusRing::screen_bounds_for_testing_;
 
@@ -163,26 +168,28 @@
   gfx::Rect top = orig_top_line;
   gfx::Rect middle = orig_body;
   gfx::Rect bottom = orig_bottom_line;
-  gfx::Rect display = GetScreenBoundsForRect(middle);
+
+  gfx::Rect screen_bounds = GetScreenBoundsForRect(middle);
+  screen_bounds.Inset(kScreenPaddingDip, kScreenPaddingDip);
 
   // Don't force a focus ring that is entirely offscreen to display.
-  if (IsFocusRingOffscreen(top, middle, bottom, display))
+  if (IsFocusRingOffscreen(top, middle, bottom, screen_bounds))
     return CreateFromThreeRects(top, middle, bottom, margin);
 
-  if (top.Intersects(display))
-    top.Intersect(display);
+  if (top.Intersects(screen_bounds))
+    top.Intersect(screen_bounds);
   else
-    ClipToBounds(&top, display);
+    ClipToBounds(&top, screen_bounds);
 
-  if (middle.Intersects(display))
-    middle.Intersect(display);
+  if (middle.Intersects(screen_bounds))
+    middle.Intersect(screen_bounds);
   else
-    ClipToBounds(&middle, display);
+    ClipToBounds(&middle, screen_bounds);
 
-  if (bottom.Intersects(display))
-    bottom.Intersect(display);
+  if (bottom.Intersects(screen_bounds))
+    bottom.Intersect(screen_bounds);
   else
-    ClipToBounds(&bottom, display);
+    ClipToBounds(&bottom, screen_bounds);
 
   int min_height = std::min(top.height(), bottom.height());
   margin = std::min(margin, min_height / 2);
diff --git a/ash/accessibility/accessibility_focus_ring.h b/ash/accessibility/accessibility_focus_ring.h
index ab974524..c99e1bb2 100644
--- a/ash/accessibility/accessibility_focus_ring.h
+++ b/ash/accessibility/accessibility_focus_ring.h
@@ -94,6 +94,7 @@
   static void set_screen_bounds_for_testing(const gfx::Rect& bounds) {
     screen_bounds_for_testing_ = bounds;
   }
+  static int GetScreenPaddingForTesting();
 
   gfx::Point points[36];
   static gfx::Rect screen_bounds_for_testing_;
diff --git a/ash/accessibility/accessibility_focus_ring_group_unittest.cc b/ash/accessibility/accessibility_focus_ring_group_unittest.cc
index 50ad72ca..6427d97 100644
--- a/ash/accessibility/accessibility_focus_ring_group_unittest.cc
+++ b/ash/accessibility/accessibility_focus_ring_group_unittest.cc
@@ -92,7 +92,7 @@
   // Easy sanity check. Given a single rectangle, make sure we get back
   // a focus ring with the same bounds.
   std::vector<gfx::Rect> rects;
-  rects.push_back(gfx::Rect(10, 30, 70, 150));
+  rects.push_back(gfx::Rect(20, 30, 70, 150));
   std::vector<AccessibilityFocusRing> rings;
   group_.RectsToRings(rects, &rings);
   ASSERT_EQ(1U, rings.size());
@@ -117,13 +117,14 @@
   int x = -10;  // offscreen
   int y = -20;  // offscreen
   int length = 50;
+  int padding = AccessibilityFocusRing::GetScreenPaddingForTesting();
   std::vector<gfx::Rect> rects;
 
   rects.push_back(gfx::Rect(x, y, length, length));
   std::vector<AccessibilityFocusRing> rings;
   group_.RectsToRings(rects, &rings);
-  gfx::Rect result(0, 0, length + x + group_.GetMargin(),
-                   length + y + group_.GetMargin());
+  gfx::Rect result(padding, padding, length + x + group_.GetMargin() - padding,
+                   length + y + group_.GetMargin() - padding);
 
   ASSERT_EQ(1U, rings.size());
   ASSERT_EQ(result, rings[0].GetBounds());
@@ -133,75 +134,77 @@
   // Given two rects, one on top of each other, we should get back a
   // focus ring that surrounds them both.
   std::vector<gfx::Rect> rects;
-  rects.push_back(gfx::Rect(10, 10, 60, 30));
-  rects.push_back(gfx::Rect(10, 40, 60, 30));
+  rects.push_back(gfx::Rect(20, 20, 60, 30));
+  rects.push_back(gfx::Rect(20, 50, 60, 30));
   std::vector<AccessibilityFocusRing> rings;
   group_.RectsToRings(rects, &rings);
   ASSERT_EQ(1U, rings.size());
-  ASSERT_EQ(AddMargin(gfx::Rect(10, 10, 60, 60)), rings[0].GetBounds());
+  ASSERT_EQ(AddMargin(gfx::Rect(20, 20, 60, 60)), rings[0].GetBounds());
 }
 
 TEST_F(AccessibilityFocusRingGroupTest, RectsToRingsHorizontalStack) {
   // Given two rects, one next to the other horizontally, we should get back a
   // focus ring that surrounds them both.
   std::vector<gfx::Rect> rects;
-  rects.push_back(gfx::Rect(10, 10, 60, 30));
-  rects.push_back(gfx::Rect(70, 10, 60, 30));
+  rects.push_back(gfx::Rect(20, 20, 60, 30));
+  rects.push_back(gfx::Rect(80, 20, 60, 30));
   std::vector<AccessibilityFocusRing> rings;
   group_.RectsToRings(rects, &rings);
   ASSERT_EQ(1U, rings.size());
-  ASSERT_EQ(AddMargin(gfx::Rect(10, 10, 120, 30)), rings[0].GetBounds());
+  ASSERT_EQ(AddMargin(gfx::Rect(20, 20, 120, 30)), rings[0].GetBounds());
 }
 
 TEST_F(AccessibilityFocusRingGroupTest, RectsToRingsParagraphShape) {
   // Given a simple paragraph shape, make sure we get something that
   // outlines it correctly.
+  AccessibilityFocusRing::set_screen_bounds_for_testing(
+      gfx::Rect(0, 0, 1000, 1000));
   std::vector<gfx::Rect> rects;
-  rects.push_back(gfx::Rect(10, 10, 180, 80));
-  rects.push_back(gfx::Rect(10, 110, 580, 280));
-  rects.push_back(gfx::Rect(410, 410, 180, 80));
+  rects.push_back(gfx::Rect(110, 110, 180, 80));
+  rects.push_back(gfx::Rect(110, 210, 580, 280));
+  rects.push_back(gfx::Rect(510, 510, 180, 80));
   std::vector<AccessibilityFocusRing> rings;
   group_.RectsToRings(rects, &rings);
   ASSERT_EQ(1U, rings.size());
-  EXPECT_EQ(gfx::Rect(0, 0, 600, 500), rings[0].GetBounds());
+  EXPECT_EQ(gfx::Rect(100, 100, 600, 500), rings[0].GetBounds());
 
   const gfx::Point* points = rings[0].points;
-  EXPECT_EQ(gfx::Point(0, 90), points[0]);
-  EXPECT_EQ(gfx::Point(0, 10), points[1]);
-  EXPECT_EQ(gfx::Point(0, 0), points[2]);
-  EXPECT_EQ(gfx::Point(10, 0), points[3]);
-  EXPECT_EQ(gfx::Point(190, 0), points[4]);
-  EXPECT_EQ(gfx::Point(200, 0), points[5]);
-  EXPECT_EQ(gfx::Point(200, 10), points[6]);
-  EXPECT_EQ(gfx::Point(200, 90), points[7]);
-  EXPECT_EQ(gfx::Point(200, 100), points[8]);
-  EXPECT_EQ(gfx::Point(210, 100), points[9]);
-  EXPECT_EQ(gfx::Point(590, 100), points[10]);
-  EXPECT_EQ(gfx::Point(600, 100), points[11]);
-  EXPECT_EQ(gfx::Point(600, 110), points[12]);
-  EXPECT_EQ(gfx::Point(600, 390), points[13]);
-  EXPECT_EQ(gfx::Point(600, 400), points[14]);
-  EXPECT_EQ(gfx::Point(600, 400), points[15]);
-  EXPECT_EQ(gfx::Point(600, 400), points[16]);
-  EXPECT_EQ(gfx::Point(600, 400), points[17]);
-  EXPECT_EQ(gfx::Point(600, 410), points[18]);
-  EXPECT_EQ(gfx::Point(600, 490), points[19]);
-  EXPECT_EQ(gfx::Point(600, 500), points[20]);
-  EXPECT_EQ(gfx::Point(590, 500), points[21]);
-  EXPECT_EQ(gfx::Point(410, 500), points[22]);
-  EXPECT_EQ(gfx::Point(400, 500), points[23]);
-  EXPECT_EQ(gfx::Point(400, 490), points[24]);
-  EXPECT_EQ(gfx::Point(400, 410), points[25]);
-  EXPECT_EQ(gfx::Point(400, 400), points[26]);
-  EXPECT_EQ(gfx::Point(390, 400), points[27]);
-  EXPECT_EQ(gfx::Point(10, 400), points[28]);
-  EXPECT_EQ(gfx::Point(0, 400), points[29]);
-  EXPECT_EQ(gfx::Point(0, 390), points[30]);
-  EXPECT_EQ(gfx::Point(0, 110), points[31]);
-  EXPECT_EQ(gfx::Point(0, 100), points[32]);
-  EXPECT_EQ(gfx::Point(0, 100), points[33]);
-  EXPECT_EQ(gfx::Point(0, 100), points[34]);
-  EXPECT_EQ(gfx::Point(0, 100), points[35]);
+  EXPECT_EQ(gfx::Point(100, 190), points[0]);
+  EXPECT_EQ(gfx::Point(100, 110), points[1]);
+  EXPECT_EQ(gfx::Point(100, 100), points[2]);
+  EXPECT_EQ(gfx::Point(110, 100), points[3]);
+  EXPECT_EQ(gfx::Point(290, 100), points[4]);
+  EXPECT_EQ(gfx::Point(300, 100), points[5]);
+  EXPECT_EQ(gfx::Point(300, 110), points[6]);
+  EXPECT_EQ(gfx::Point(300, 190), points[7]);
+  EXPECT_EQ(gfx::Point(300, 200), points[8]);
+  EXPECT_EQ(gfx::Point(310, 200), points[9]);
+  EXPECT_EQ(gfx::Point(690, 200), points[10]);
+  EXPECT_EQ(gfx::Point(700, 200), points[11]);
+  EXPECT_EQ(gfx::Point(700, 210), points[12]);
+  EXPECT_EQ(gfx::Point(700, 490), points[13]);
+  EXPECT_EQ(gfx::Point(700, 500), points[14]);
+  EXPECT_EQ(gfx::Point(700, 500), points[15]);
+  EXPECT_EQ(gfx::Point(700, 500), points[16]);
+  EXPECT_EQ(gfx::Point(700, 500), points[17]);
+  EXPECT_EQ(gfx::Point(700, 510), points[18]);
+  EXPECT_EQ(gfx::Point(700, 590), points[19]);
+  EXPECT_EQ(gfx::Point(700, 600), points[20]);
+  EXPECT_EQ(gfx::Point(690, 600), points[21]);
+  EXPECT_EQ(gfx::Point(510, 600), points[22]);
+  EXPECT_EQ(gfx::Point(500, 600), points[23]);
+  EXPECT_EQ(gfx::Point(500, 590), points[24]);
+  EXPECT_EQ(gfx::Point(500, 510), points[25]);
+  EXPECT_EQ(gfx::Point(500, 500), points[26]);
+  EXPECT_EQ(gfx::Point(490, 500), points[27]);
+  EXPECT_EQ(gfx::Point(110, 500), points[28]);
+  EXPECT_EQ(gfx::Point(100, 500), points[29]);
+  EXPECT_EQ(gfx::Point(100, 490), points[30]);
+  EXPECT_EQ(gfx::Point(100, 210), points[31]);
+  EXPECT_EQ(gfx::Point(100, 200), points[32]);
+  EXPECT_EQ(gfx::Point(100, 200), points[33]);
+  EXPECT_EQ(gfx::Point(100, 200), points[34]);
+  EXPECT_EQ(gfx::Point(100, 200), points[35]);
 }
 
 }  // namespace ash
diff --git a/ash/app_list/app_list_presenter_delegate_unittest.cc b/ash/app_list/app_list_presenter_delegate_unittest.cc
index 06a4825..0ff2632 100644
--- a/ash/app_list/app_list_presenter_delegate_unittest.cc
+++ b/ash/app_list/app_list_presenter_delegate_unittest.cc
@@ -101,26 +101,23 @@
 
 }  // namespace
 
-class AppListPresenterDelegateTest : public AshTestBase,
-                                     public testing::WithParamInterface<bool> {
+class AppListPresenterDelegateZeroStateTest
+    : public AshTestBase,
+      public testing::WithParamInterface<bool> {
  public:
-  AppListPresenterDelegateTest() = default;
-  ~AppListPresenterDelegateTest() override = default;
+  AppListPresenterDelegateZeroStateTest() = default;
+  ~AppListPresenterDelegateZeroStateTest() override = default;
 
   // testing::Test:
   void SetUp() override {
     app_list::AppListView::SetShortAnimationForTesting(true);
     AshTestBase::SetUp();
 
-    // Zeros state changes expected UI behavior. Most test cases in this suite
-    // are the expected UI behavior with zero state being disabled.
-    // TODO(jennyz): Add new test cases for zero state, crbug.com/925195.
-    scoped_feature_list_.InitAndDisableFeature(
-        app_list_features::kEnableZeroStateSuggestions);
     // Make the display big enough to hold the app list.
     UpdateDisplay("1024x768");
   }
 
+  // testing::Test:
   void TearDown() override {
     AshTestBase::TearDown();
     app_list::AppListView::SetShortAnimationForTesting(false);
@@ -145,6 +142,27 @@
   }
 
  private:
+  DISALLOW_COPY_AND_ASSIGN(AppListPresenterDelegateZeroStateTest);
+};
+
+class AppListPresenterDelegateTest
+    : public AppListPresenterDelegateZeroStateTest {
+ public:
+  AppListPresenterDelegateTest() = default;
+  ~AppListPresenterDelegateTest() override = default;
+
+  // testing::Test:
+  void SetUp() override {
+    AppListPresenterDelegateZeroStateTest::SetUp();
+
+    // Zeros state changes expected UI behavior. Most test cases in this suite
+    // are the expected UI behavior with zero state being disabled.
+    // TODO(jennyz): Add new test cases for zero state, crbug.com/925195.
+    scoped_feature_list_.InitAndDisableFeature(
+        app_list_features::kEnableZeroStateSuggestions);
+  }
+
+ private:
   base::test::ScopedFeatureList scoped_feature_list_;
 
   DISALLOW_COPY_AND_ASSIGN(AppListPresenterDelegateTest);
@@ -213,6 +231,24 @@
 // the parameterized tests.
 INSTANTIATE_TEST_SUITE_P(, AppListPresenterDelegateTest, testing::Bool());
 
+// Verifies that context menu click should not activate the search box
+// (see https://crbug.com/941428).
+TEST_F(AppListPresenterDelegateZeroStateTest, RightClickSearchBoxInPeeking) {
+  GetAppListTestHelper()->ShowAndRunLoop(GetPrimaryDisplayId());
+  app_list::AppListView* app_list_view = GetAppListView();
+  gfx::Rect app_list_bounds = app_list_view->GetBoundsInScreen();
+  ASSERT_EQ(mojom::AppListViewState::kPeeking, app_list_view->app_list_state());
+
+  // Right click the search box and checks the following things:
+  // (1) AppListView's bounds in screen does not change.
+  // (2) AppListView is still in Peeking state.
+  ui::test::EventGenerator* generator = GetEventGenerator();
+  generator->MoveMouseTo(GetPointInsideSearchbox());
+  generator->PressRightButton();
+  EXPECT_EQ(app_list_bounds, app_list_view->GetBoundsInScreen());
+  EXPECT_EQ(mojom::AppListViewState::kPeeking, app_list_view->app_list_state());
+}
+
 TEST_F(PopulatedAppListTest, TappingAppsGridClosesVirtualKeyboard) {
   InitializeAppsGrid();
   app_list_test_model_->PopulateApps(2);
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc
index f9447659..fa9e1d4 100644
--- a/ash/app_list/views/search_box_view.cc
+++ b/ash/app_list/views/search_box_view.cc
@@ -254,6 +254,13 @@
   }
 
   UMA_HISTOGRAM_ENUMERATION("Apps.AppListSearchBoxActivated", activation_type);
+  if (is_tablet_mode()) {
+    UMA_HISTOGRAM_ENUMERATION("Apps.AppListSearchBoxActivated.TabletMode",
+                              activation_type);
+  } else {
+    UMA_HISTOGRAM_ENUMERATION("Apps.AppListSearchBoxActivated.ClamshellMode",
+                              activation_type);
+  }
 }
 
 void SearchBoxView::OnKeyEvent(ui::KeyEvent* event) {
diff --git a/ash/ash_service_unittest.cc b/ash/ash_service_unittest.cc
index 62a9fcac9..685be1a0 100644
--- a/ash/ash_service_unittest.cc
+++ b/ash/ash_service_unittest.cc
@@ -18,6 +18,7 @@
 #include "services/service_manager/public/cpp/manifest_builder.h"
 #include "services/service_manager/public/cpp/test/test_service.h"
 #include "services/service_manager/public/cpp/test/test_service_manager.h"
+#include "services/viz/public/cpp/manifest.h"
 #include "services/ws/public/cpp/property_type_converters.h"
 #include "services/ws/public/mojom/constants.mojom.h"
 #include "services/ws/public/mojom/window_manager.mojom.h"
@@ -84,7 +85,8 @@
              service_manager::ManifestBuilder()
                  .WithServiceName(kTestServiceName)
                  .RequireCapability(ws::mojom::kServiceName, "app")
-                 .Build()}),
+                 .Build(),
+             viz::GetManifest()}),
         test_service_(
             test_service_manager_.RegisterTestInstance(kTestServiceName)) {}
   ~AshServiceTest() override = default;
diff --git a/ash/autoclick/autoclick_controller.cc b/ash/autoclick/autoclick_controller.cc
index b6dab61..0e46ddc 100644
--- a/ash/autoclick/autoclick_controller.cc
+++ b/ash/autoclick/autoclick_controller.cc
@@ -183,7 +183,9 @@
 }
 
 void AutoclickController::DoAutoclickAction() {
-  aura::Window* root_window = wm::GetRootWindowAt(anchor_location_);
+  // The gesture_anchor_location_ is the position at which the animation is
+  // anchored, and where the click should occur.
+  aura::Window* root_window = wm::GetRootWindowAt(gesture_anchor_location_);
   DCHECK(root_window) << "Root window not found while attempting autoclick.";
 
   // But if the thing that would be acted upon is an autoclick menu button, do a
@@ -191,8 +193,9 @@
   // ensures that no matter the autoclick setting, users can always change to
   // another autoclick setting. By using a fake click we avoid closing dialogs
   // and menus, allowing autoclick users to interact with those items.
-  if (!DragInProgress() && AutoclickMenuContainsPoint(anchor_location_)) {
-    menu_bubble_controller_->ClickOnBubble(anchor_location_,
+  if (!DragInProgress() &&
+      AutoclickMenuContainsPoint(gesture_anchor_location_)) {
+    menu_bubble_controller_->ClickOnBubble(gesture_anchor_location_,
                                            mouse_event_flags_);
     // Reset UI.
     CancelAutoclickAction();
@@ -204,7 +207,7 @@
   mojom::AutoclickEventType in_progress_event_type = event_type_;
   RecordUserAction(in_progress_event_type);
 
-  gfx::Point location_in_pixels(anchor_location_);
+  gfx::Point location_in_pixels(gesture_anchor_location_);
   ::wm::ConvertPointFromScreen(root_window, &location_in_pixels);
   aura::WindowTreeHost* host = root_window->GetHost();
   host->ConvertDIPToPixels(&location_in_pixels);
@@ -283,7 +286,9 @@
     }
     // Otherwise, go ahead and start the gesture.
   }
-  // The anchor is always the point in the screen where the timer starts.
+  // The anchor is always the point in the screen where the timer starts, and is
+  // used to determine when the cursor has moved far enough to cancel the
+  // autoclick.
   anchor_location_ = gesture_anchor_location_;
   autoclick_ring_handler_->StartGesture(
       delay_ - CalculateStartGestureDelay(delay_), anchor_location_,
@@ -428,7 +433,7 @@
     } else if (autoclick_timer_->IsRunning() && !stabilize_click_position_) {
       // If we are not stabilizing the click position, update the gesture
       // center with each mouse move event.
-      anchor_location_ = point_in_screen;
+      gesture_anchor_location_ = point_in_screen;
       autoclick_ring_handler_->SetGestureCenter(point_in_screen, widget_.get());
     }
   } else if (event->type() == ui::ET_MOUSE_PRESSED ||
diff --git a/ash/autoclick/autoclick_unittest.cc b/ash/autoclick/autoclick_unittest.cc
index 508186e..3428638 100644
--- a/ash/autoclick/autoclick_unittest.cc
+++ b/ash/autoclick/autoclick_unittest.cc
@@ -232,9 +232,20 @@
   aura::Window::Windows root_windows = Shell::GetAllRootWindows();
   EXPECT_EQ(2u, root_windows.size());
 
-  // Try at a couple different thresholds.
-  for (int movement_threshold = 10; movement_threshold < 50;
-       movement_threshold += 10) {
+  int animation_delay = 5;
+
+  const struct {
+    int movement_threshold;
+    bool stabilize_click_position;
+  } kTestCases[] = {
+      {10, false}, {20, false}, {30, false}, {40, false}, {50, false},
+      {10, true},  {20, true},  {30, true},  {40, true},  {50, true},
+  };
+
+  for (const auto& test : kTestCases) {
+    GetAutoclickController()->set_stabilize_click_position(
+        test.stabilize_click_position);
+    int movement_threshold = test.movement_threshold;
     GetAutoclickController()->SetMovementThreshold(movement_threshold);
 
     // Run test for the secondary display too to test fix for crbug.com/449870.
@@ -243,6 +254,7 @@
 
       GetAutoclickController()->SetEnabled(true);
       GetEventGenerator()->MoveMouseTo(center);
+      ClearMouseEvents();
       EXPECT_EQ(2u, WaitForMouseEvents().size());
 
       // Small mouse movements should not trigger an autoclick, i.e. movements
@@ -265,11 +277,28 @@
           center +
           gfx::Vector2d(movement_threshold + 1, movement_threshold + 1));
       EXPECT_EQ(2u, WaitForMouseEvents().size());
+
+      // Moving outside the threshold after the gesture begins should cancel
+      // the autoclick. Update the delay so we can do events between the initial
+      // trigger of the feature and the click.
+      int full_delay = UpdateAnimationDelayAndGetFullDelay(animation_delay);
+      GetEventGenerator()->MoveMouseTo(
+          center - gfx::Vector2d(movement_threshold, movement_threshold));
+      FastForwardBy(animation_delay + 1);
+      GetEventGenerator()->MoveMouseTo(center);
+      ClearMouseEvents();
+      FastForwardBy(full_delay);
+      EXPECT_EQ(0u, GetMouseEvents().size());
+
+      // Move it out of the way so the next cycle starts properly.
+      GetEventGenerator()->MoveMouseTo(gfx::Point(0, 0));
+      GetAutoclickController()->SetAutoclickDelay(base::TimeDelta());
     }
   }
 
-  // Reset to default threshold.
+  // Reset to defaults.
   GetAutoclickController()->SetMovementThreshold(20);
+  GetAutoclickController()->set_stabilize_click_position(false);
 }
 
 TEST_F(AutoclickTest, MovementWithinThresholdWhileTimerRunning) {
diff --git a/ash/public/cpp/BUILD.gn b/ash/public/cpp/BUILD.gn
index 7907fb02..f67cce4 100644
--- a/ash/public/cpp/BUILD.gn
+++ b/ash/public/cpp/BUILD.gn
@@ -178,6 +178,7 @@
     "//ash/public/interfaces:interfaces_internal",
     "//base",
     "//chromeos/services/multidevice_setup/public/mojom",
+    "//chromeos/services/network_config/public/mojom",
     "//chromeos/services/power/public/mojom",
     "//services/content/public/mojom",
     "//services/data_decoder/public/mojom",
diff --git a/ash/public/cpp/manifest.cc b/ash/public/cpp/manifest.cc
index 55e57de..6dca609 100644
--- a/ash/public/cpp/manifest.cc
+++ b/ash/public/cpp/manifest.cc
@@ -44,6 +44,7 @@
 #include "ash/public/interfaces/wallpaper.mojom.h"
 #include "base/no_destructor.h"
 #include "chromeos/services/multidevice_setup/public/mojom/constants.mojom.h"
+#include "chromeos/services/network_config/public/mojom/constants.mojom.h"
 #include "chromeos/services/power/public/mojom/power_manager.mojom.h"
 #include "services/content/public/mojom/constants.mojom.h"
 #include "services/data_decoder/public/mojom/constants.mojom.h"
@@ -122,6 +123,9 @@
           .RequireCapability(device::mojom::kServiceName, "device:fingerprint")
           .RequireCapability(chromeos::multidevice_setup::mojom::kServiceName,
                              "multidevice_setup")
+          .RequireCapability(
+              chromeos::network_config::mojom::kServiceName,
+              chromeos::network_config::mojom::kNetworkConfigCapability)
           .PackageService(ws::GetManifest())
           .Build()
           .Amend(GetAmendmentForTesting())};
diff --git a/ash/shelf/shelf_view.cc b/ash/shelf/shelf_view.cc
index 3638db2..08e385b 100644
--- a/ash/shelf/shelf_view.cc
+++ b/ash/shelf/shelf_view.cc
@@ -2287,7 +2287,10 @@
 
 void ShelfView::ShelfItemDelegateChanged(const ShelfID& id,
                                          ShelfItemDelegate* old_delegate,
-                                         ShelfItemDelegate* delegate) {}
+                                         ShelfItemDelegate* delegate) {
+  if (id == context_menu_id_ && shelf_menu_model_adapter_)
+    shelf_menu_model_adapter_->Cancel();
+}
 
 void ShelfView::ShelfItemStatusChanged(const ShelfID& id) {
   int index = model_->ItemIndexByID(id);
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc
index b2d8aa87..5214fa7 100644
--- a/ash/shelf/shelf_view_unittest.cc
+++ b/ash/shelf/shelf_view_unittest.cc
@@ -194,6 +194,17 @@
   }
   void ExecuteCommand(bool, int64_t, int32_t, int64_t) override {}
   void Close() override {}
+  void GetContextMenuItems(int64_t display_id,
+                           GetContextMenuItemsCallback callback) override {
+    ash::MenuItemList items;
+    ash::mojom::MenuItemPtr item(ash::mojom::MenuItem::New());
+    item->type = ui::MenuModel::TYPE_COMMAND;
+    item->command_id = 0;
+    item->label = base::UTF8ToUTF16("Item");
+    item->enabled = true;
+    items.push_back(std::move(item));
+    std::move(callback).Run(std::move(items));
+  }
 
  private:
   size_t item_selected_count_ = 0;
@@ -2417,6 +2428,23 @@
   }
 }
 
+TEST_F(ShelfViewTest, ReplacingDelegateCancelsContextMenu) {
+  ui::test::EventGenerator* generator = GetEventGenerator();
+
+  ShelfID app_button_id = AddAppShortcut();
+  generator->MoveMouseTo(GetButtonCenter(GetButtonByID(app_button_id)));
+
+  // Right click should open the context menu.
+  generator->PressRightButton();
+  generator->ReleaseRightButton();
+  EXPECT_TRUE(shelf_view_->IsShowingMenu());
+
+  // Replacing the item delegate should close the context menu.
+  model_->SetShelfItemDelegate(app_button_id,
+                               std::make_unique<ShelfItemSelectionTracker>());
+  EXPECT_FALSE(shelf_view_->IsShowingMenu());
+}
+
 // Test class that tests both context and application menus.
 class ShelfViewMenuTest : public ShelfViewTest,
                           public testing::WithParamInterface<bool> {
diff --git a/ash/shell.cc b/ash/shell.cc
index a46c6e7..b80e81a 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -1261,7 +1261,7 @@
   // |system_tray_model_| should be available before
   // |system_notification_controller_| is initialized and Shelf is created by
   // WindowTreeHostManager::InitHosts.
-  system_tray_model_ = std::make_unique<SystemTrayModel>();
+  system_tray_model_ = std::make_unique<SystemTrayModel>(connector_);
   system_notification_controller_ =
       std::make_unique<SystemNotificationController>();
 
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb
index f04353a..7942282a 100644
--- a/ash/strings/ash_strings_es.xtb
+++ b/ash/strings/ash_strings_es.xtb
@@ -85,6 +85,7 @@
 <translation id="225680501294068881">Buscando dispositivos...</translation>
 <translation id="2268130516524549846">Bluetooth inhabilitado</translation>
 <translation id="2268813581635650749">Cerrar todas las sesiones</translation>
+<translation id="2277103315734023688">Ir hacia delante</translation>
 <translation id="2292698582925480719">Escala de pantalla</translation>
 <translation id="2302092602801625023">Esta cuenta se gestiona con Family Link</translation>
 <translation id="2303600792989757991">Activar descripción general de ventanas</translation>
@@ -164,6 +165,7 @@
 <translation id="3371140690572404006">Dispositivo USB tipo C (puerto frontal derecho)</translation>
 <translation id="3400357268283240774">Configuración adicional</translation>
 <translation id="3413817803639110246">Aún no hay contenido</translation>
+<translation id="343571671045587506">Editar recordatorio</translation>
 <translation id="3445925074670675829">Dispositivo USB-C</translation>
 <translation id="3454224730401036106">La conexión ha cambiado a una red más segura</translation>
 <translation id="3465223694362104965">Se ha conectado otro teclado a este dispositivo desde la última vez que iniciaste sesión. Antes de usarlo, asegúrate de que sea de confianza.</translation>
@@ -197,12 +199,14 @@
 <translation id="3900355044994618856">Tu sesión terminará en <ph name="SESSION_TIME_REMAINING" /></translation>
 <translation id="3901991538546252627">Conectando con: <ph name="NAME" /></translation>
 <translation id="394485226368336402">Configuración de audio</translation>
+<translation id="3962859241508114581">Pista anterior</translation>
 <translation id="397105322502079400">Calculando...</translation>
 <translation id="3995138139523574647">Dispositivo USB tipo C (puerto trasero derecho)</translation>
 <translation id="4017989525502048489">Puntero láser</translation>
 <translation id="4042660782729322247">Estás compartiendo tu pantalla</translation>
 <translation id="4065525899979931964">{NUM_APPS,plural, =1{Desactivadas para una aplicación}other{Desactivadas para # aplicaciones}}</translation>
 <translation id="4072264167173457037">Señal media</translation>
+<translation id="4112140312785995938">Ir hacia atrás</translation>
 <translation id="4129129681837227511">Para poder ver las notificaciones desde la pantalla de bloqueo, desbloquea el dispositivo para cambiar este ajuste</translation>
 <translation id="4146833061457621061">Pon música</translation>
 <translation id="4181841719683918333">Idiomas</translation>
@@ -226,6 +230,7 @@
 <translation id="4421231901400348175">Compartiendo control de la pantalla con <ph name="HELPER_NAME" /> a través de Asistencia remota.</translation>
 <translation id="4430019312045809116">Volumen</translation>
 <translation id="4450893287417543264">No volver a mostrar</translation>
+<translation id="4477350412780666475">Pista siguiente</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Dispositivos desvinculados</translation>
 <translation id="4508225577814909926"><ph name="NAME" />: conectando...</translation>
@@ -390,6 +395,7 @@
 <translation id="7222902781030499995">Detener temporizador</translation>
 <translation id="7256634071279256947">Micrófono trasero</translation>
 <translation id="726276584504105859">Arrastra hasta aquí para utilizar la pantalla dividida</translation>
+<translation id="7262906531272962081">Crear recordatorio</translation>
 <translation id="7303365578352795231">Se está respondiendo en otro dispositivo.</translation>
 <translation id="7305884605064981971">EDGE</translation>
 <translation id="7348093485538360975">Teclado en pantalla</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb
index a5987177..997e7b99 100644
--- a/ash/strings/ash_strings_fil.xtb
+++ b/ash/strings/ash_strings_fil.xtb
@@ -85,6 +85,7 @@
 <translation id="225680501294068881">Nag-i-scan para sa mga device...</translation>
 <translation id="2268130516524549846">Hindi pinagana ang Bluetooth</translation>
 <translation id="2268813581635650749">I-sign out ang lahat</translation>
+<translation id="2277103315734023688">Mag-seek Pasulong</translation>
 <translation id="2292698582925480719">Scale ng display</translation>
 <translation id="2302092602801625023">Pinapamahalaan ng Family Link ang account na ito</translation>
 <translation id="2303600792989757991">I-toggle ang window ng pangkalahatang-ideya</translation>
@@ -164,6 +165,7 @@
 <translation id="3371140690572404006">USB-C device (port sa kanang bahagi sa harap)</translation>
 <translation id="3400357268283240774">Mga karagdagang setting</translation>
 <translation id="3413817803639110246">Wala pang makikita</translation>
+<translation id="343571671045587506">Mag-edit ng paalala</translation>
 <translation id="3445925074670675829">USB-C device</translation>
 <translation id="3454224730401036106">Lumipat ang iyong koneksyon sa mas secure na network</translation>
 <translation id="3465223694362104965">May isa pang keyboard na kumonekta sa device na ito mula noong huling beses kang nag-sign in. Tiyaking pinagkakatiwalaan mo ang keyboard na ito bago mo ito gamitin.</translation>
@@ -196,12 +198,14 @@
 <translation id="3900355044994618856">Matatapos ang iyong session sa loob ng <ph name="SESSION_TIME_REMAINING" /></translation>
 <translation id="3901991538546252627">Kumokonekta sa <ph name="NAME" /></translation>
 <translation id="394485226368336402">Mga setting ng audio</translation>
+<translation id="3962859241508114581">Nakaraang Track</translation>
 <translation id="397105322502079400">Kinakalkula...</translation>
 <translation id="3995138139523574647">USB-C device (port sa kanang bahagi sa likod)</translation>
 <translation id="4017989525502048489">Laser pointer</translation>
 <translation id="4042660782729322247">Ibinabahagi mo ang iyong screen</translation>
 <translation id="4065525899979931964">{NUM_APPS,plural, =1{Naka-off para sa isang app}one{Naka-off para sa # app}other{Naka-off para sa # na app}}</translation>
 <translation id="4072264167173457037">Katamtaman ang signal</translation>
+<translation id="4112140312785995938">Mag-seek Pabalik</translation>
 <translation id="4129129681837227511">Para makakita ng mga notification sa iyong screen ng lock, i-unlock para baguhin ang setting</translation>
 <translation id="4146833061457621061">Mag-play ng musika</translation>
 <translation id="4181841719683918333">Mga Wika</translation>
@@ -225,6 +229,7 @@
 <translation id="4421231901400348175">Pagbabahagi ng kontrol sa iyong screen gamit ang <ph name="HELPER_NAME" /> sa pamamagitan ng Remote Assistance.</translation>
 <translation id="4430019312045809116">Volume</translation>
 <translation id="4450893287417543264">Huwag ipakitang muli</translation>
+<translation id="4477350412780666475">Susunod na Track</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Mga hindi nakapares na device</translation>
 <translation id="4508225577814909926"><ph name="NAME" />: Kumokonekta...</translation>
@@ -389,6 +394,7 @@
 <translation id="7222902781030499995">Ihinto ang timer</translation>
 <translation id="7256634071279256947">Mikropono sa likod</translation>
 <translation id="726276584504105859">I-drag dito upang magamit ang split screen</translation>
+<translation id="7262906531272962081">Gumawa ng paalala</translation>
 <translation id="7303365578352795231">Sinasagot sa ibang device.</translation>
 <translation id="7305884605064981971">EDGE</translation>
 <translation id="7348093485538360975">Nasa screen na keyboard</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb
index 424101b..f0c7b80 100644
--- a/ash/strings/ash_strings_hi.xtb
+++ b/ash/strings/ash_strings_hi.xtb
@@ -10,7 +10,7 @@
 <translation id="109942774857561566">मुझे बोरियत हो रही है</translation>
 <translation id="1104084341931202936">सुलभता सेटिंग दिखाएं</translation>
 <translation id="1104621072296271835">साथ मिलकर आपके डिवाइस और बेहतर काम करते हैं</translation>
-<translation id="112308213915226829">अलमारी को स्वत: छिपाएं</translation>
+<translation id="112308213915226829">अलमारी कोअपने-आपछिपाएं</translation>
 <translation id="1153356358378277386">युग्‍मित डिवाइस</translation>
 <translation id="1178581264944972037">रोकें</translation>
 <translation id="1195412055398077112">ओवरस्कैन</translation>
@@ -63,7 +63,7 @@
 <translation id="1882897271359938046"><ph name="DISPLAY_NAME" /> पर स्क्रीन शेयर कर रहा है</translation>
 <translation id="1885785240814121742">फ़िंगरप्रिंट से अनलॉक करें</translation>
 <translation id="1919743966458266018">काम के प्रबंधक को खोलने का शॉर्टकट बदल गया है. कृपया <ph name="OLD_SHORTCUT" /> के बजाय <ph name="NEW_SHORTCUT" /> का उपयोग करें.</translation>
-<translation id="1923539912171292317">स्वत: क्‍लिक</translation>
+<translation id="1923539912171292317">अपने-आपक्‍लिक</translation>
 <translation id="1928739107511554905">अपडेट पाने के लिए, अटैच किए गए कीबोर्ड से अपने Chromebook को रीस्टार्ट करने के लिए टचस्क्रीन का इस्तेमाल करें.</translation>
 <translation id="1951012854035635156">सहायक</translation>
 <translation id="1957803754585243749">0°</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb
index d8583bc..4412fea01 100644
--- a/ash/strings/ash_strings_ml.xtb
+++ b/ash/strings/ash_strings_ml.xtb
@@ -85,6 +85,7 @@
 <translation id="225680501294068881">ഉപകരണങ്ങൾക്കായി സ്‌കാൻ ചെയ്യുന്നു...</translation>
 <translation id="2268130516524549846">Bluetooth അപ്രാപ്‌തമാക്കി</translation>
 <translation id="2268813581635650749">എല്ലാം സൈൻ ഔട്ട് ചെയ്യുക</translation>
+<translation id="2277103315734023688">മുന്നോട്ട് നീക്കുക</translation>
 <translation id="2292698582925480719">ഡിസ്പ്ലേ സ്കെയിൽ</translation>
 <translation id="2302092602801625023">ഈ അക്കൗണ്ട് Family Link ഉപയോഗിച്ച് മാനേജ് ചെയ്യുന്നു</translation>
 <translation id="2303600792989757991">വിൻഡോ ചുരുക്കവിവരണം ടോഗിൾ ചെയ്യുക</translation>
@@ -164,6 +165,7 @@
 <translation id="3371140690572404006">USB-C ഉപകരണം (വലതുവശത്ത് മുന്നിലെ പോർട്ട്)</translation>
 <translation id="3400357268283240774">അധിക ക്രമീകരണങ്ങൾ</translation>
 <translation id="3413817803639110246">ഇതുവരെ കാണാൻ ഒന്നുമില്ല</translation>
+<translation id="343571671045587506">റിമൈൻഡർ എഡിറ്റ് ചെയ്യുക</translation>
 <translation id="3445925074670675829">USB-C ഉപകരണം</translation>
 <translation id="3454224730401036106">കൂടുതൽ സുരക്ഷിതമായൊരു നെറ്റ്‌വർക്കിലേക്ക് നിങ്ങളുടെ കണക്ഷൻ മാറ്റിയിരിക്കുന്നു</translation>
 <translation id="3465223694362104965">നിങ്ങൾ അവസാനമായി സൈൻ ഇൻ ചെയ്‌തതിന് ശേഷം ഈ ഉപകരണത്തിലേക്ക് മറ്റൊരു കീബോഡ് കണക്‌റ്റ് ചെയ്‌തിരിക്കുന്നു. ഉപയോഗിക്കുന്നതിന് മുമ്പായി, വിശ്വസിക്കാനാവുന്ന കീബോഡാണ് ഇതെന്ന് ഉറപ്പ് വരുത്തുക.</translation>
@@ -196,12 +198,14 @@
 <translation id="3900355044994618856"><ph name="SESSION_TIME_REMAINING" />-ൽ നിങ്ങളുടെ സെഷൻ അവസാനിക്കുന്നു</translation>
 <translation id="3901991538546252627"><ph name="NAME" /> എന്നതിലേക്ക് കണക്റ്റുചെയ്യുന്നു</translation>
 <translation id="394485226368336402">ഓഡിയോ ക്രമീകരണം</translation>
+<translation id="3962859241508114581">മുമ്പത്തെ ട്രാക്ക്</translation>
 <translation id="397105322502079400">കണക്കാക്കുന്നു...</translation>
 <translation id="3995138139523574647">USB-C ഉപകരണം (വലതുവശത്തെ പിന്നിലെ പോർട്ട്)</translation>
 <translation id="4017989525502048489">ലേസർ പോയിന്റർ</translation>
 <translation id="4042660782729322247">നിങ്ങൾ സ്‌ക്രീൻ പങ്കിടുന്നു</translation>
 <translation id="4065525899979931964">{NUM_APPS,plural, =1{ഒരു ആപ്പിൽ നിന്നുള്ള അറിയിപ്പുകൾ ഓഫാണ്}other{# ആപ്പുകളിൽ നിന്നുള്ള അറിയിപ്പുകൾ ഓഫാണ്}}</translation>
 <translation id="4072264167173457037">ഇടത്തരം സിഗ്നൽ</translation>
+<translation id="4112140312785995938">പുറകിലേക്ക് നീക്കുക</translation>
 <translation id="4129129681837227511">നിങ്ങളുടെ ലോക്ക് സ്‌ക്രീനിൽ അറിയിപ്പുകൾ കാണാൻ, ക്രമീകരണം മാറ്റാനായി അൺലോക്ക് ചെയ്യുക</translation>
 <translation id="4146833061457621061">സംഗീതം പ്ലേ ചെയ്യുക</translation>
 <translation id="4181841719683918333">ഭാഷകൾ‌</translation>
@@ -225,6 +229,7 @@
 <translation id="4421231901400348175"><ph name="HELPER_NAME" /> ഉപയോഗിച്ച് നിങ്ങളുടെ വിദൂര സഹായി മുഖേന സ്‌ക്രീനിന്റെ നിയന്ത്രണം പങ്കിടുക.</translation>
 <translation id="4430019312045809116">അളവ്</translation>
 <translation id="4450893287417543264">വീണ്ടും കാണിക്കരുത്</translation>
+<translation id="4477350412780666475">അടുത്ത ട്രാക്ക്</translation>
 <translation id="4479639480957787382">എതെര്‍‌നെറ്റ്</translation>
 <translation id="4481530544597605423">ജോടി മാറ്റിയ ഉപകരണങ്ങൾ</translation>
 <translation id="4508225577814909926"><ph name="NAME" />: കണക്റ്റുചെയ്യുന്നു...</translation>
@@ -389,6 +394,7 @@
 <translation id="7222902781030499995">ടൈമര്‍ നിര്‍ത്തുക</translation>
 <translation id="7256634071279256947">പിൻഭാഗത്തെ മൈക്രോഫോൺ</translation>
 <translation id="726276584504105859">സ്പ്ലിറ്റ് സ്ക്രീൻ ഉപയോഗിക്കുന്നതിന് ഇവിടെ വലിച്ചിടുക</translation>
+<translation id="7262906531272962081">റിമൈൻഡർ സൃഷ്‌ടിക്കുക</translation>
 <translation id="7303365578352795231">മറ്റൊരു ഉപകരണത്തിൽ മറുപടി നൽകുന്നു.</translation>
 <translation id="7305884605064981971">EDGE</translation>
 <translation id="7348093485538360975">ഓൺ-സ്‌ക്രീൻ കീബോർഡ്</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb
index dc226566e..6b82bda 100644
--- a/ash/strings/ash_strings_no.xtb
+++ b/ash/strings/ash_strings_no.xtb
@@ -85,6 +85,7 @@
 <translation id="225680501294068881">Leter etter enheter ...</translation>
 <translation id="2268130516524549846">Bluetooth er deaktivert</translation>
 <translation id="2268813581635650749">Logg alle av</translation>
+<translation id="2277103315734023688">Spol fremover</translation>
 <translation id="2292698582925480719">Visningsskala</translation>
 <translation id="2302092602801625023">Denne kontoen er administrert av Family Link</translation>
 <translation id="2303600792989757991">Vis eller skjul vindusoversikten</translation>
@@ -164,6 +165,7 @@
 <translation id="3371140690572404006">USB-C-enhet (porten foran på høyre side)</translation>
 <translation id="3400357268283240774">Flere innstillinger</translation>
 <translation id="3413817803639110246">Ingenting å se ennå</translation>
+<translation id="343571671045587506">Endre påminnelsen</translation>
 <translation id="3445925074670675829">USB-C-enhet</translation>
 <translation id="3454224730401036106">Tilkoblingen din er byttet til et sikrere nettverk</translation>
 <translation id="3465223694362104965">Et annet tastatur er koblet til denne enheten siden du sist logget på. Sørg for at du stoler på dette tastaturet før du bruker det.</translation>
@@ -196,12 +198,14 @@
 <translation id="3900355044994618856">Økten din avsluttes om <ph name="SESSION_TIME_REMAINING" /></translation>
 <translation id="3901991538546252627">Kobler til <ph name="NAME" /></translation>
 <translation id="394485226368336402">Lydinnstillinger</translation>
+<translation id="3962859241508114581">Forrige spor</translation>
 <translation id="397105322502079400">Beregner …</translation>
 <translation id="3995138139523574647">USB-C-enhet (porten bak på høyre side)</translation>
 <translation id="4017989525502048489">Laserpeker</translation>
 <translation id="4042660782729322247">Du deler skjermen din</translation>
 <translation id="4065525899979931964">{NUM_APPS,plural, =1{Slått av for en app}other{Slått av for # apper}}</translation>
 <translation id="4072264167173457037">Middels sterkt signal</translation>
+<translation id="4112140312785995938">Spol bakover</translation>
 <translation id="4129129681837227511">For å se varsler på låseskjermen, lås opp for å endre innstillingen</translation>
 <translation id="4146833061457621061">Spill av musikk</translation>
 <translation id="4181841719683918333">Språk</translation>
@@ -225,6 +229,7 @@
 <translation id="4421231901400348175">Deler kontroll av skjermen med <ph name="HELPER_NAME" /> via fjernhjelp.</translation>
 <translation id="4430019312045809116">Volum</translation>
 <translation id="4450893287417543264">Ikke vis igjen</translation>
+<translation id="4477350412780666475">Neste spor</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Frakoblede enheter</translation>
 <translation id="4508225577814909926"><ph name="NAME" />: kobler til ...</translation>
@@ -389,6 +394,7 @@
 <translation id="7222902781030499995">Stopp nedtellingen</translation>
 <translation id="7256634071279256947">Mikrofon bak</translation>
 <translation id="726276584504105859">Dra hit for å bruke delt skjerm</translation>
+<translation id="7262906531272962081">Opprett en påminnelse</translation>
 <translation id="7303365578352795231">Svarer på en annen enhet</translation>
 <translation id="7305884605064981971">EDGE</translation>
 <translation id="7348093485538360975">Skjermtastatur</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb
index 2ae57d7..6f23c2a 100644
--- a/ash/strings/ash_strings_ru.xtb
+++ b/ash/strings/ash_strings_ru.xtb
@@ -85,6 +85,7 @@
 <translation id="225680501294068881">Поиск устройств…</translation>
 <translation id="2268130516524549846">Bluetooth отключен</translation>
 <translation id="2268813581635650749">Выйти из всех аккаунтов</translation>
+<translation id="2277103315734023688">Перемотать вперед</translation>
 <translation id="2292698582925480719">Масштаб экрана</translation>
 <translation id="2302092602801625023">Аккаунт находится под управлением Family Link</translation>
 <translation id="2303600792989757991">Переключить режим обзора</translation>
@@ -164,6 +165,7 @@
 <translation id="3371140690572404006">Устройство USB-C (ближний порт справа)</translation>
 <translation id="3400357268283240774">Дополнительные настройки</translation>
 <translation id="3413817803639110246">Уведомлений нет.</translation>
+<translation id="343571671045587506">Изменить напоминание</translation>
 <translation id="3445925074670675829">Устройство USB-C</translation>
 <translation id="3454224730401036106">Вы были подключены к более безопасной сети.</translation>
 <translation id="3465223694362104965">После того как вы вошли в систему, к устройству была подключена другая клавиатура. Убедитесь, что ее использование безопасно.</translation>
@@ -196,12 +198,14 @@
 <translation id="3900355044994618856">Сеанс закончится через <ph name="SESSION_TIME_REMAINING" /></translation>
 <translation id="3901991538546252627">Подключение к <ph name="NAME" /></translation>
 <translation id="394485226368336402">Настройки звука</translation>
+<translation id="3962859241508114581">Предыдущий трек</translation>
 <translation id="397105322502079400">Вычисление…</translation>
 <translation id="3995138139523574647">Устройство USB-C (дальний порт справа)</translation>
 <translation id="4017989525502048489">Лазерная указка</translation>
 <translation id="4042660782729322247">Вы открыли доступ к своему экрану</translation>
 <translation id="4065525899979931964">{NUM_APPS,plural, =1{Отключить уведомления для 1 приложения}one{Отключить уведомления для # приложения}few{Отключить уведомления для # приложений}many{Отключить уведомления для # приложений}other{Отключить уведомления для # приложения}}</translation>
 <translation id="4072264167173457037">сигнал средней мощности</translation>
+<translation id="4112140312785995938">Перемотать назад</translation>
 <translation id="4129129681837227511">Чтобы разрешить показ уведомлений на заблокированном экране, разблокируйте устройство, а затем измените эту настройку.</translation>
 <translation id="4146833061457621061">Включить музыку</translation>
 <translation id="4181841719683918333">Языки</translation>
@@ -225,6 +229,7 @@
 <translation id="4421231901400348175">Доступ к экрану для <ph name="HELPER_NAME" /> с помощью удаленного помощника</translation>
 <translation id="4430019312045809116">Объем</translation>
 <translation id="4450893287417543264">Больше не показывать</translation>
+<translation id="4477350412780666475">Следующий трек</translation>
 <translation id="4479639480957787382">Ethernet</translation>
 <translation id="4481530544597605423">Отключенные устройства</translation>
 <translation id="4508225577814909926"><ph name="NAME" />: соединение...</translation>
@@ -389,6 +394,7 @@
 <translation id="7222902781030499995">Остановить таймер</translation>
 <translation id="7256634071279256947">Основной микрофон</translation>
 <translation id="726276584504105859">Перетащите сюда, чтобы разделить экран</translation>
+<translation id="7262906531272962081">Создать напоминание</translation>
 <translation id="7303365578352795231">Ассистент отвечает на другом устройстве.</translation>
 <translation id="7305884605064981971">EDGE</translation>
 <translation id="7348093485538360975">Экранная клавиатура</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb
index 6b76d53..5409fe9 100644
--- a/ash/strings/ash_strings_ta.xtb
+++ b/ash/strings/ash_strings_ta.xtb
@@ -490,7 +490,7 @@
 <translation id="8828714802988429505">90°</translation>
 <translation id="8843682306134542540">சுழற்சிப் பூட்டை நிலைமாற்றும். <ph name="STATE_TEXT" /></translation>
 <translation id="8850991929411075241">தேடல்+Esc</translation>
-<translation id="8870509716567206129">திரையைப் பிரிப்பதைப் பயன்பாடு ஆதரிக்கவில்லை.</translation>
+<translation id="8870509716567206129">திரையைப் பிரிப்பதைப் ஆப்ஸ் ஆதரிக்கவில்லை.</translation>
 <translation id="8874184842967597500">இணைக்கப்படவில்லை</translation>
 <translation id="8877788021141246043">நினைவூட்டலை அமை</translation>
 <translation id="8878886163241303700">திரையை விரிவாக்குகிறது</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb
index 436fb6f..78e1eee 100644
--- a/ash/strings/ash_strings_te.xtb
+++ b/ash/strings/ash_strings_te.xtb
@@ -85,6 +85,7 @@
 <translation id="225680501294068881">పరికరాల కోసం స్కాన్ చేస్తోంది...</translation>
 <translation id="2268130516524549846">Bluetooth నిలిపివేయబడింది</translation>
 <translation id="2268813581635650749">అందరినీ సైన్ అవుట్ చేయి</translation>
+<translation id="2277103315734023688">ముందుకు జరుపు</translation>
 <translation id="2292698582925480719">ప్రదర్శన ప్రమాణం</translation>
 <translation id="2302092602801625023">ఈ ఖాతా Family Link ద్వారా నిర్వహించబడుతుంది</translation>
 <translation id="2303600792989757991">విండో స్థూలదృష్టిని టోగుల్ చేయి</translation>
@@ -164,6 +165,7 @@
 <translation id="3371140690572404006">USB-C పరికరం (కుడివైపు ముందు పోర్ట్)</translation>
 <translation id="3400357268283240774">అదనపు సెట్టింగ్‌లు</translation>
 <translation id="3413817803639110246">ఇప్పటికీ చూడటానికి ఏమీ లేవు</translation>
+<translation id="343571671045587506">రిమైండర్‌ను సవరించండి</translation>
 <translation id="3445925074670675829">USB-C పరికరం</translation>
 <translation id="3454224730401036106">మీ కనెక్షన్ మరింత సురక్షితమైన నెట్‌వర్క్‌కు మార్చబడింది</translation>
 <translation id="3465223694362104965">మీరు చివరిగా సైన్ ఇన్ చేసిన తర్వాత ఈ పరికరానికి మరొక కీబోర్డ్ కనెక్ట్ చేయబడింది. మీరు ఈ కీబోర్డ్‌ను ఉపయోగించే ముందు దీనిని మీరు విశ్వసిస్తున్నట్లు నిర్ధారించుకోండి.</translation>
@@ -197,12 +199,14 @@
 <translation id="3900355044994618856"><ph name="SESSION_TIME_REMAINING" /> తర్వాత మీ సెషన్ ముగుస్తుంది</translation>
 <translation id="3901991538546252627"><ph name="NAME" />కి కనెక్ట్ చేస్తోంది</translation>
 <translation id="394485226368336402">ఆడియో సెట్టింగ్‌‍లు</translation>
+<translation id="3962859241508114581">మునుపటి ట్రాక్</translation>
 <translation id="397105322502079400">గణిస్తోంది...</translation>
 <translation id="3995138139523574647">USB-C పరికరం (కుడివైపు వెనుక పోర్ట్)</translation>
 <translation id="4017989525502048489">లేజర్ పాయింటర్</translation>
 <translation id="4042660782729322247">మీరు మీ స్క్రీన్‌ను షేర్ చేస్తున్నారు</translation>
 <translation id="4065525899979931964">{NUM_APPS,plural, =1{ఒక యాప్‌కు ఆఫ్‌లో ఉంది}other{# యాప్‌లకు ఆఫ్‌లో ఉంది}}</translation>
 <translation id="4072264167173457037">సిగ్నల్ ఓ మోస్తరుగా ఉంది</translation>
+<translation id="4112140312785995938">వెనుకకు జరుపు</translation>
 <translation id="4129129681837227511">మీ లాక్ స్క్రీన్‌లో నోటిఫికేషన్‌లను చూడటానికి, సెట్టింగ్‌ను మార్చేందుకు అన్‌లాక్ చేయండి</translation>
 <translation id="4146833061457621061">సంగీతాన్ని ప్లే చేయి</translation>
 <translation id="4181841719683918333">భాషలు</translation>
@@ -226,6 +230,7 @@
 <translation id="4421231901400348175">రిమోట్ సహాయం విధానంలో మీ స్క్రీన్ నియంత్రణ <ph name="HELPER_NAME" />కి భాగస్వామ్యం చేయబడుతోంది.</translation>
 <translation id="4430019312045809116">వాల్యూమ్</translation>
 <translation id="4450893287417543264">మళ్లీ చూపవద్దు</translation>
+<translation id="4477350412780666475">తర్వాతి ట్రాక్</translation>
 <translation id="4479639480957787382">ఈథర్నెట్</translation>
 <translation id="4481530544597605423">జతను తీసివేసిన పరికరాలు</translation>
 <translation id="4508225577814909926"><ph name="NAME" />: కనెక్ట్ అవుతోంది...</translation>
@@ -390,6 +395,7 @@
 <translation id="7222902781030499995">టైమర్‌ను ఆపివేయి</translation>
 <translation id="7256634071279256947">వెనుకవైపు మైక్రోఫోన్</translation>
 <translation id="726276584504105859">విభజన స్క్రీన్‌ను ఉపయోగించడానికి ఇక్కడికి లాగండి</translation>
+<translation id="7262906531272962081">రిమైండర్‌ను సృష్టించండి</translation>
 <translation id="7303365578352795231">మరొక పరికరంలో సమాధానం ఇవ్వబడుతోంది.</translation>
 <translation id="7305884605064981971">EDGE</translation>
 <translation id="7348093485538360975">ఆన్-స్క్రీన్ కీబోర్డ్</translation>
diff --git a/ash/system/message_center/message_center_style.h b/ash/system/message_center/message_center_style.h
index 2b4d6a47..cc1c45d 100644
--- a/ash/system/message_center/message_center_style.h
+++ b/ash/system/message_center/message_center_style.h
@@ -29,6 +29,10 @@
 constexpr SkColor kSwipeControlBackgroundColor =
     SkColorSetRGB(0xee, 0xee, 0xee);
 
+// The ratio to multiply with the swipe control width to get the width to
+// display at full opacity when swiping.
+constexpr float kSwipeControlFullOpacityRatio = 1.5f;
+
 }  // namespace message_center_style
 
 }  // namespace ash
diff --git a/ash/system/message_center/notification_swipe_control_view.cc b/ash/system/message_center/notification_swipe_control_view.cc
index 519626b..f00022b 100644
--- a/ash/system/message_center/notification_swipe_control_view.cc
+++ b/ash/system/message_center/notification_swipe_control_view.cc
@@ -88,6 +88,19 @@
       message_center_style::kSwipeControlButtonHorizontalMargin *
           (control_button_count + 1);
   message_view_->SetSlideButtonWidth(control_button_width);
+
+  // Update opacity based on the swipe progress. The swipe controls should
+  // gradually disappear as the user swipes the notification away.
+  float full_opacity_width =
+      message_center_style::kSwipeControlFullOpacityRatio *
+      control_button_width;
+  float fade_out_width = message_view_->width() - full_opacity_width;
+  DCHECK(fade_out_width > 0);
+  float swipe_progress = std::max(
+      0.0f, (fabs(gesture_amount) - full_opacity_width) / fade_out_width);
+  float opacity = std::max(0.0f, 1.0f - swipe_progress);
+
+  layer()->SetOpacity(opacity);
 }
 
 void NotificationSwipeControlView::UpdateCornerRadius(int top_radius,
diff --git a/ash/system/message_center/unified_message_list_view.cc b/ash/system/message_center/unified_message_list_view.cc
index 0431c12..098eee2 100644
--- a/ash/system/message_center/unified_message_list_view.cc
+++ b/ash/system/message_center/unified_message_list_view.cc
@@ -157,6 +157,10 @@
     control_view_->UpdateButtonsVisibility();
   }
 
+  void OnSlideOut(const std::string& notification_id) override {
+    is_slid_out_by_user_ = true;
+  }
+
   gfx::Rect start_bounds() const { return start_bounds_; }
   gfx::Rect ideal_bounds() const { return ideal_bounds_; }
   bool is_removed() const { return is_removed_; }
@@ -171,6 +175,8 @@
 
   void set_is_removed() { is_removed_ = true; }
 
+  bool is_slid_out_by_user() { return is_slid_out_by_user_; }
+
  private:
   // The bounds that the container starts animating from. If not animating, it's
   // ignored.
@@ -184,6 +190,9 @@
   // Unused if |state_| is not SLIDE_OUT.
   bool is_removed_ = false;
 
+  // True if the notification is slid out completely by the user.
+  bool is_slid_out_by_user_ = false;
+
   MessageView* const message_view_;
   NotificationSwipeControlView* const control_view_;
 
@@ -334,9 +343,12 @@
   if (child)
     child->set_is_removed();
 
+  if (child->is_slid_out_by_user())
+    DeleteRemovedNotifications();
+
   UpdateBounds();
 
-  state_ = State::SLIDE_OUT;
+  state_ = child->is_slid_out_by_user() ? State::MOVE_DOWN : State::SLIDE_OUT;
   StartAnimation();
 }
 
diff --git a/ash/system/message_center/unified_message_list_view_unittest.cc b/ash/system/message_center/unified_message_list_view_unittest.cc
index 84655b3..1d7c582 100644
--- a/ash/system/message_center/unified_message_list_view_unittest.cc
+++ b/ash/system/message_center/unified_message_list_view_unittest.cc
@@ -512,4 +512,29 @@
   EXPECT_EQ(1u, message_list_view()->children().size());
 }
 
+TEST_F(UnifiedMessageListViewTest, UserSwipesAwayNotification) {
+  // Show message list with two notifications.
+  AddNotification();
+  AddNotification();
+  CreateMessageListView();
+
+  // Start swiping the notification away.
+  GetMessageViewAt(1)->OnSlideStarted();
+  GetMessageViewAt(1)->OnSlideChanged(true);
+  EXPECT_EQ(2u, MessageCenter::Get()->GetVisibleNotifications().size());
+  EXPECT_EQ(2u, message_list_view()->children().size());
+
+  // Swiping away the notification should remove it both in the MessageCenter
+  // and the MessageListView.
+  GetMessageViewAt(1)->OnSlideOut();
+  EXPECT_EQ(1u, MessageCenter::Get()->GetVisibleNotifications().size());
+  EXPECT_EQ(1u, message_list_view()->children().size());
+
+  // The next and only animation should be the move down animation.
+  int previous_height = message_list_view()->GetPreferredSize().height();
+  AnimateToEnd();
+  EXPECT_GT(previous_height, message_list_view()->GetPreferredSize().height());
+  EXPECT_FALSE(message_list_view()->IsAnimating());
+}
+
 }  // namespace ash
diff --git a/ash/system/model/system_tray_model.cc b/ash/system/model/system_tray_model.cc
index 8d0f44f..329fa1bd 100644
--- a/ash/system/model/system_tray_model.cc
+++ b/ash/system/model/system_tray_model.cc
@@ -20,7 +20,7 @@
 
 namespace ash {
 
-SystemTrayModel::SystemTrayModel()
+SystemTrayModel::SystemTrayModel(service_manager::Connector* connector)
     : clock_(std::make_unique<ClockModel>()),
       enterprise_domain_(std::make_unique<EnterpriseDomainModel>()),
       locale_(std::make_unique<LocaleModel>()),
@@ -28,7 +28,7 @@
       tracing_(std::make_unique<TracingModel>()),
       update_model_(std::make_unique<UpdateModel>()),
       virtual_keyboard_(std::make_unique<VirtualKeyboardModel>()),
-      active_network_icon_(std::make_unique<ActiveNetworkIcon>()) {}
+      active_network_icon_(std::make_unique<ActiveNetworkIcon>(connector)) {}
 
 SystemTrayModel::~SystemTrayModel() = default;
 
diff --git a/ash/system/model/system_tray_model.h b/ash/system/model/system_tray_model.h
index 7a5d70aa..d683e2b6 100644
--- a/ash/system/model/system_tray_model.h
+++ b/ash/system/model/system_tray_model.h
@@ -11,6 +11,10 @@
 #include "base/macros.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 
+namespace service_manager {
+class Connector;
+}
+
 namespace ash {
 
 class ActiveNetworkIcon;
@@ -25,7 +29,7 @@
 // Top level model of SystemTray.
 class SystemTrayModel : public mojom::SystemTray {
  public:
-  SystemTrayModel();
+  explicit SystemTrayModel(service_manager::Connector* connector);
   ~SystemTrayModel() override;
 
   // Binds the mojom::SystemTray interface to this object.
diff --git a/ash/system/network/DEPS b/ash/system/network/DEPS
index 5db7abc8..d694822 100644
--- a/ash/system/network/DEPS
+++ b/ash/system/network/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+chromeos/services/network_config/public",
   "+components/device_event_log",
   "+components/onc",
   "+third_party/cros_system_api",
diff --git a/ash/system/network/active_network_icon.cc b/ash/system/network/active_network_icon.cc
index fb0d801f..3643456 100644
--- a/ash/system/network/active_network_icon.cc
+++ b/ash/system/network/active_network_icon.cc
@@ -8,16 +8,20 @@
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/system/network/network_icon.h"
 #include "ash/system/tray/tray_constants.h"
-#include "chromeos/network/network_handler.h"
-#include "chromeos/network/network_state.h"
-#include "chromeos/network/network_state_handler.h"
-#include "chromeos/network/network_type_pattern.h"
+#include "base/stl_util.h"
+#include "chromeos/services/network_config/public/cpp/cros_network_config_util.h"
+#include "chromeos/services/network_config/public/mojom/constants.mojom.h"
+#include "services/service_manager/public/cpp/connector.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/paint_vector_icon.h"
 
-using chromeos::NetworkStateHandler;
-using chromeos::NetworkTypePattern;
+using chromeos::network_config::mojom::DeviceStateProperties;
+using chromeos::network_config::mojom::DeviceStateType;
+using chromeos::network_config::mojom::FilterType;
+using chromeos::network_config::mojom::NetworkFilter;
+using chromeos::network_config::mojom::NetworkStateProperties;
+using chromeos::network_config::mojom::NetworkType;
 
 namespace ash {
 
@@ -39,10 +43,10 @@
 }
 
 base::Optional<NetworkIconState> GetConnectingOrConnected(
-    const chromeos::NetworkState* connecting_network,
-    const chromeos::NetworkState* connected_network) {
+    const NetworkStateProperties* connecting_network,
+    const NetworkStateProperties* connected_network) {
   if (connecting_network &&
-      (!connected_network || connecting_network->connect_requested())) {
+      (!connected_network || connecting_network->connect_requested)) {
     // If connecting to a network, and there is either no connected network or
     // the connection was user requested, use the connecting network.
     return base::make_optional<NetworkIconState>(connecting_network);
@@ -54,16 +58,30 @@
 
 }  // namespace
 
-ActiveNetworkIcon::ActiveNetworkIcon() {
-  // NetworkHandler may not be initialized in tests.
-  if (chromeos::NetworkHandler::IsInitialized()) {
-    InitializeNetworkStateHandler(
-        chromeos::NetworkHandler::Get()->network_state_handler());
-  }
+ActiveNetworkIcon::ActiveNetworkIcon(service_manager::Connector* connector) {
+  if (connector)  // May be null in tests.
+    BindCrosNetworkConfig(connector);
 }
 
-ActiveNetworkIcon::~ActiveNetworkIcon() {
-  ShutdownNetworkStateHandler();
+ActiveNetworkIcon::~ActiveNetworkIcon() = default;
+
+void ActiveNetworkIcon::BindCrosNetworkConfig(
+    service_manager::Connector* connector) {
+  // Ensure bindings are reset in case this is called after a failure.
+  cros_network_config_observer_binding_.Close();
+  cros_network_config_ptr_.reset();
+
+  connector->BindInterface(chromeos::network_config::mojom::kServiceName,
+                           &cros_network_config_ptr_);
+  chromeos::network_config::mojom::CrosNetworkConfigObserverPtr observer_ptr;
+  cros_network_config_observer_binding_.Bind(mojo::MakeRequest(&observer_ptr));
+  cros_network_config_ptr_->AddObserver(std::move(observer_ptr));
+  UpdateActiveNetworks();
+
+  // If the connection is lost (e.g. due to a crash), attempt to rebind it.
+  cros_network_config_ptr_.set_connection_error_handler(
+      base::BindOnce(&ActiveNetworkIcon::BindCrosNetworkConfig,
+                     base::Unretained(this), connector));
 }
 
 base::string16 ActiveNetworkIcon::GetDefaultLabel(
@@ -84,7 +102,7 @@
     if (animating)
       *animating = true;
     return network_icon::GetConnectingImageForNetworkType(
-        network_icon::NetworkType::kCellular, icon_type);
+        NetworkType::kCellular, icon_type);
   }
   return GetDefaultImageImpl(default_network_, icon_type, animating);
 }
@@ -92,8 +110,7 @@
 gfx::ImageSkia ActiveNetworkIcon::GetDualImagePrimary(
     network_icon::IconType icon_type,
     bool* animating) {
-  if (default_network_ &&
-      default_network_->type == network_icon::NetworkType::kCellular) {
+  if (default_network_ && default_network_->type == NetworkType::kCellular) {
     if (network_icon::IsConnected(*default_network_)) {
       // TODO: Show proper technology badges.
       if (animating)
@@ -110,8 +127,7 @@
 gfx::ImageSkia ActiveNetworkIcon::GetDualImageCellular(
     network_icon::IconType icon_type,
     bool* animating) {
-  if (!network_state_handler_->IsTechnologyAvailable(
-          NetworkTypePattern::Cellular())) {
+  if (!base::ContainsKey(devices_, NetworkType::kCellular)) {
     if (animating)
       *animating = false;
     return gfx::ImageSkia();
@@ -121,41 +137,20 @@
     if (animating)
       *animating = true;
     return network_icon::GetConnectingImageForNetworkType(
-        network_icon::NetworkType::kCellular, icon_type);
+        NetworkType::kCellular, icon_type);
   }
 
   if (!active_cellular_) {
     if (animating)
       *animating = false;
     return network_icon::GetDisconnectedImageForNetworkType(
-        network_icon::NetworkType::kCellular);
+        NetworkType::kCellular);
   }
 
   return network_icon::GetImageForNonVirtualNetwork(
       *active_cellular_, icon_type, false /* show_vpn_badge */, animating);
 }
 
-void ActiveNetworkIcon::InitForTesting(
-    chromeos::NetworkStateHandler* network_state_handler) {
-  ShutdownNetworkStateHandler();
-  InitializeNetworkStateHandler(network_state_handler);
-}
-
-void ActiveNetworkIcon::InitializeNetworkStateHandler(
-    chromeos::NetworkStateHandler* handler) {
-  DCHECK(!network_state_handler_);
-  DCHECK(handler);
-  network_state_handler_ = handler;
-  network_state_handler_->AddObserver(this, FROM_HERE);
-  UpdateActiveNetworks();
-}
-
-void ActiveNetworkIcon::ShutdownNetworkStateHandler() {
-  if (!network_state_handler_)
-    return;
-  network_state_handler_->RemoveObserver(this, FROM_HERE);
-}
-
 gfx::ImageSkia ActiveNetworkIcon::GetDefaultImageImpl(
     const base::Optional<NetworkIconState>& default_network,
     network_icon::IconType icon_type,
@@ -165,7 +160,7 @@
     return GetDefaultImageForNoNetwork(icon_type, animating);
   }
   // Don't show connected Ethernet in the tray unless a VPN is present.
-  if (default_network->type == network_icon::NetworkType::kEthernet &&
+  if (default_network->type == NetworkType::kEthernet &&
       IsTrayIcon(icon_type) && !active_vpn_) {
     if (animating)
       *animating = false;
@@ -196,11 +191,11 @@
     bool* animating) {
   if (animating)
     *animating = false;
-  if (network_state_handler_ &&
-      network_state_handler_->IsTechnologyEnabled(NetworkTypePattern::WiFi())) {
+  DeviceStateProperties* wifi = GetDevice(NetworkType::kWiFi);
+  if (wifi && wifi->state == DeviceStateType::kEnabled) {
     // WiFi is enabled but disconnected, show an empty wedge.
-    return network_icon::GetBasicImage(
-        icon_type, network_icon::NetworkType::kWiFi, false /* connected */);
+    return network_icon::GetBasicImage(icon_type, NetworkType::kWiFi,
+                                       false /* connected */);
   }
   // WiFi is disabled, show a full icon with a strikethrough.
   return network_icon::GetImageForWiFiEnabledState(false /* not enabled*/,
@@ -208,23 +203,23 @@
 }
 
 void ActiveNetworkIcon::UpdateActiveNetworks() {
-  std::vector<const chromeos::NetworkState*> active_networks;
-  network_state_handler_->GetActiveNetworkListByType(
-      NetworkTypePattern::Default(), &active_networks);
-  ActiveNetworksChanged(active_networks);
+  DCHECK(cros_network_config_ptr_);
+  cros_network_config_ptr_->GetNetworkStateList(
+      NetworkFilter::New(FilterType::kActive, NetworkType::kAll,
+                         /*limit=*/0),
+      base::BindOnce(&ActiveNetworkIcon::OnActiveNetworksChanged,
+                     base::Unretained(this)));
 }
 
 void ActiveNetworkIcon::SetCellularUninitializedMsg() {
-  if (network_state_handler_->GetTechnologyState(
-          NetworkTypePattern::Cellular()) ==
-      NetworkStateHandler::TECHNOLOGY_UNINITIALIZED) {
+  DeviceStateProperties* cellular = GetDevice(NetworkType::kCellular);
+  if (cellular && cellular->state == DeviceStateType::kUninitialized) {
     cellular_uninitialized_msg_ = IDS_ASH_STATUS_TRAY_INITIALIZING_CELLULAR;
     uninitialized_state_time_ = base::Time::Now();
     return;
   }
 
-  if (network_state_handler_->GetScanningByType(
-          NetworkTypePattern::Cellular())) {
+  if (cellular && cellular->scanning) {
     cellular_uninitialized_msg_ = IDS_ASH_STATUS_TRAY_MOBILE_SCANNING;
     uninitialized_state_time_ = base::Time::Now();
     return;
@@ -239,62 +234,54 @@
     cellular_uninitialized_msg_ = 0;
 }
 
-void ActiveNetworkIcon::DeviceListChanged() {
-  UpdateActiveNetworks();
-}
+// CrosNetworkConfigObserver
 
-void ActiveNetworkIcon::DevicePropertiesUpdated(
-    const chromeos::DeviceState* device) {
-  SetCellularUninitializedMsg();
-}
-
-void ActiveNetworkIcon::ActiveNetworksChanged(
-    const std::vector<const chromeos::NetworkState*>& active_networks) {
+void ActiveNetworkIcon::OnActiveNetworksChanged(
+    std::vector<chromeos::network_config::mojom::NetworkStatePropertiesPtr>
+        networks) {
   active_cellular_.reset();
   active_vpn_.reset();
 
-  const chromeos::NetworkState* connected_network = nullptr;
-  const chromeos::NetworkState* connected_non_cellular = nullptr;
-  const chromeos::NetworkState* connecting_network = nullptr;
-  const chromeos::NetworkState* connecting_non_cellular = nullptr;
-  for (const chromeos::NetworkState* network : active_networks) {
-    if (network->Matches(NetworkTypePattern::VPN())) {
+  const NetworkStateProperties* connected_network = nullptr;
+  const NetworkStateProperties* connected_non_cellular = nullptr;
+  const NetworkStateProperties* connecting_network = nullptr;
+  const NetworkStateProperties* connecting_non_cellular = nullptr;
+  for (const auto& network_ptr : networks) {
+    const NetworkStateProperties* network = network_ptr.get();
+    if (network->type == NetworkType::kVPN) {
       if (!active_vpn_)
         active_vpn_ = base::make_optional<NetworkIconState>(network);
       continue;
     }
-    if (network->Matches(NetworkTypePattern::Cellular())) {
+    if (network->type == NetworkType::kCellular) {
       if (!active_cellular_)
         active_cellular_ = base::make_optional<NetworkIconState>(network);
     }
-    if (network->IsConnectedState()) {
+    if (chromeos::network_config::StateIsConnected(network->connection_state)) {
       if (!connected_network)
         connected_network = network;
-      if (!connected_non_cellular &&
-          !network->Matches(NetworkTypePattern::Cellular())) {
+      if (!connected_non_cellular && network->type != NetworkType::kCellular) {
         connected_non_cellular = network;
       }
       continue;
     }
     // Active non connected networks are connecting.
-    if (network->Matches(NetworkTypePattern::Wireless())) {
+    if (chromeos::network_config::NetworkStateMatchesType(
+            network, NetworkType::kWireless)) {
       if (!connecting_network)
         connecting_network = network;
-      if (!connecting_non_cellular &&
-          !network->Matches(NetworkTypePattern::Cellular())) {
+      if (!connecting_non_cellular && network->type != NetworkType::kCellular) {
         connecting_non_cellular = network;
       }
     }
   }
 
   VLOG_IF(2, connected_network)
-      << __func__ << ": Connected network: " << connected_network->name()
-      << " State: " << connected_network->connection_state()
-      << " Strength: " << connected_network->signal_strength();
+      << __func__ << ": Connected network: " << connected_network->name
+      << " State: " << connected_network->connection_state;
   VLOG_IF(2, connecting_network)
-      << __func__ << ": Connecting network: " << connecting_network->name()
-      << " State: " << connecting_network->connection_state()
-      << " Strength: " << connecting_network->signal_strength();
+      << __func__ << ": Connecting network: " << connecting_network->name
+      << " State: " << connecting_network->connection_state;
 
   default_network_ =
       GetConnectingOrConnected(connecting_network, connected_network);
@@ -308,8 +295,32 @@
   SetCellularUninitializedMsg();
 }
 
-void ActiveNetworkIcon::OnShuttingDown() {
-  network_state_handler_ = nullptr;
+void ActiveNetworkIcon::OnNetworkStateListChanged() {}
+
+void ActiveNetworkIcon::OnDeviceStateListChanged() {
+  cros_network_config_ptr_->GetDeviceStateList(base::BindOnce(
+      &ActiveNetworkIcon::OnGetDeviceStateList, base::Unretained(this)));
+}
+
+void ActiveNetworkIcon::OnGetDeviceStateList(
+    std::vector<chromeos::network_config::mojom::DeviceStatePropertiesPtr>
+        devices) {
+  devices_.clear();
+  for (auto& device : devices) {
+    NetworkType type = device->type;
+    if (base::ContainsKey(devices_, type))
+      continue;  // Ignore multiple entries with the same type.
+    devices_.emplace(std::make_pair(type, std::move(device)));
+  }
+  UpdateActiveNetworks();
+  SetCellularUninitializedMsg();
+}
+
+DeviceStateProperties* ActiveNetworkIcon::GetDevice(NetworkType type) {
+  auto iter = devices_.find(type);
+  if (iter == devices_.end())
+    return nullptr;
+  return iter->second.get();
 }
 
 }  // namespace ash
diff --git a/ash/system/network/active_network_icon.h b/ash/system/network/active_network_icon.h
index f4937f61..38de9bd 100644
--- a/ash/system/network/active_network_icon.h
+++ b/ash/system/network/active_network_icon.h
@@ -10,21 +10,22 @@
 
 #include "ash/ash_export.h"
 #include "ash/system/network/network_icon.h"
+#include "base/containers/flat_map.h"
 #include "base/macros.h"
 #include "base/optional.h"
 #include "base/strings/string16.h"
 #include "base/time/time.h"
-#include "chromeos/network/network_state_handler_observer.h"
-
-namespace chromeos {
-class NetworkState;
-class NetworkStateHandler;
-}  // namespace chromeos
+#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
+#include "mojo/public/cpp/bindings/binding.h"
 
 namespace gfx {
 class ImageSkia;
 }  // namespace gfx
 
+namespace service_manager {
+class Connector;
+}
+
 namespace ash {
 
 // Tracks changes to the active networks and provides an interface to
@@ -40,9 +41,9 @@
 // TODO(stevenjb): Move all test coverage to active_network_icon_unittest.cc and
 // test Dual icon methods.
 class ASH_EXPORT ActiveNetworkIcon
-    : public chromeos::NetworkStateHandlerObserver {
+    : public chromeos::network_config::mojom::CrosNetworkConfigObserver {
  public:
-  ActiveNetworkIcon();
+  explicit ActiveNetworkIcon(service_manager::Connector* connector);
   ~ActiveNetworkIcon() override;
 
   // Returns the label for the primary active network..
@@ -63,12 +64,8 @@
   gfx::ImageSkia GetDualImageCellular(network_icon::IconType icon_type,
                                       bool* animating);
 
-  void InitForTesting(chromeos::NetworkStateHandler* network_state_handler);
-
  private:
-  void InitializeNetworkStateHandler(chromeos::NetworkStateHandler* handler);
-  void ShutdownNetworkStateHandler();
-
+  void BindCrosNetworkConfig(service_manager::Connector* connector);
   gfx::ImageSkia GetDefaultImageImpl(
       const base::Optional<network_icon::NetworkIconState>& default_network,
       network_icon::IconType icon_type,
@@ -82,14 +79,27 @@
   void UpdateActiveNetworks();
   void SetCellularUninitializedMsg();
 
-  // chromeos::NetworkStateHandlerObserver
-  void DeviceListChanged() override;
-  void DevicePropertiesUpdated(const chromeos::DeviceState* device) override;
-  void ActiveNetworksChanged(const std::vector<const chromeos::NetworkState*>&
-                                 active_networks) override;
-  void OnShuttingDown() override;
+  // CrosNetworkConfigObserver
+  void OnActiveNetworksChanged(
+      std::vector<chromeos::network_config::mojom::NetworkStatePropertiesPtr>
+          networks) override;
+  void OnNetworkStateListChanged() override;
+  void OnDeviceStateListChanged() override;
 
-  chromeos::NetworkStateHandler* network_state_handler_ = nullptr;
+  void OnGetDeviceStateList(
+      std::vector<chromeos::network_config::mojom::DeviceStatePropertiesPtr>
+          devices);
+  chromeos::network_config::mojom::DeviceStateProperties* GetDevice(
+      chromeos::network_config::mojom::NetworkType type);
+
+  chromeos::network_config::mojom::CrosNetworkConfigPtr
+      cros_network_config_ptr_;
+  mojo::Binding<chromeos::network_config::mojom::CrosNetworkConfigObserver>
+      cros_network_config_observer_binding_{this};
+
+  base::flat_map<chromeos::network_config::mojom::NetworkType,
+                 chromeos::network_config::mojom::DeviceStatePropertiesPtr>
+      devices_;
   base::Optional<network_icon::NetworkIconState> default_network_;
   base::Optional<network_icon::NetworkIconState> active_non_cellular_;
   base::Optional<network_icon::NetworkIconState> active_cellular_;
diff --git a/ash/system/network/active_network_icon_unittest.cc b/ash/system/network/active_network_icon_unittest.cc
index ac251235..ebf5f2be 100644
--- a/ash/system/network/active_network_icon_unittest.cc
+++ b/ash/system/network/active_network_icon_unittest.cc
@@ -13,6 +13,8 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chromeos/network/network_state_test_helper.h"
+#include "chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h"
+#include "services/service_manager/public/cpp/connector.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -33,16 +35,16 @@
   ~ActiveNetworkIconTest() override = default;
 
   void SetUp() override {
-    active_network_icon_ = std::make_unique<ActiveNetworkIcon>();
-    active_network_icon_->InitForTesting(helper().network_state_handler());
+    active_network_icon_ =
+        std::make_unique<ActiveNetworkIcon>(network_config_helper_.connector());
   }
 
   void TearDown() override { active_network_icon_.reset(); }
 
   void SetupEthernet() {
     if (eth_path_.empty()) {
-      helper().device_test()->AddDevice("/device/stub_eth_device",
-                                        shill::kTypeWifi, "stub_eth_device");
+      network_state_helper().device_test()->AddDevice(
+          "/device/stub_eth_device", shill::kTypeWifi, "stub_eth_device");
       eth_path_ = ConfigureService(
           R"({"GUID": "eth_guid", "Type": "ethernet", "State": "online"})");
     }
@@ -63,11 +65,11 @@
 
   void SetupCellular(const char* state) {
     if (cellular_path_.empty()) {
-      helper_.manager_test()->AddTechnology(shill::kTypeCellular,
-                                            true /* enabled */);
-      helper().device_test()->AddDevice(kShillManagerClientStubCellularDevice,
-                                        shill::kTypeCellular,
-                                        "stub_cellular_device");
+      network_state_helper().manager_test()->AddTechnology(shill::kTypeCellular,
+                                                           true /* enabled */);
+      network_state_helper().device_test()->AddDevice(
+          kShillManagerClientStubCellularDevice, shill::kTypeCellular,
+          "stub_cellular_device");
       cellular_path_ = ConfigureService(
           R"({"GUID": "cellular_guid", "Type": "cellular", "Technology": "LTE",
             "State": "idle"})");
@@ -76,22 +78,25 @@
                        base::Value(state));
     SetServiceProperty(cellular_path_, shill::kSignalStrengthProperty,
                        base::Value(100));
+    base::RunLoop().RunUntilIdle();
   }
 
   void SetCellularUninitialized(bool scanning) {
     const bool enabled = scanning;
-    helper_.manager_test()->RemoveTechnology(shill::kTypeCellular);
-    helper_.manager_test()->AddTechnology(shill::kTypeCellular, enabled);
-    helper().device_test()->AddDevice(kShillManagerClientStubCellularDevice,
-                                      shill::kTypeCellular,
-                                      "stub_cellular_device");
+    network_state_helper().manager_test()->RemoveTechnology(
+        shill::kTypeCellular);
+    network_state_helper().manager_test()->AddTechnology(shill::kTypeCellular,
+                                                         enabled);
+    network_state_helper().device_test()->AddDevice(
+        kShillManagerClientStubCellularDevice, shill::kTypeCellular,
+        "stub_cellular_device");
     if (scanning) {
-      helper().device_test()->SetDeviceProperty(
+      network_state_helper().device_test()->SetDeviceProperty(
           kShillManagerClientStubCellularDevice, shill::kScanningProperty,
           base::Value(true), true /* notify_changed */);
     } else {
-      helper_.manager_test()->SetTechnologyInitializing(shill::kTypeCellular,
-                                                        true);
+      network_state_helper().manager_test()->SetTechnologyInitializing(
+          shill::kTypeCellular, true);
     }
     base::RunLoop().RunUntilIdle();
   }
@@ -108,13 +113,13 @@
   }
 
   std::string ConfigureService(const std::string& shill_json_string) {
-    return helper_.ConfigureService(shill_json_string);
+    return network_state_helper().ConfigureService(shill_json_string);
   }
 
   void SetServiceProperty(const std::string& service_path,
                           const std::string& key,
                           const base::Value& value) {
-    helper_.SetServiceProperty(service_path, key, value);
+    network_state_helper().SetServiceProperty(service_path, key, value);
   }
 
   std::unique_ptr<chromeos::NetworkState> CreateStandaloneNetworkState(
@@ -125,12 +130,16 @@
     VLOG(1) << "CreateStandaloneNetworkState: " << id << " type: " << type
             << " State: " << connection_state
             << " Strength: " << signal_strength;
-    return helper_.CreateStandaloneNetworkState(id, type, connection_state,
-                                                signal_strength);
+    return network_state_helper().CreateStandaloneNetworkState(
+        id, type, connection_state, signal_strength);
   }
 
-  chromeos::NetworkStateTestHelper& helper() { return helper_; }
-
+  chromeos::NetworkStateTestHelper& network_state_helper() {
+    return network_config_helper_.network_state_helper();
+  }
+  chromeos::NetworkStateHandler* network_state_handler() {
+    return network_state_helper().network_state_handler();
+  }
   ActiveNetworkIcon* active_network_icon() {
     return active_network_icon_.get();
   }
@@ -143,8 +152,7 @@
 
  private:
   const base::MessageLoop message_loop_;
-  chromeos::NetworkStateTestHelper helper_{
-      false /* use_default_devices_and_services */};
+  chromeos::network_config::CrosNetworkConfigTestHelper network_config_helper_;
   std::unique_ptr<ActiveNetworkIcon> active_network_icon_;
 
   std::string eth_path_;
@@ -167,8 +175,7 @@
             label);
 
   SetupWiFi(shill::kStateIdle);
-  helper().network_state_handler()->SetNetworkConnectRequested(wifi_path(),
-                                                               true);
+  network_state_handler()->SetNetworkConnectRequested(wifi_path(), true);
   base::RunLoop().RunUntilIdle();
   label = active_network_icon()->GetDefaultLabel(icon_type());
   // Note: The guid is used for the name in ConfigureService.
@@ -198,8 +205,7 @@
 
   // Cellular + WiFi connecting = WiFi connecting icon
   SetupWiFi(shill::kStateAssociation);
-  helper().network_state_handler()->SetNetworkConnectRequested(wifi_path(),
-                                                               true);
+  network_state_handler()->SetNetworkConnectRequested(wifi_path(), true);
   SetServiceProperty(wifi_path(), shill::kSignalStrengthProperty,
                      base::Value(50));
   base::RunLoop().RunUntilIdle();
@@ -217,8 +223,7 @@
 
   // Cellular + WiFi connected + Ethernet = No icon
   SetupWiFi(shill::kStateOnline);
-  helper().network_state_handler()->SetNetworkConnectRequested(wifi_path(),
-                                                               false);
+  network_state_handler()->SetNetworkConnectRequested(wifi_path(), false);
   image = active_network_icon()->GetSingleImage(icon_type(), &animating);
   EXPECT_TRUE(image.isNull());
   EXPECT_FALSE(animating);
@@ -245,7 +250,7 @@
 TEST_F(ActiveNetworkIconTest, CellularScanning) {
   SetCellularUninitialized(true /* scanning */);
 
-  ASSERT_TRUE(helper().network_state_handler()->GetScanningByType(
+  ASSERT_TRUE(network_state_handler()->GetScanningByType(
       chromeos::NetworkTypePattern::Cellular()));
 
   base::string16 label = active_network_icon()->GetDefaultLabel(icon_type());
diff --git a/ash/system/network/network_icon.cc b/ash/system/network/network_icon.cc
index 020c4577..df5ffbb0 100644
--- a/ash/system/network/network_icon.cc
+++ b/ash/system/network/network_icon.cc
@@ -20,6 +20,7 @@
 #include "chromeos/network/network_type_pattern.h"
 #include "chromeos/network/onc/onc_translation_tables.h"
 #include "chromeos/network/tether_constants.h"
+#include "chromeos/services/network_config/public/cpp/cros_network_config_util.h"
 #include "components/onc/onc_constants.h"
 #include "components/vector_icons/vector_icons.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -30,6 +31,10 @@
 #include "ui/gfx/vector_icon_types.h"
 
 using chromeos::NetworkTypePattern;
+using chromeos::network_config::mojom::ActivationStateType;
+using chromeos::network_config::mojom::ConnectionStateType;
+using chromeos::network_config::mojom::NetworkType;
+using chromeos::network_config::mojom::SecurityType;
 
 namespace ash {
 namespace network_icon {
@@ -331,26 +336,49 @@
     connection_state = ConnectionStateType::kNotConnected;
   }
 
-  if (type == NetworkType::kWiFi && !network->security_class().empty()) {
-    chromeos::onc::TranslateStringToONC(chromeos::onc::kWiFiSecurityTable,
-                                        network->security_class(), &security);
-  }
+  security = network->GetMojoSecurity();
+
   if (type == NetworkType::kCellular) {
     if (!network->network_technology().empty()) {
       chromeos::onc::TranslateStringToONC(
           chromeos::onc::kNetworkTechnologyTable, network->network_technology(),
           &network_technology);
     }
-    if (!network->activation_state().empty()) {
-      chromeos::onc::TranslateStringToONC(chromeos::onc::kActivationStateTable,
-                                          network->activation_state(),
-                                          &activation_state);
-    }
   }
+
+  activation_state = network->GetMojoActivationState();
   signal_strength = network->signal_strength();
   is_roaming = network->IndicateRoaming();
 }
 
+NetworkIconState::NetworkIconState(
+    const chromeos::network_config::mojom::NetworkStateProperties* network) {
+  guid = network->guid;
+  name = network->name;
+  type = network->type;
+  connection_state = network->connection_state;
+  if (type == NetworkType::kCellular && network->cellular) {
+    activation_state = network->cellular->activation_state;
+    network_technology = network->cellular->network_technology;
+    is_roaming = network->cellular->roaming;
+    signal_strength = network->cellular->signal_strength;
+  } else {
+    activation_state = ActivationStateType::kUnknown;
+  }
+  if (type == NetworkType::kTether && network->tether) {
+    signal_strength = network->tether->signal_strength;
+  }
+  if (type == NetworkType::kWiFi && network->wifi) {
+    security = network->wifi->security;
+    signal_strength = network->wifi->signal_strength;
+  } else {
+    security = chromeos::network_config::mojom::SecurityType::kNone;
+  }
+  if (type == NetworkType::kWiMAX && network->wimax) {
+    signal_strength = network->wimax->signal_strength;
+  }
+}
+
 NetworkIconState::NetworkIconState(const NetworkIconState& other) = default;
 
 NetworkIconState& NetworkIconState::operator=(const NetworkIconState& other) =
@@ -438,8 +466,7 @@
   const NetworkType type = network.type;
   const SkColor icon_color = GetDefaultColorForIconType(icon_type_);
   if (type == NetworkType::kWiFi) {
-    if (network.security != onc::wifi::kSecurityNone &&
-        !IsTrayIcon(icon_type_)) {
+    if (network.security != SecurityType::kNone && !IsTrayIcon(icon_type_)) {
       badges->bottom_right = {&kUnifiedNetworkBadgeSecureIcon, icon_color};
     }
   } else if (type == NetworkType::kCellular) {
@@ -492,8 +519,8 @@
 // Public interface
 
 bool IsConnected(const NetworkIconState& icon_state) {
-  return icon_state.connection_state == ConnectionStateType::kConnected ||
-         icon_state.connection_state == ConnectionStateType::kPortal;
+  return chromeos::network_config::StateIsConnected(
+      icon_state.connection_state);
 }
 
 bool IsConnecting(const NetworkIconState& icon_state) {
@@ -602,7 +629,7 @@
 
 base::string16 GetLabelForNetwork(const NetworkIconState& network,
                                   IconType icon_type) {
-  std::string activation_state = network.activation_state;
+  ActivationStateType activation_state = network.activation_state;
   if (icon_type == ICON_TYPE_LIST || icon_type == ICON_TYPE_MENU_LIST) {
     // Show "<network>: [Connecting|Activating]..."
     if (icon_type != ICON_TYPE_MENU_LIST && IsConnecting(network)) {
@@ -610,14 +637,14 @@
           IDS_ASH_STATUS_TRAY_NETWORK_LIST_CONNECTING,
           base::UTF8ToUTF16(network.name));
     }
-    if (activation_state == onc::cellular::kActivating) {
+    if (activation_state == ActivationStateType::kActivating) {
       return l10n_util::GetStringFUTF16(
           IDS_ASH_STATUS_TRAY_NETWORK_LIST_ACTIVATING,
           base::UTF8ToUTF16(network.name));
     }
     // Show "Activate <network>" in list view only.
-    if (activation_state == onc::cellular::kNotActivated ||
-        activation_state == onc::cellular::kPartiallyActivated) {
+    if (activation_state == ActivationStateType::kNotActivated ||
+        activation_state == ActivationStateType::kPartiallyActivated) {
       return l10n_util::GetStringFUTF16(
           IDS_ASH_STATUS_TRAY_NETWORK_LIST_ACTIVATE,
           base::UTF8ToUTF16(network.name));
@@ -632,7 +659,7 @@
       return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_NETWORK_CONNECTING,
                                         base::UTF8ToUTF16(network.name));
     }
-    if (activation_state == onc::cellular::kActivating) {
+    if (activation_state == ActivationStateType::kActivating) {
       return l10n_util::GetStringFUTF16(IDS_ASH_STATUS_TRAY_NETWORK_ACTIVATING,
                                         base::UTF8ToUTF16(network.name));
     }
diff --git a/ash/system/network/network_icon.h b/ash/system/network/network_icon.h
index 65d7e410..317b92a 100644
--- a/ash/system/network/network_icon.h
+++ b/ash/system/network/network_icon.h
@@ -10,6 +10,7 @@
 
 #include "ash/ash_export.h"
 #include "base/strings/string16.h"
+#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
 #include "ui/gfx/canvas.h"
 #include "ui/gfx/image/canvas_image_source.h"
 #include "ui/gfx/image/image_skia.h"
@@ -21,39 +22,25 @@
 namespace ash {
 namespace network_icon {
 
-// TODO(stevenjb): Replace with mojo enum once available.
-enum class NetworkType : int32_t {
-  kCellular,
-  kEthernet,
-  kTether,
-  kVPN,
-  kWiFi,
-};
-
-// TODO(stevenjb): Replace with mojo enum once available.
-enum class ConnectionStateType : int32_t {
-  kNotConnected,
-  kConnecting,
-  kConnected,
-  kPortal,
-};
-
-// TODO(stevenjb): Replace with mojo type once available.
+// TODO(stevenjb): Replace with network_config::mojom::NetworkStateProperties.
 struct ASH_EXPORT NetworkIconState {
   // Constructs a NetworkIconState from a NetworkState.
   explicit NetworkIconState(const chromeos::NetworkState* network);
+  // Constructs a NetworkIconState from mojom::NetworkStateProperties.
+  explicit NetworkIconState(
+      const chromeos::network_config::mojom::NetworkStateProperties* network);
   NetworkIconState(const NetworkIconState& other);
   NetworkIconState& operator=(const NetworkIconState& other);
   ~NetworkIconState();
 
   std::string guid;
   std::string name;
-  NetworkType type;
-  ConnectionStateType connection_state;
-  std::string security;            // ONC security type
+  chromeos::network_config::mojom::NetworkType type;
+  chromeos::network_config::mojom::ConnectionStateType connection_state;
+  chromeos::network_config::mojom::SecurityType security;  // ONC security type
   std::string network_technology;  // ONC network technology type
-  std::string activation_state;    // ONC activation state
-  int signal_strength = 0;         // 0-100.
+  chromeos::network_config::mojom::ActivationStateType activation_state;
+  int signal_strength = 0;  // 0-100.
   bool is_roaming = false;
 };
 
@@ -77,9 +64,10 @@
 
 // Returns an image to represent either a fully connected network or a
 // disconnected network.
-const gfx::ImageSkia GetBasicImage(IconType icon_type,
-                                   NetworkType network_type,
-                                   bool connected);
+const gfx::ImageSkia GetBasicImage(
+    IconType icon_type,
+    chromeos::network_config::mojom::NetworkType network_type,
+    bool connected);
 
 // Returns and caches an image for non VPN |network| which must not be null.
 // Use this for non virtual networks and for the default (tray) icon.
@@ -106,8 +94,9 @@
     IconType = ICON_TYPE_DEFAULT_VIEW);
 
 // Returns the connecting image for a shill network non-VPN type.
-gfx::ImageSkia GetConnectingImageForNetworkType(NetworkType network_type,
-                                                IconType icon_type);
+gfx::ImageSkia GetConnectingImageForNetworkType(
+    chromeos::network_config::mojom::NetworkType network_type,
+    IconType icon_type);
 
 // Returns the connected image for |connected_network| and |network_type| with a
 // connecting VPN badge.
@@ -116,7 +105,8 @@
     IconType icon_type);
 
 // Returns the disconnected image for a shill network type.
-gfx::ImageSkia GetDisconnectedImageForNetworkType(NetworkType network_type);
+gfx::ImageSkia GetDisconnectedImageForNetworkType(
+    chromeos::network_config::mojom::NetworkType network_type);
 
 // Returns the full strength image for a Wi-Fi network using |icon_color| for
 // the main icon and |badge_color| for the badge.
diff --git a/ash/system/network/network_icon_unittest.cc b/ash/system/network/network_icon_unittest.cc
index 4227034..9b3e891 100644
--- a/ash/system/network/network_icon_unittest.cc
+++ b/ash/system/network/network_icon_unittest.cc
@@ -17,6 +17,7 @@
 #include "chromeos/network/network_state_handler.h"
 #include "chromeos/network/network_state_test_helper.h"
 #include "chromeos/network/tether_constants.h"
+#include "chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -36,8 +37,8 @@
 
   void SetUp() override {
     SetUpDefaultNetworkState();
-    active_network_icon_ = std::make_unique<ActiveNetworkIcon>();
-    active_network_icon_->InitForTesting(helper().network_state_handler());
+    active_network_icon_ =
+        std::make_unique<ActiveNetworkIcon>(network_config_helper_.connector());
   }
 
   void TearDown() override {
@@ -46,21 +47,21 @@
   }
 
   std::string ConfigureService(const std::string& shill_json_string) {
-    return helper_.ConfigureService(shill_json_string);
+    return helper().ConfigureService(shill_json_string);
   }
 
   void SetServiceProperty(const std::string& service_path,
                           const std::string& key,
                           const base::Value& value) {
-    helper_.SetServiceProperty(service_path, key, value);
+    helper().SetServiceProperty(service_path, key, value);
   }
 
   void SetUpDefaultNetworkState() {
     // NetworkStateTestHelper default has a wifi device only and no services.
 
-    helper_.device_test()->AddDevice("/device/stub_cellular_device",
-                                     shill::kTypeCellular,
-                                     "stub_cellular_device");
+    helper().device_test()->AddDevice("/device/stub_cellular_device",
+                                      shill::kTypeCellular,
+                                      "stub_cellular_device");
     base::RunLoop().RunUntilIdle();
 
     wifi1_path_ = ConfigureService(
@@ -80,8 +81,8 @@
       const std::string& type,
       const std::string& connection_state,
       int signal_strength) {
-    return helper_.CreateStandaloneNetworkState(id, type, connection_state,
-                                                signal_strength);
+    return helper().CreateStandaloneNetworkState(id, type, connection_state,
+                                                 signal_strength);
   }
 
   std::unique_ptr<chromeos::NetworkState>
@@ -138,17 +139,19 @@
   }
 
   void SetCellularUnavailable() {
-    helper_.manager_test()->RemoveTechnology(shill::kTypeCellular);
+    helper().manager_test()->RemoveTechnology(shill::kTypeCellular);
 
     base::RunLoop().RunUntilIdle();
 
     ASSERT_EQ(
         chromeos::NetworkStateHandler::TechnologyState::TECHNOLOGY_UNAVAILABLE,
-        helper_.network_state_handler()->GetTechnologyState(
+        helper().network_state_handler()->GetTechnologyState(
             chromeos::NetworkTypePattern::Cellular()));
   }
 
-  chromeos::NetworkStateTestHelper& helper() { return helper_; }
+  chromeos::NetworkStateTestHelper& helper() {
+    return network_config_helper_.network_state_helper();
+  }
 
   const std::string& wifi1_path() const { return wifi1_path_; }
   const std::string& wifi2_path() const { return wifi2_path_; }
@@ -158,9 +161,7 @@
 
  private:
   const base::MessageLoop message_loop_;
-
-  chromeos::NetworkStateTestHelper helper_{
-      false /* use_default_devices_and_services */};
+  chromeos::network_config::CrosNetworkConfigTestHelper network_config_helper_;
 
   // Preconfigured service paths:
   std::string wifi1_path_;
diff --git a/ash/system/unified/feature_pods_container_view.h b/ash/system/unified/feature_pods_container_view.h
index ef10e7f..c93737e6 100644
--- a/ash/system/unified/feature_pods_container_view.h
+++ b/ash/system/unified/feature_pods_container_view.h
@@ -36,6 +36,9 @@
   void SaveFocus();
   void RestoreFocus();
 
+  // Returns the number of children that prefer to be visible.
+  int GetVisibleCount() const;
+
   // Overridden views::View:
   gfx::Size CalculatePreferredSize() const override;
   void ChildVisibilityChanged(View* child) override;
@@ -46,9 +49,6 @@
  private:
   void UpdateChildVisibility();
 
-  // Returns the number of children that prefer to be visible.
-  int GetVisibleCount() const;
-
   // Calculate the current position of the button from |visible_index| and
   // |expanded_amount_|.
   gfx::Point GetButtonPosition(int visible_index) const;
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc
index 8c2637e2..f2e1410 100644
--- a/ash/system/unified/unified_system_tray_controller.cc
+++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -40,6 +40,7 @@
 #include "ash/system/unified/unified_system_tray_view.h"
 #include "ash/system/unified/user_chooser_detailed_view_controller.h"
 #include "ash/wm/lock_state_controller.h"
+#include "ash/wm/tablet_mode/tablet_mode_controller.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/numerics/ranges.h"
@@ -322,6 +323,15 @@
   AddFeaturePodItem(std::make_unique<LocaleFeaturePodController>(this));
 
   // If you want to add a new feature pod item, add here.
+
+  std::string histogram_name = "ChromeOS.SystemTray.FeaturePodCountOnOpen";
+  if (Shell::Get()
+          ->tablet_mode_controller()
+          ->IsTabletModeWindowManagerEnabled()) {
+    histogram_name = "ChromeOS.SystemTray.Tablet.FeaturePodCountOnOpen";
+  }
+  UMA_HISTOGRAM_COUNTS_100(histogram_name,
+                           unified_view_->GetVisibleFeaturePodCount());
 }
 
 void UnifiedSystemTrayController::AddFeaturePodItem(
diff --git a/ash/system/unified/unified_system_tray_view.cc b/ash/system/unified/unified_system_tray_view.cc
index c67d5b3..44f0d69f 100644
--- a/ash/system/unified/unified_system_tray_view.cc
+++ b/ash/system/unified/unified_system_tray_view.cc
@@ -390,6 +390,10 @@
   SchedulePaint();
 }
 
+int UnifiedSystemTrayView::GetVisibleFeaturePodCount() const {
+  return feature_pods_container_->GetVisibleCount();
+}
+
 // static
 std::unique_ptr<views::Background> UnifiedSystemTrayView::CreateBackground() {
   return views::CreateBackgroundFromPainter(
diff --git a/ash/system/unified/unified_system_tray_view.h b/ash/system/unified/unified_system_tray_view.h
index b4617373..fb1e556 100644
--- a/ash/system/unified/unified_system_tray_view.h
+++ b/ash/system/unified/unified_system_tray_view.h
@@ -112,6 +112,9 @@
   // UnifiedSystemTrayView. It can be empty.
   void SetNotificationRectBelowScroll(const gfx::Rect& rect_below_scroll);
 
+  // Returns the number of visible feature pods.
+  int GetVisibleFeaturePodCount() const;
+
   // Create background of UnifiedSystemTray that is semi-transparent and has
   // rounded corners.
   static std::unique_ptr<views::Background> CreateBackground();
diff --git a/base/files/important_file_writer.cc b/base/files/important_file_writer.cc
index 2a9ef4f93..bb0c1a2 100644
--- a/base/files/important_file_writer.cc
+++ b/base/files/important_file_writer.cc
@@ -255,19 +255,15 @@
     return;
   }
 
-  Closure task = AdaptCallbackForRepeating(
+  auto task =
       BindOnce(&WriteScopedStringToFileAtomically, path_, std::move(data),
                std::move(before_next_write_callback_),
-               std::move(after_next_write_callback_), histogram_suffix_));
+               std::move(after_next_write_callback_), histogram_suffix_);
 
-  if (!task_runner_->PostTask(FROM_HERE, MakeCriticalClosure(task))) {
-    // Posting the task to background message loop is not expected
-    // to fail, but if it does, avoid losing data and just hit the disk
-    // on the current thread.
-    NOTREACHED();
+  // If PostTask() returns false, it means that |task_runner_| isn't
+  // BLOCK_SHUTDOWN and thus isn't appropriate to write an important file.
+  CHECK(task_runner_->PostTask(FROM_HERE, std::move(task)));
 
-    task.Run();
-  }
   ClearPendingWrite();
 }
 
diff --git a/base/sequence_checker_impl.h b/base/sequence_checker_impl.h
index a54c388..3edb689c 100644
--- a/base/sequence_checker_impl.h
+++ b/base/sequence_checker_impl.h
@@ -11,6 +11,7 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/synchronization/lock.h"
+#include "base/thread_annotations.h"
 
 namespace base {
 
@@ -36,9 +37,8 @@
  private:
   class Core;
 
-  // Guards all variables below.
   mutable Lock lock_;
-  mutable std::unique_ptr<Core> core_;
+  mutable std::unique_ptr<Core> core_ GUARDED_BY(lock_);
 
   DISALLOW_COPY_AND_ASSIGN(SequenceCheckerImpl);
 };
diff --git a/base/task/thread_pool/platform_native_worker_pool_win.cc b/base/task/thread_pool/platform_native_worker_pool_win.cc
index 1ffbf0d..4595a40 100644
--- a/base/task/thread_pool/platform_native_worker_pool_win.cc
+++ b/base/task/thread_pool/platform_native_worker_pool_win.cc
@@ -6,11 +6,40 @@
 
 #include "base/optional.h"
 #include "base/task/thread_pool/task_tracker.h"
+#include "base/threading/scoped_blocking_call.h"
 #include "base/win/scoped_com_initializer.h"
 
 namespace base {
 namespace internal {
 
+class PlatformNativeWorkerPoolWin::ScopedCallbackMayRunLongObserver
+    : public BlockingObserver {
+ public:
+  ScopedCallbackMayRunLongObserver(PTP_CALLBACK_INSTANCE callback)
+      : callback_(callback) {
+    SetBlockingObserverForCurrentThread(this);
+  }
+
+  ~ScopedCallbackMayRunLongObserver() override {
+    ClearBlockingObserverForCurrentThread();
+  }
+
+  // BlockingObserver:
+  void BlockingStarted(BlockingType blocking_type) override {
+    ::CallbackMayRunLong(callback_);
+    // CallbackMayRunLong should not be called twice.
+    ClearBlockingObserverForCurrentThread();
+  }
+
+  void BlockingTypeUpgraded() override {}
+  void BlockingEnded() override {}
+
+ private:
+  PTP_CALLBACK_INSTANCE callback_;
+
+  DISALLOW_COPY_AND_ASSIGN(ScopedCallbackMayRunLongObserver);
+};
+
 PlatformNativeWorkerPoolWin::PlatformNativeWorkerPoolWin(
     TrackedRef<TaskTracker> task_tracker,
     TrackedRef<Delegate> delegate,
@@ -44,13 +73,13 @@
 
 void PlatformNativeWorkerPoolWin::SubmitWork() {
   // TODO(fdoray): Handle priorities by having different work objects and using
-  // SetThreadpoolCallbackPriority() and SetThreadpoolCallbackRunsLong().
+  // SetThreadpoolCallbackPriority().
   ::SubmitThreadpoolWork(work_);
 }
 
 // static
 void CALLBACK PlatformNativeWorkerPoolWin::RunNextTaskSource(
-    PTP_CALLBACK_INSTANCE,
+    PTP_CALLBACK_INSTANCE callback_instance,
     void* scheduler_worker_pool_windows_impl,
     PTP_WORK) {
   auto* worker_pool = static_cast<PlatformNativeWorkerPoolWin*>(
@@ -63,6 +92,9 @@
   if (worker_pool->worker_environment_ == WorkerEnvironment::COM_MTA)
     com_initializer.emplace(win::ScopedCOMInitializer::kMTA);
 
+  ScopedCallbackMayRunLongObserver callback_may_run_long_observer(
+      callback_instance);
+
   worker_pool->RunNextTaskSourceImpl();
 }
 
diff --git a/base/task/thread_pool/platform_native_worker_pool_win.h b/base/task/thread_pool/platform_native_worker_pool_win.h
index 6e3a647..cabd33f 100644
--- a/base/task/thread_pool/platform_native_worker_pool_win.h
+++ b/base/task/thread_pool/platform_native_worker_pool_win.h
@@ -34,9 +34,11 @@
   ~PlatformNativeWorkerPoolWin() override;
 
  private:
+  class ScopedCallbackMayRunLongObserver;
+
   // Callback that gets run by |pool_|.
   static void CALLBACK
-  RunNextTaskSource(PTP_CALLBACK_INSTANCE,
+  RunNextTaskSource(PTP_CALLBACK_INSTANCE callback_instance,
                     void* scheduler_worker_pool_windows_impl,
                     PTP_WORK);
 
diff --git a/base/task/thread_pool/scheduler_worker_pool_unittest.cc b/base/task/thread_pool/scheduler_worker_pool_unittest.cc
index 5f5e705..1f615b3 100644
--- a/base/task/thread_pool/scheduler_worker_pool_unittest.cc
+++ b/base/task/thread_pool/scheduler_worker_pool_unittest.cc
@@ -437,6 +437,31 @@
   task_tracker_.FlushForTesting();
 }
 
+// Regression test for crbug.com/955953.
+TEST_P(ThreadPoolWorkerPoolTest, ScopedBlockingCallTwice) {
+  StartWorkerPool();
+  auto task_runner = test::CreateTaskRunnerWithExecutionMode(
+      GetParam().execution_mode, &mock_scheduler_task_runner_delegate_,
+      {MayBlock()});
+
+  WaitableEvent task_ran;
+  task_runner->PostTask(FROM_HERE,
+                        BindOnce(
+                            [](WaitableEvent* task_ran) {
+                              {
+                                ScopedBlockingCall scoped_blocking_call(
+                                    FROM_HERE, BlockingType::MAY_BLOCK);
+                              }
+                              {
+                                ScopedBlockingCall scoped_blocking_call(
+                                    FROM_HERE, BlockingType::MAY_BLOCK);
+                              }
+                              task_ran->Signal();
+                            },
+                            Unretained(&task_ran)));
+  task_ran.Wait();
+}
+
 #if defined(OS_WIN)
 TEST_P(ThreadPoolWorkerPoolTest, COMMTAWorkerEnvironment) {
   StartWorkerPool(SchedulerWorkerPool::WorkerEnvironment::COM_MTA);
diff --git a/base/threading/scoped_blocking_call.cc b/base/threading/scoped_blocking_call.cc
index f5fcad0..a548e12 100644
--- a/base/threading/scoped_blocking_call.cc
+++ b/base/threading/scoped_blocking_call.cc
@@ -121,7 +121,7 @@
   tls_blocking_observer.Get().Set(blocking_observer);
 }
 
-void ClearBlockingObserverForTesting() {
+void ClearBlockingObserverForCurrentThread() {
   tls_blocking_observer.Get().Set(nullptr);
 }
 
diff --git a/base/threading/scoped_blocking_call.h b/base/threading/scoped_blocking_call.h
index 9161f20..4b3666b 100644
--- a/base/threading/scoped_blocking_call.h
+++ b/base/threading/scoped_blocking_call.h
@@ -160,7 +160,7 @@
 BASE_EXPORT void SetBlockingObserverForCurrentThread(
     BlockingObserver* blocking_observer);
 
-BASE_EXPORT void ClearBlockingObserverForTesting();
+BASE_EXPORT void ClearBlockingObserverForCurrentThread();
 
 // Unregisters the |blocking_observer| on the current thread within its scope.
 // Used in ThreadPool tests to prevent calls to //base sync primitives from
diff --git a/base/threading/scoped_blocking_call_unittest.cc b/base/threading/scoped_blocking_call_unittest.cc
index 3ddf07bb..4c703b5 100644
--- a/base/threading/scoped_blocking_call_unittest.cc
+++ b/base/threading/scoped_blocking_call_unittest.cc
@@ -34,7 +34,7 @@
   }
 
   ~ScopedBlockingCallTest() override {
-    internal::ClearBlockingObserverForTesting();
+    internal::ClearBlockingObserverForCurrentThread();
   }
 
   testing::StrictMock<MockBlockingObserver> observer_;
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py
index 3f2f5df..3766bbbb 100755
--- a/build/android/gyp/compile_resources.py
+++ b/build/android/gyp/compile_resources.py
@@ -15,6 +15,7 @@
 import argparse
 import collections
 import contextlib
+import filecmp
 import multiprocessing.pool
 import os
 import re
@@ -64,20 +65,20 @@
 
   input_opts.add_argument(
       '--aapt2-path', required=True, help='Path to the Android aapt2 tool.')
-  input_opts.add_argument('--android-manifest', required=True,
-                          help='AndroidManifest.xml path')
   input_opts.add_argument(
+      '--android-manifest', required=True, help='AndroidManifest.xml path.')
+  group = input_opts.add_mutually_exclusive_group()
+  group.add_argument(
       '--shared-resources',
       action='store_true',
       help='Make all resources in R.java non-final and allow the resource IDs '
-           'to be reset to a different package index when the apk is loaded by '
-           'another application at runtime.')
-
-  input_opts.add_argument(
+      'to be reset to a different package index when the apk is loaded by '
+      'another application at runtime.')
+  group.add_argument(
       '--app-as-shared-lib',
       action='store_true',
       help='Same as --shared-resources, but also ensures all resource IDs are '
-           'directly usable from the APK loaded as an application.')
+      'directly usable from the APK loaded as an application.')
 
   input_opts.add_argument(
       '--package-id',
@@ -94,7 +95,8 @@
       help='Package name that will be used to determine package ID.')
 
   input_opts.add_argument(
-      '--arsc-package-name', help='Package name to use for resources.arsc file')
+      '--arsc-package-name',
+      help='Package name to use for resources.arsc file.')
 
   input_opts.add_argument(
       '--shared-resources-whitelist',
@@ -112,27 +114,22 @@
 
   input_opts.add_argument(
       '--use-resource-ids-path',
-      help='Use resource IDs generated by aapt --emit-ids')
+      help='Use resource IDs generated by aapt --emit-ids.')
 
-  input_opts.add_argument('--proto-format', action='store_true',
-                          help='Compile resources to protocol buffer format.')
+  input_opts.add_argument(
+      '--support-zh-hk',
+      action='store_true',
+      help='Use zh-rTW resources for zh-rHK.')
 
-  input_opts.add_argument('--support-zh-hk', action='store_true',
-                          help='Use zh-rTW resources for zh-rHK.')
-
-  input_opts.add_argument('--debuggable',
-                          action='store_true',
-                          help='Whether to add android:debuggable="true"')
+  input_opts.add_argument(
+      '--debuggable',
+      action='store_true',
+      help='Whether to add android:debuggable="true".')
 
   input_opts.add_argument('--version-code', help='Version code for apk.')
   input_opts.add_argument('--version-name', help='Version name for apk.')
 
   input_opts.add_argument(
-      '--no-compress',
-      help='disables compression for the given comma-separated list of '
-           'extensions')
-
-  input_opts.add_argument(
       '--locale-whitelist',
       default='[]',
       help='GN list of languages to include. All other language configs will '
@@ -154,21 +151,25 @@
   input_opts.add_argument('--webp-binary', default='',
                           help='Path to the cwebp binary.')
 
-  input_opts.add_argument('--no-xml-namespaces',
-                          action='store_true',
-                          help='Whether to strip xml namespaces from processed '
-                               'xml resources')
+  input_opts.add_argument(
+      '--no-xml-namespaces',
+      action='store_true',
+      help='Whether to strip xml namespaces from processed xml resources.')
+
+  output_opts.add_argument('--arsc-path', help='Apk output for arsc format.')
+  output_opts.add_argument('--proto-path', help='Apk output for proto format.')
+  group = input_opts.add_mutually_exclusive_group()
+  group.add_argument(
+      '--optimized-arsc-path',
+      help='Output for `aapt2 optimize` for arsc format (enables the step).')
+  group.add_argument(
+      '--optimized-proto-path',
+      help='Output for `aapt2 optimize` for proto format (enables the step).')
   input_opts.add_argument(
       '--resources-config-path', help='Path to aapt2 resources config file.')
-  input_opts.add_argument(
-      '--optimized-resources-path',
-      help='Output for `aapt2 optimize` (also enables the step).')
 
-  output_opts.add_argument('--apk-path', required=True,
-                           help='Path to output (partial) apk.')
-
-  output_opts.add_argument('--apk-info-path', required=True,
-                           help='Path to output info file for the partial apk.')
+  output_opts.add_argument(
+      '--info-path', help='Path to output info file for the partial apk.')
 
   output_opts.add_argument('--srcjar-out',
                            help='Path to srcjar to contain generated R.java.')
@@ -176,17 +177,15 @@
   output_opts.add_argument('--r-text-out',
                            help='Path to store the generated R.txt file.')
 
-  output_opts.add_argument('--proguard-file',
-                           help='Path to proguard.txt generated file')
+  output_opts.add_argument(
+      '--proguard-file', help='Path to proguard.txt generated file.')
 
   output_opts.add_argument(
       '--proguard-file-main-dex',
-      help='Path to proguard.txt generated file for main dex')
+      help='Path to proguard.txt generated file for main dex.')
 
   output_opts.add_argument(
-      '--emit-ids-out',
-      help=
-      'Path to file produced by aapt2 --emit-ids (for use with --stable-ids)')
+      '--emit-ids-out', help='Path to file produced by aapt2 --emit-ids.')
 
   options = parser.parse_args(args)
 
@@ -198,9 +197,12 @@
   options.resource_blacklist_exceptions = build_utils.ParseGnList(
       options.resource_blacklist_exceptions)
 
-  if options.shared_resources and options.app_as_shared_lib:
-    raise Exception('Only one of --app-as-shared-lib or --shared-resources '
-                    'can be used.')
+  if options.optimized_proto_path and not options.proto_path:
+    # We could write to a temp file, but it's simpler to require it.
+    parser.error('--optimized-proto-path requires --proto-path')
+
+  if not options.arsc_path and not options.proto_path:
+    parser.error('One of --arsc-path or --proto-path is required.')
 
   if options.package_name_to_id_mapping:
     package_names_list = build_utils.ParseGnList(
@@ -372,54 +374,6 @@
   return package_id
 
 
-def _CreateLinkApkArgs(options):
-  """Create command-line arguments list to invoke 'aapt2 link'.
-
-  Args:
-    options: The command-line options tuple.
-  Returns:
-    A list of strings corresponding to the command-line invokation for
-    the command, matching the arguments from |options|.
-  """
-  link_command = [
-    options.aapt2_path,
-    'link',
-    '--version-code', options.version_code,
-    '--version-name', options.version_name,
-    '--auto-add-overlay',
-    '--no-version-vectors',
-  ]
-
-  for j in options.include_resources:
-    link_command += ['-I', j]
-  if options.proguard_file:
-    link_command += ['--proguard', options.proguard_file]
-  if options.proguard_file_main_dex:
-    link_command += ['--proguard-main-dex', options.proguard_file_main_dex]
-  if options.emit_ids_out:
-    link_command += ['--emit-ids', options.emit_ids_out]
-
-  if options.no_compress:
-    for ext in options.no_compress.split(','):
-      link_command += ['-0', ext]
-
-  # Note: only one of --proto-format, --shared-lib or --app-as-shared-lib
-  #       can be used with recent versions of aapt2.
-  if options.proto_format:
-    link_command.append('--proto-format')
-  elif options.shared_resources:
-    link_command.append('--shared-lib')
-
-  if options.no_xml_namespaces:
-    link_command.append('--no-xml-namespaces')
-
-  package_id = _PackageIdFromOptions(options)
-  if package_id is not None:
-    link_command += ['--package-id', package_id, '--allow-reserved-package-id']
-
-  return link_command
-
-
 def _FixManifest(options, temp_dir):
   """Fix the APK's AndroidManifest.xml.
 
@@ -433,7 +387,7 @@
   Returns:
     Tuple of:
      * Manifest path within |temp_dir|.
-     * Original package_name (if different from arsc_package_name).
+     * Original package_name.
   """
   def maybe_extract_version(j):
     try:
@@ -582,8 +536,7 @@
   return partials
 
 
-def _CreateResourceInfoFile(
-    renamed_paths, apk_info_path, dependencies_res_zips):
+def _CreateResourceInfoFile(renamed_paths, info_path, dependencies_res_zips):
   lines = set()
   for zip_file in dependencies_res_zips:
     zip_info_file_path = zip_file + '.info'
@@ -592,7 +545,7 @@
         lines.update(zip_info_file.readlines())
   for dest, source in renamed_paths.iteritems():
     lines.add('Rename:{},{}\n'.format(dest, source))
-  with build_utils.AtomicOutput(apk_info_path) as info_file:
+  with open(info_path, 'w') as info_file:
     info_file.writelines(sorted(lines))
 
 
@@ -661,19 +614,15 @@
           path, lambda x: x not in shared_names_whitelist)
 
 
-def _PackageApk(options, dep_subdirs, temp_dir, gen_dir, r_txt_path):
-  """Compile resources with aapt2 and generate intermediate .ap_ file.
+def _PackageApk(options, build):
+  """Compile and link resources with aapt2.
 
   Args:
-    options: The command-line options tuple. E.g. the generated apk
-      will be written to |options.apk_path|.
-    dep_subdirs: The list of directories where dependency resource zips
-      were extracted (its content will be altered by this function).
-    temp_dir: A temporary directory.
-    gen_dir: Another temp directory where some intermediate files are
-      generated.
-    r_txt_path: The path where the R.txt file will written to.
+    options: The command-line options.
+    build: BuildContext object.
   """
+  dep_subdirs = resource_utils.ExtractDeps(options.dependencies_res_zips,
+                                           build.deps_dir)
   renamed_paths = dict()
   renamed_paths.update(_DuplicateZhResources(dep_subdirs))
   renamed_paths.update(_RenameLocaleResourceDirs(dep_subdirs))
@@ -698,47 +647,89 @@
   for directory in dep_subdirs:
     renamed_paths.update(_MoveImagesToNonMdpiFolders(directory))
 
-  link_command = _CreateLinkApkArgs(options)
-  # TODO(digit): Is this below actually required for R.txt generation?
-  link_command += ['--java', gen_dir]
+  _CreateResourceInfoFile(renamed_paths, build.info_path,
+                          options.dependencies_res_zips)
 
-  fixed_manifest, orig_package = _FixManifest(options, temp_dir)
+  link_command = [
+      options.aapt2_path,
+      'link',
+      '--version-code',
+      options.version_code,
+      '--version-name',
+      options.version_name,
+      '--auto-add-overlay',
+      '--no-version-vectors',
+  ]
+
+  for j in options.include_resources:
+    link_command += ['-I', j]
+  if options.proguard_file:
+    link_command += ['--proguard', build.proguard_path]
+  if options.proguard_file_main_dex:
+    link_command += ['--proguard-main-dex', build.proguard_main_dex_path]
+  if options.emit_ids_out:
+    link_command += ['--emit-ids', build.emit_ids_path]
+  if options.r_text_in:
+    shutil.copyfile(options.r_text_in, build.r_txt_path)
+  else:
+    link_command += ['--output-text-symbols', build.r_txt_path]
+
+  # Note: only one of --proto-format, --shared-lib or --app-as-shared-lib
+  #       can be used with recent versions of aapt2.
+  if options.shared_resources and not options.proto_path:
+    link_command.append('--shared-lib')
+
+  if options.no_xml_namespaces:
+    link_command.append('--no-xml-namespaces')
+
+  package_id = _PackageIdFromOptions(options)
+  if package_id is not None:
+    link_command += ['--package-id', package_id, '--allow-reserved-package-id']
+
+  fixed_manifest, orig_package = _FixManifest(options, build.temp_dir)
   link_command += [
       '--manifest', fixed_manifest, '--rename-manifest-package', orig_package
   ]
 
-  partials = _CompileDeps(options.aapt2_path, dep_subdirs, temp_dir)
+  # Creates a .zip with AndroidManifest.xml, resources.arsc, res/*
+  # Also creates R.txt
+  if options.use_resource_ids_path:
+    _CreateStableIdsFile(options.use_resource_ids_path, build.stable_ids_path,
+                         orig_package)
+    link_command += ['--stable-ids', build.stable_ids_path]
+
+  partials = _CompileDeps(options.aapt2_path, dep_subdirs, build.temp_dir)
   for partial in partials:
     link_command += ['-R', partial]
 
-  # Creates a .zip with AndroidManifest.xml, resources.arsc, res/*
-  # Also creates R.txt
-  with build_utils.AtomicOutput(options.apk_path) as unoptimized, \
-      build_utils.AtomicOutput(r_txt_path) as r_txt, \
-      _MaybeCreateStableIdsFile(options) as stable_ids:
-    if stable_ids:
-      link_command += ['--stable-ids', stable_ids.name]
-    link_command += ['-o', unoptimized.name]
-    link_command += ['--output-text-symbols', r_txt.name]
-    build_utils.CheckOutput(
-        link_command, print_stdout=False, print_stderr=False)
+  if options.proto_path:
+    link_command += ['--proto-format', '-o', build.proto_path]
+  else:
+    link_command += ['-o', build.arsc_path]
 
-    if options.optimized_resources_path:
-      with build_utils.AtomicOutput(options.optimized_resources_path) as opt:
-        _OptimizeApk(opt.name, options, temp_dir, unoptimized.name, r_txt.name)
+  build_utils.CheckOutput(link_command, print_stdout=False, print_stderr=False)
 
-  _CreateResourceInfoFile(
-      renamed_paths, options.apk_info_path, options.dependencies_res_zips)
+  if options.proto_path and options.arsc_path:
+    build_utils.CheckOutput([
+        options.aapt2_path, 'convert', '-o', build.arsc_path, build.proto_path
+    ])
+
+  if options.optimized_proto_path:
+    _OptimizeApk(build.optimized_proto_path, options, build.temp_dir,
+                 build.proto_path, build.r_txt_path)
+  elif options.optimized_arsc_path:
+    _OptimizeApk(build.optimized_arsc_path, options, build.temp_dir,
+                 build.arsc_path, build.r_txt_path)
 
 
-def _OptimizeApk(output, options, temp_dir, unoptimized_apk_path, r_txt_path):
+def _OptimizeApk(output, options, temp_dir, unoptimized_path, r_txt_path):
   """Optimize intermediate .ap_ file with aapt2.
 
   Args:
     output: Path to write to.
     options: The command-line options.
     temp_dir: A temporary directory.
-    unoptimized_apk_path: path of the apk to optimize.
+    unoptimized_path: path of the apk to optimize.
     r_txt_path: path to the R.txt file of the unoptimized apk.
   """
   # Resources of type ID are references to UI elements/views. They are used by
@@ -763,7 +754,7 @@
       output,
       '--resources-config-path',
       gen_config_path,
-      unoptimized_apk_path,
+      unoptimized_path,
   ]
   build_utils.CheckOutput(
       optimize_command, print_stdout=False, print_stderr=False)
@@ -787,7 +778,7 @@
 
 
 @contextlib.contextmanager
-def _MaybeCreateStableIdsFile(options):
+def _CreateStableIdsFile(in_path, out_path, package_name):
   """Transforms a file generated by --emit-ids from another package.
 
   --stable-ids is generally meant to be used by different versions of the same
@@ -797,55 +788,35 @@
   Note: This will fail if the package ID of the resources in
   |options.use_resource_ids_path| does not match the package ID of the
   resources being linked.
-
-  Args:
-    options: The command-line options
-  Yields:
-    Path to the transformed resource IDs file (lines formatted like
-      package:type/name = 0xPPTTEEEE) or None
   """
-  if options.use_resource_ids_path:
-    package_name = options.package_name
-    if not package_name:
-      package_name = resource_utils.ExtractPackageFromManifest(
-          options.android_manifest)
-    with open(options.use_resource_ids_path) as stable_ids_file:
-      with tempfile.NamedTemporaryFile() as output_ids_file:
-        output_stable_ids = re.sub(
-            r'^.*?:',
-            package_name + ':',
-            stable_ids_file.read(),
-            flags=re.MULTILINE)
-        output_ids_file.write(output_stable_ids)
-        output_ids_file.flush()
-        yield output_ids_file
-  else:
-    yield None
+  with open(in_path) as stable_ids_file:
+    with open(out_path, 'w') as output_ids_file:
+      output_stable_ids = re.sub(
+          r'^.*?:',
+          package_name + ':',
+          stable_ids_file.read(),
+          flags=re.MULTILINE)
+      output_ids_file.write(output_stable_ids)
 
 
-def _WriteFinalRTxtFile(options, aapt_r_txt_path):
-  """Determine final R.txt and return its location.
+def _WriteOutputs(options, build):
+  possible_outputs = [
+      (options.srcjar_out, build.srcjar_path),
+      (options.r_text_out, build.r_txt_path),
+      (options.arsc_path, build.arsc_path),
+      (options.proto_path, build.proto_path),
+      (options.optimized_arsc_path, build.optimized_arsc_path),
+      (options.optimized_proto_path, build.optimized_proto_path),
+      (options.proguard_file, build.proguard_path),
+      (options.proguard_file_main_dex, build.proguard_main_dex_path),
+      (options.emit_ids_out, build.emit_ids_path),
+      (options.info_path, build.info_path),
+  ]
 
-  This handles --r-text-in and --r-text-out options at the same time.
-
-  Args:
-    options: The command-line options tuple.
-    aapt_r_txt_path: The path to the R.txt generated by aapt.
-  Returns:
-    Path to the final R.txt file.
-  """
-  if options.r_text_in:
-    r_txt_file = options.r_text_in
-  else:
-    # When an empty res/ directory is passed, aapt does not write an R.txt.
-    r_txt_file = aapt_r_txt_path
-    if not os.path.exists(r_txt_file):
-      build_utils.Touch(r_txt_file)
-
-  if options.r_text_out:
-    shutil.copyfile(r_txt_file, options.r_text_out)
-
-  return r_txt_file
+  for final, temp in possible_outputs:
+    # Write file only if it's changed.
+    if final and not (os.path.exists(final) and filecmp.cmp(final, temp)):
+      shutil.move(temp, final)
 
 
 def main(args):
@@ -855,18 +826,12 @@
   debug_temp_resources_dir = os.environ.get(_ENV_DEBUG_VARIABLE)
   if debug_temp_resources_dir:
     debug_temp_resources_dir = os.path.join(debug_temp_resources_dir,
-                                            os.path.basename(options.apk_path))
+                                            os.path.basename(options.arsc_path))
     build_utils.DeleteDirectory(debug_temp_resources_dir)
     build_utils.MakeDirectory(debug_temp_resources_dir)
 
   with resource_utils.BuildContext(debug_temp_resources_dir) as build:
-    dep_subdirs = resource_utils.ExtractDeps(options.dependencies_res_zips,
-                                             build.deps_dir)
-
-    _PackageApk(options, dep_subdirs, build.temp_dir, build.gen_dir,
-                build.r_txt_path)
-
-    r_txt_path = _WriteFinalRTxtFile(options, build.r_txt_path)
+    _PackageApk(options, build)
 
     # If --shared-resources-whitelist is used, the all resources listed in
     # the corresponding R.txt file will be non-final, and an onResourcesLoaded()
@@ -887,27 +852,30 @@
       rjava_build_options.GenerateOnResourcesLoaded()
 
     resource_utils.CreateRJavaFiles(
-        build.srcjar_dir, None, r_txt_path, options.extra_res_packages,
+        build.srcjar_dir, None, build.r_txt_path, options.extra_res_packages,
         options.extra_r_text_files, rjava_build_options)
 
     if options.srcjar_out:
-      build_utils.ZipDir(options.srcjar_out, build.srcjar_dir)
+      build_utils.ZipDir(build.srcjar_path, build.srcjar_dir)
 
     # Sanity check that the created resources have the expected package ID.
     expected_id = _PackageIdFromOptions(options)
     if expected_id is None:
       expected_id = '0x00' if options.shared_resources else '0x7f'
     expected_id = int(expected_id, 16)
-    _, package_id = resource_utils.ExtractArscPackage(options.aapt2_path,
-                                                      options.apk_path)
+    _, package_id = resource_utils.ExtractArscPackage(
+        options.aapt2_path,
+        build.arsc_path if options.arsc_path else build.proto_path)
     if package_id != expected_id:
       raise Exception(
           'Invalid package ID 0x%x (expected 0x%x)' % (package_id, expected_id))
 
+    _WriteOutputs(options, build)
+
   if options.depfile:
     build_utils.WriteDepfile(
         options.depfile,
-        options.apk_path,
+        options.arsc_path or options.proto_path,
         inputs=options.dependencies_res_zips + options.extra_r_text_files,
         add_pydeps=False)
 
diff --git a/build/android/gyp/create_size_info_files.py b/build/android/gyp/create_size_info_files.py
index 5b248e4..381a23b 100755
--- a/build/android/gyp/create_size_info_files.py
+++ b/build/android/gyp/create_size_info_files.py
@@ -127,11 +127,10 @@
       action='append',
       help='Same as --assets, except disables compression.')
   parser.add_argument(
-      '--resource-apk',
-      dest='resource_apks',
+      '--in-res-info-path',
       required=True,
       action='append',
-      help='An .ap_ file built using aapt')
+      help='Paths to .ap_.info files')
 
   options = parser.parse_args(args)
 
@@ -143,7 +142,7 @@
   jar_inputs = _FindJarInputs(set(options.jar_files))
   pak_inputs = _PakInfoPathsForAssets(options.assets +
                                       options.uncompressed_assets)
-  res_inputs = [p + '.info' for p in options.resource_apks]
+  res_inputs = options.in_res_info_path
 
   # Don't bother re-running if no .info files have changed (saves ~250ms).
   md5_check.CallAndRecordIfStale(
diff --git a/build/android/gyp/util/resource_utils.py b/build/android/gyp/util/resource_utils.py
index 61a4f3c..fc6249a 100644
--- a/build/android/gyp/util/resource_utils.py
+++ b/build/android/gyp/util/resource_utils.py
@@ -599,11 +599,21 @@
     # A location to place aapt-generated files.
     self.gen_dir = os.path.join(self.temp_dir, 'gen')
     os.mkdir(self.gen_dir)
-    # Location of the generated R.txt file.
-    self.r_txt_path = os.path.join(self.gen_dir, 'R.txt')
     # A location to place generated R.java files.
     self.srcjar_dir = os.path.join(self.temp_dir, 'java')
     os.mkdir(self.srcjar_dir)
+    # Temporary file locacations.
+    self.r_txt_path = os.path.join(self.gen_dir, 'R.txt')
+    self.srcjar_path = os.path.join(self.temp_dir, 'R.srcjar')
+    self.info_path = os.path.join(self.temp_dir, 'size.info')
+    self.stable_ids_path = os.path.join(self.temp_dir, 'in_ids.txt')
+    self.emit_ids_path = os.path.join(self.temp_dir, 'out_ids.txt')
+    self.proguard_path = os.path.join(self.temp_dir, 'keeps.flags')
+    self.proguard_main_dex_path = os.path.join(self.temp_dir, 'maindex.flags')
+    self.arsc_path = os.path.join(self.temp_dir, 'out.ap_')
+    self.proto_path = os.path.join(self.temp_dir, 'out.proto.ap_')
+    self.optimized_arsc_path = os.path.join(self.temp_dir, 'out.opt.ap_')
+    self.optimized_proto_path = os.path.join(self.temp_dir, 'out.opt.proto.ap_')
 
   def Close(self):
     """Close the context and destroy all temporary files."""
diff --git a/build/android/gyp/write_build_config.py b/build/android/gyp/write_build_config.py
index 68dfac4..a0cd13f 100755
--- a/build/android/gyp/write_build_config.py
+++ b/build/android/gyp/write_build_config.py
@@ -924,6 +924,7 @@
   parser.add_option('--final-dex-path',
                     help='Path to final input classes.dex (or classes.zip) to '
                     'use in final apk.')
+  parser.add_option('--res-size-info', help='Path to .ap_.info')
   parser.add_option('--apk-proto-resources',
                     help='Path to resources compiled in protocol buffer format '
                          ' for this apk.')
@@ -962,7 +963,7 @@
       'android_apk': ['build_config', 'dex_path', 'final_dex_path'] + \
           jar_path_options,
       'android_app_bundle_module': ['build_config', 'dex_path',
-          'final_dex_path'] + jar_path_options,
+          'final_dex_path', 'res_size_info'] + jar_path_options,
       'android_assets': ['build_config'],
       'android_resources': ['build_config', 'resources_zip'],
       'dist_aar': ['build_config'],
@@ -1277,6 +1278,8 @@
     if options.type == 'android_apk' and options.tested_apk_config:
       config['resources']['arsc_package_name'] = (
           tested_apk_config['package_name'])
+    if options.res_size_info:
+      config['resources']['size_info'] = options.res_size_info
 
   if is_apk_or_module_target:
     deps_dex_files = [c['dex_path'] for c in all_library_deps]
diff --git a/build/android/resource_sizes.py b/build/android/resource_sizes.py
index c91cfa9..db4d089 100755
--- a/build/android/resource_sizes.py
+++ b/build/android/resource_sizes.py
@@ -206,7 +206,7 @@
     if not out_dir:
       print('Skipping resources.arsc normalization (output directory required)')
       return 0
-    ap_name = os.path.basename(apk_path).replace('.apk', '.intermediate.ap_')
+    ap_name = os.path.basename(apk_path).replace('.apk', '.ap_')
     ap_path = os.path.join(out_dir, 'arsc/apks', ap_name)
     if not os.path.exists(ap_path):
       raise Exception('Missing expected file: %s, try rebuilding.' % ap_path)
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index 0a61fea..d583667f 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -313,18 +313,21 @@
         rebase_path(invoker.r_text, root_build_dir),
       ]
     }
-
+    if (defined(invoker.res_size_info_path)) {
+      args += [
+        "--res-size-info",
+        rebase_path(invoker.res_size_info_path, root_build_dir),
+      ]
+    }
     if (defined(invoker.resource_dirs)) {
       resource_dirs = rebase_path(invoker.resource_dirs, root_build_dir)
       args += [ "--resource-dirs=$resource_dirs" ]
     }
-
     if (defined(invoker.proto_resources_path)) {
       _rebased_proto_resources =
           rebase_path(invoker.proto_resources_path, root_build_dir)
       args += [ "--apk-proto-resources=$_rebased_proto_resources" ]
     }
-
     if (defined(invoker.module_rtxt_path)) {
       _rebased_rtxt_path = rebase_path(invoker.module_rtxt_path, root_build_dir)
       args += [ "--module-rtxt-path=$_rebased_rtxt_path" ]
@@ -2094,9 +2097,6 @@
   #
   #   post_process_script: (optional)
   #
-  #   proto_format: (optional). If true, compiles resources into protocol
-  #     buffer format.
-  #
   #   package_name: (optional)
   #     Name of the package for the purpose of assigning package ID.
   #
@@ -2115,7 +2115,13 @@
   #     used in AndroidManifest.xml.
   #
   # Output variables:
-  #   output:  Path to a zip file containing the compiled resources.
+  #   arsc_output: Path to output .ap_ file (optional).
+  #
+  #   proto_output: Path to output .proto.ap_ file (optional).
+  #
+  #   optimized_arsc_output: Path to optimized .ap_ file (optional).
+  #
+  #   optimized_proto_output: Path to optimized .proto.ap_ file (optional).
   #
   #   r_text_out_path: (optional):
   #       Path for the corresponding generated R.txt file.
@@ -2129,24 +2135,30 @@
   #
   #   proguard_file_main_dex: (optional)
   #
-  #
   template("compile_resources") {
     _compile_resources_target_name = target_name
-    _compiled_resources_path = invoker.output
-
+    if (defined(invoker.arsc_output)) {
+      _arsc_output = invoker.arsc_output
+    }
+    if (defined(invoker.optimized_arsc_output)) {
+      _optimized_arsc_output = invoker.optimized_arsc_output
+    }
     if (defined(invoker.srcjar_path)) {
       _srcjar_path = invoker.srcjar_path
     }
     if (defined(invoker.post_process_script)) {
       _compile_resources_target_name = "${target_name}__intermediate"
-      _compiled_resources_path =
-          get_path_info(_compiled_resources_path, "dir") + "/" +
-          get_path_info(_compiled_resources_path, "name") + ".intermediate.ap_"
       _srcjar_path = "${_srcjar_path}.intermediate.srcjar"
+      _intermediate_path =
+          get_path_info(_arsc_output, "dir") + "/" +
+          get_path_info(_arsc_output, "name") + ".intermediate.ap_"
+      if (defined(_optimized_arsc_output)) {
+        _optimized_arsc_output = _intermediate_path
+      } else {
+        _arsc_output = _intermediate_path
+      }
     }
 
-    _proto_format = defined(invoker.proto_format) && invoker.proto_format
-
     # NOTE: Regarding the names of the depfiles used by this template:
     #       They all have the same prefix, related to invoker.target_name,
     #       instead of $target_name, so it is important they have different
@@ -2156,7 +2168,6 @@
     #
     #       _1.d for the unprocessed compiled resources.
     #       _2.d for the optional processed compiled resources.
-    #       _3.d for the proto-compiled resources.
 
     action_with_pydeps(_compile_resources_target_name) {
       set_sources_assignment_filter([])
@@ -2171,16 +2182,9 @@
       depfile = "$target_gen_dir/${invoker.target_name}_1.d"
       outputs = []
 
-      _android_aapt_path = android_default_aapt_path
-      _android_aapt2_path = android_sdk_tools_bundle_aapt2
-      if (_proto_format) {
-        depfile = "$target_gen_dir/${invoker.target_name}_3.d"
-      }
-
       inputs = [
         invoker.build_config,
-        _android_aapt_path,
-        _android_aapt2_path,
+        android_sdk_tools_bundle_aapt2,
       ]
 
       _rebased_build_config = rebase_path(invoker.build_config, root_build_dir)
@@ -2190,7 +2194,7 @@
         rebase_path(depfile, root_build_dir),
         "--include-resources=@FileArg($_rebased_build_config:android:sdk_jars)",
         "--aapt2-path",
-        rebase_path(_android_aapt2_path, root_build_dir),
+        rebase_path(android_sdk_tools_bundle_aapt2, root_build_dir),
         "--dependencies-res-zips=@FileArg($_rebased_build_config:resources:dependency_zips)",
         "--extra-res-packages=@FileArg($_rebased_build_config:resources:extra_package_names)",
         "--extra-r-text-files=@FileArg($_rebased_build_config:resources:extra_r_text_files)",
@@ -2201,11 +2205,9 @@
         "--android-manifest",
         rebase_path(invoker.android_manifest, root_build_dir),
       ]
-
       if (defined(invoker.no_xml_namespaces) && invoker.no_xml_namespaces) {
         args += [ "--no-xml-namespaces" ]
       }
-
       if (defined(invoker.version_code)) {
         args += [
           "--version-code",
@@ -2218,34 +2220,47 @@
           invoker.version_name,
         ]
       }
-      if (defined(_compiled_resources_path)) {
-        _info_path = invoker.output + ".info"
-        outputs += [
-          _compiled_resources_path,
-          _info_path,
-        ]
+      if (defined(_arsc_output)) {
+        outputs += [ _arsc_output ]
         args += [
-          "--apk-path",
-          rebase_path(_compiled_resources_path, root_build_dir),
-          "--apk-info-path",
-          rebase_path(_info_path, root_build_dir),
+          "--arsc-path",
+          rebase_path(_arsc_output, root_build_dir),
         ]
       }
-
-      if (defined(invoker.optimized_resources_path)) {
+      if (defined(invoker.proto_output)) {
+        outputs += [ invoker.proto_output ]
         args += [
-          "--optimized-resources-path",
-          rebase_path(invoker.optimized_resources_path, root_build_dir),
+          "--proto-path",
+          rebase_path(invoker.proto_output, root_build_dir),
         ]
-        outputs += [ invoker.optimized_resources_path ]
-
-        if (defined(invoker.resources_config_path)) {
-          inputs += [ invoker.resources_config_path ]
-          args += [
-            "--resources-config-path",
-            rebase_path(invoker.resources_config_path, root_build_dir),
-          ]
-        }
+      }
+      if (defined(invoker.size_info_path)) {
+        outputs += [ invoker.size_info_path ]
+        args += [
+          "--info-path",
+          rebase_path(invoker.size_info_path, root_build_dir),
+        ]
+      }
+      if (defined(_optimized_arsc_output)) {
+        outputs += [ _optimized_arsc_output ]
+        args += [
+          "--optimized-arsc-path",
+          rebase_path(_optimized_arsc_output, root_build_dir),
+        ]
+      }
+      if (defined(invoker.optimized_proto_output)) {
+        outputs += [ invoker.optimized_proto_output ]
+        args += [
+          "--optimized-proto-path",
+          rebase_path(invoker.optimized_proto_output, root_build_dir),
+        ]
+      }
+      if (defined(invoker.resources_config_path)) {
+        inputs += [ invoker.resources_config_path ]
+        args += [
+          "--resources-config-path",
+          rebase_path(invoker.resources_config_path, root_build_dir),
+        ]
       }
 
       # Useful to have android:debuggable in the manifest even for Release
@@ -2277,10 +2292,6 @@
         ]
       }
 
-      if (_proto_format) {
-        args += [ "--proto-format" ]
-      }
-
       # Define the flags related to shared resources.
       #
       # Note the small sanity check to ensure that the package ID of the
@@ -2400,15 +2411,24 @@
         args = [
           "--depfile",
           rebase_path(depfile, root_build_dir),
-          "--apk-path",
-          rebase_path(_compiled_resources_path, root_build_dir),
-          "--output",
-          rebase_path(invoker.output, root_build_dir),
           "--srcjar-in",
           rebase_path(_srcjar_path, root_build_dir),
           "--srcjar-out",
           rebase_path(invoker.srcjar_path, root_build_dir),
         ]
+        if (defined(_optimized_arsc_output)) {
+          _input_apk = _optimized_arsc_output
+          _output_apk = invoker.optimized_arsc_output
+        } else {
+          _input_apk = _arsc_output
+          _output_apk = invoker.arsc_output
+        }
+        args += [
+          "--apk-path",
+          rebase_path(_input_apk, root_build_dir),
+          "--output",
+          rebase_path(_output_apk, root_build_dir),
+        ]
         if (defined(invoker.shared_resources_whitelist)) {
           args += [
             "--r-text-whitelist",
@@ -2418,14 +2438,14 @@
           ]
         }
         inputs = [
+          _input_apk,
           _srcjar_path,
-          _compiled_resources_path,
         ]
         if (defined(invoker.post_process_script_inputs)) {
           inputs += invoker.post_process_script_inputs
         }
         outputs = [
-          invoker.output,
+          _output_apk,
           invoker.srcjar_path,
         ]
         public_deps = [
@@ -2441,7 +2461,7 @@
   #   build_config: Path to APK's build config file. Used to extract the
   #       list of input .jar files from its dependencies.
   #   name: Name of the apk or app bundle (e.g. "Foo.apk").
-  #   packaged_resources_path: Path to .ap_ file.
+  #   res_size_info_path: Path to input .ap_.info file (for apks).
   #
   template("create_size_info_files") {
     action_with_pydeps(target_name) {
@@ -2478,7 +2498,7 @@
           args += [
             "--jar-files=@FileArg($_rebased_build_config:deps_info:unprocessed_jar_path)",
             "--jar-files=@FileArg($_rebased_build_config:deps_info:javac_full_classpath)",
-            "--resource-apk=@FileArg($_rebased_build_config:deps_info:proto_resources_path)",
+            "--in-res-info-path=@FileArg($_rebased_build_config:resources:size_info)",
             "--assets=@FileArg($_rebased_build_config:assets)",
             "--uncompressed-assets=@FileArg($_rebased_build_config:uncompressed_assets)",
           ]
@@ -2486,15 +2506,15 @@
       } else {
         inputs = [
           invoker.build_config,
-          invoker.packaged_resources_path,
+          invoker.res_size_info_path,
         ]
         _rebased_build_config =
             rebase_path(invoker.build_config, root_build_dir)
         args += [
           "--jar-files=@FileArg($_rebased_build_config:deps_info:jar_path)",
           "--jar-files=@FileArg($_rebased_build_config:deps_info:javac_full_classpath)",
-          "--resource-apk",
-          rebase_path(invoker.packaged_resources_path, root_build_dir),
+          "--in-res-info-path",
+          rebase_path(invoker.res_size_info_path, root_build_dir),
           "--assets=@FileArg($_rebased_build_config:assets)",
           "--uncompressed-assets=@FileArg($_rebased_build_config:uncompressed_assets)",
         ]
@@ -3359,6 +3379,7 @@
               "extra_shared_libraries",
               "final_dex_path",
               "native_lib_placeholders",
+              "res_size_info_path",
               "secondary_abi_shared_libraries_runtime_deps_file",
               "secondary_native_lib_placeholders",
               "shared_libraries_runtime_deps_file",
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 08f33eb..02ec843 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -2070,7 +2070,10 @@
 
     _is_bundle_module =
         defined(invoker.is_bundle_module) && invoker.is_bundle_module
-    _is_base_module = defined(invoker.is_base_module) && invoker.is_base_module
+    if (_is_bundle_module) {
+      _is_base_module =
+          defined(invoker.is_base_module) && invoker.is_base_module
+    }
 
     _enable_multidex =
         !defined(invoker.enable_multidex) || invoker.enable_multidex
@@ -2084,34 +2087,36 @@
     if (!_is_bundle_module) {
       _final_rtxt_path = "${_final_apk_path}.R.txt"
     }
+    _res_size_info_path = "$target_out_dir/$target_name.ap_.info"
     _final_apk_path_no_ext_list =
         process_file_template([ _final_apk_path ],
                               "{{source_dir}}/{{source_name_part}}")
     _final_apk_path_no_ext = _final_apk_path_no_ext_list[0]
     assert(_final_apk_path_no_ext != "")  # Mark as used.
 
+    _optimize_resources =
+        defined(invoker.optimize_resources) && invoker.optimize_resources
+
     # Non-base bundle modules create only proto resources.
     if (!_is_bundle_module || _is_base_module) {
-      _packaged_resources_path = "$target_out_dir/$target_name.ap_"
+      _arsc_resources_path = "$target_out_dir/$target_name.ap_"
     }
     if (_is_bundle_module) {
       # Path to the intermediate proto-format resources zip file.
-      _proto_resources_path = "$target_gen_dir/$target_name.proto.ap_"
+      _proto_resources_path = "$target_out_dir/$target_name.proto.ap_"
+      if (_optimize_resources) {
+        _optimized_proto_resources_path =
+            "$target_out_dir/$target_name.optimized.proto.ap_"
+      }
     } else {
       # resource_sizes.py needs to be able to find the unpacked resources.arsc
       # file based on apk name to compute normatlized size.
       _resource_sizes_arsc_path =
           "$root_out_dir/arsc/" +
           rebase_path(_final_apk_path_no_ext, root_build_dir) + ".ap_"
-    }
-    _optimize_resources =
-        defined(invoker.optimize_resources) && invoker.optimize_resources
-    if (_optimize_resources) {
-      _optimized_resources_path = "$target_out_dir/$_template_name.optimized."
-      if (_is_bundle_module) {
-        _optimized_resources_path += ".proto.ap_"
-      } else {
-        _optimized_resources_path += ".ap_"
+      if (_optimize_resources) {
+        _optimized_arsc_resources_path =
+            "$target_out_dir/$target_name.optimized.ap_"
       }
     }
 
@@ -2358,6 +2363,7 @@
       srcjar_path = "${target_gen_dir}/${target_name}.srcjar"
       r_text_out_path = _compile_resources_rtxt_out
       emit_ids_out_path = _compile_resources_emit_ids_out
+      size_info_path = _res_size_info_path
       proguard_file = _generated_proguard_config
       if (_enable_main_dex_list) {
         proguard_file_main_dex = _generated_proguard_main_dex_config
@@ -2382,28 +2388,37 @@
         assert(!defined(resource_ids_provider_dep))
         resource_ids_provider_dep = invoker.apk_under_test
 
-        deps += [ "${invoker.apk_under_test}__compile_resources" ]
         include_resource =
             get_label_info(invoker.apk_under_test, "target_out_dir") + "/" +
             get_label_info(invoker.apk_under_test, "name") + ".ap_"
+        _link_against = invoker.apk_under_test
       }
 
       if (_is_bundle_module) {
-        proto_format = true
-        output = _proto_resources_path
+        proto_output = _proto_resources_path
+        if (_optimize_resources) {
+          optimized_proto_output = _optimized_proto_resources_path
+        }
 
         if (defined(invoker.base_module_target)) {
-          deps += [ "${invoker.base_module_target}__compile_arsc_resources" ]
           include_resource =
               get_label_info(invoker.base_module_target, "target_out_dir") +
               "/" + get_label_info(invoker.base_module_target, "name") + ".ap_"
+          _link_against = invoker.base_module_target
         }
-      } else {
-        output = _packaged_resources_path
+      } else if (_optimize_resources) {
+        optimized_arsc_output = _optimized_arsc_resources_path
       }
 
-      if (_optimize_resources) {
-        optimized_resources_path = _optimized_resources_path
+      if (defined(_link_against)) {
+        deps += [ "${_link_against}__compile_resources" ]
+        include_resource = get_label_info(_link_against, "target_out_dir") +
+                           "/" + get_label_info(_link_against, "name") + ".ap_"
+      }
+
+      # Bundle modules have to reference resources from the base module.
+      if (!_is_bundle_module || _is_base_module) {
+        arsc_output = _arsc_resources_path
       }
 
       if (defined(invoker.shared_resources_whitelist_target)) {
@@ -2422,7 +2437,7 @@
 
         # resource_sizes.py doesn't care if it gets the optimized .arsc.
         sources = [
-          _packaged_resources_path,
+          _arsc_resources_path,
         ]
         outputs = [
           _resource_sizes_arsc_path,
@@ -2453,38 +2468,6 @@
       _final_deps += [ ":$_copy_rtxt_target" ]
     }
 
-    if (_is_base_module && _is_bundle_module) {
-      # Bundle modules have to reference resources from the base module.
-      # However, to compile the bundle module's resources we have to give it an
-      # arsc resource to link against (aapt2 fails with proto resources). Thus,
-      # add an arsc resource compilation step to make the bundle module's link
-      # step work.
-      compile_resources("${_template_name}__compile_arsc_resources") {
-        forward_variables_from(invoker,
-                               [
-                                 "support_zh_hk",
-                                 "aapt_locale_whitelist",
-                                 "resource_blacklist_regex",
-                                 "resource_blacklist_exceptions",
-                                 "png_to_webp",
-                                 "no_xml_namespaces",
-                               ])
-        android_manifest = _android_manifest
-        version_code = _version_code
-        version_name = _version_name
-
-        proto_format = false
-        output = _packaged_resources_path
-
-        build_config = _build_config
-        deps = _deps + [
-                 ":$_merge_manifest_target",
-                 ":$_build_config_target",
-                 _android_sdk_dep,
-               ]
-      }
-    }
-
     _srcjar_deps += [ ":$_compile_resources_target" ]
 
     if (_native_libs_deps != [] || _secondary_abi_native_libs_deps != []) {
@@ -2643,6 +2626,7 @@
                              ])
       if (_is_bundle_module) {
         type = "android_app_bundle_module"
+        res_size_info_path = _res_size_info_path
       } else {
         type = "android_apk"
       }
@@ -2818,7 +2802,7 @@
           create_size_info_files(_size_info_target) {
             name = "${invoker.name}.apk"
             build_config = _build_config
-            packaged_resources_path = _packaged_resources_path
+            res_size_info_path = _res_size_info_path
             deps = _deps + [
                      ":$_build_config_target",
                      ":$_compile_resources_target",
@@ -2853,9 +2837,12 @@
                                  "write_asset_list",
                                  "uncompress_dex",
                                ])
-        packaged_resources_path = _packaged_resources_path
-        if (_optimize_resources) {
-          optimized_resources_path = _optimized_resources_path
+        packaged_resources_path = _arsc_resources_path
+
+        if (_optimize_resources && _is_bundle_module) {
+          optimized_resources_path = _optimized_proto_resources_path
+        } else if (_optimize_resources) {
+          optimized_resources_path = _optimized_arsc_resources_path
         }
 
         apk_path = _final_apk_path
diff --git a/cc/scheduler/compositor_frame_reporting_controller.cc b/cc/scheduler/compositor_frame_reporting_controller.cc
index f1587ed..1b17021 100644
--- a/cc/scheduler/compositor_frame_reporting_controller.cc
+++ b/cc/scheduler/compositor_frame_reporting_controller.cc
@@ -31,8 +31,8 @@
 
 void CompositorFrameReportingController::WillBeginMainFrame() {
   DCHECK(reporters_[PipelineStage::kBeginImplFrame]);
-  DCHECK_NE(reporters_[PipelineStage::kBeginMainFrame],
-            reporters_[PipelineStage::kBeginImplFrame]);
+  DCHECK(reporters_[PipelineStage::kBeginMainFrame] !=
+         reporters_[PipelineStage::kBeginImplFrame]);
   reporters_[PipelineStage::kBeginImplFrame]->StartStage(
       "SendBeginMainFrameToCommit");
   AdvanceReporterStage(PipelineStage::kBeginImplFrame,
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb
index 5ccefaf..78f3e397 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_es.xtb
@@ -2,13 +2,18 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="es">
 <translation id="1135993792949700405">Chrome enviará la información personal que hayas seleccionado a <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1625889395409731085">¿Quieres abrir el enlace externo?</translation>
 <translation id="3604604794717279723">Acepto</translation>
+<translation id="4437727785356380473">Se ha cerrado el Asistente de Google en Chrome.</translation>
 <translation id="4850886885716139402">Ver</translation>
 <translation id="5014174725590676422">Se muestra la primera pantalla de ejecución del Asistente de Google en Chrome</translation>
 <translation id="5188078772080029703">Chrome enviará a Google la URL y el contenido del sitio web, así como tu correo electrónico y el tipo de tarjeta de crédito guardada en Chrome. Puedes desactivar esta opción en los ajustes de Chrome. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
+<translation id="5267269112080050255">Se ha abierto el Asistente de Google en Chrome de forma que ocupa toda la pantalla.</translation>
+<translation id="6555233628095991027">Se ha abierto el Asistente de Google en Chrome en la mitad inferior de la pantalla.</translation>
 <translation id="6973932557599545801">Lo siento, no puedo ayudarte. Puedes continuar por tu cuenta.</translation>
 <translation id="7658239707568436148">Cancelar</translation>
 <translation id="7871791972254842204">Leer y aceptar los términos y condiciones de <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> en otro momento</translation>
+<translation id="8253702004019660079">Asistente de Google en Chrome</translation>
 <translation id="8723954843026426558">Acepto los términos y condiciones, la política de privacidad y el derecho de cancelación de <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="9138504265731110181">El Asistente de Google te permite ahorrar tiempo ayudándote en el proceso de compra de los sitios web</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb
index d229a13..e9a20b5 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_fil.xtb
@@ -2,13 +2,18 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="fil">
 <translation id="1135993792949700405">Ipapadala ng Chrome sa <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> ang napili mong personal na data</translation>
+<translation id="1625889395409731085">Buksan ang external na link?</translation>
 <translation id="3604604794717279723">Tinatanggap ko</translation>
+<translation id="4437727785356380473">Nakasara ang Google Assistant sa Chrome.</translation>
 <translation id="4850886885716139402">View</translation>
 <translation id="5014174725590676422">Ipinapakita ang screen ng unang pagtakbo ng Google Assistant sa Chrome</translation>
 <translation id="5188078772080029703">Ipapadala ng Chrome sa Google ang URL at content ng site pati na rin ang iyong email at uri ng credit card na naka-save sa Chrome. Puwede mo itong i-off sa mga setting ng Chrome. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation>
+<translation id="5267269112080050255">Nakabukas ang Google Assistant sa Chrome nang buo ang taas.</translation>
+<translation id="6555233628095991027">Nakabukas ang Google Assistant sa Chrome nang kalahati ang taas.</translation>
 <translation id="6973932557599545801">Paumanhin, hindi ako makatulong. Magpatuloy nang mag-isa.</translation>
 <translation id="7658239707568436148">Kanselahin</translation>
 <translation id="7871791972254842204">Basahin at sumang-ayon sa mga tuntunin at kundisyon sa <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> sa ibang pagkakataon</translation>
+<translation id="8253702004019660079">Google Assistant sa Chrome.</translation>
 <translation id="8723954843026426558">Sumasang-ayon ako sa mga tuntunin at kundisyon, patakaran sa privacy, at karapatang umalis ng <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="9138504265731110181">Nakakatipid ka ng oras sa Google Assistant sa pamamagitan ng pagtulong sa iyong mag-check out sa web</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ml.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ml.xtb
index af669f0..bf6acd43 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ml.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ml.xtb
@@ -2,13 +2,18 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ml">
 <translation id="1135993792949700405">നിങ്ങൾ തിരഞ്ഞെടുത്ത വ്യക്തിപരമായ ഡാറ്റ Chrome <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> എന്നതിലേക്ക് അയയ്ക്കും</translation>
+<translation id="1625889395409731085">ബാഹ്യ ലിങ്ക് തുറക്കണോ?</translation>
 <translation id="3604604794717279723">ഞാന്‍ അംഗീകരിക്കുന്നു</translation>
+<translation id="4437727785356380473">Chrome-ൽ Google അസിസ്‌റ്റന്റ് അടച്ചു.</translation>
 <translation id="4850886885716139402">കാണുക</translation>
 <translation id="5014174725590676422">Chrome-ലെ Google അസിസ്‌റ്റന്‍റ്, ആദ്യ റൺ സ്‌ക്രീൻ കാണിക്കുന്നു</translation>
 <translation id="5188078772080029703">സൈറ്റിൻ്റെ URL, ഉള്ളടക്കം എന്നിവയും നിങ്ങൾ Google-ലേക്ക് Chrome-ൽ സംരക്ഷിച്ചിരിക്കുന്ന ഇമെയിൽ, ക്രെഡിറ്റ് കാർഡ് തരം എന്നിവയും Chrome അയയ്‌ക്കും. Chrome ക്രമീകരണത്തിൽ നിങ്ങൾക്കിത് ഓഫാക്കാം. <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
+<translation id="5267269112080050255">Chrome-ൽ Google അസിസ്‌റ്റന്റ് മുഴുവൻ ഉയരത്തിൽ തുറന്നു.</translation>
+<translation id="6555233628095991027">Chrome-ൽ Google അസിസ്‌റ്റന്റ് പകുതി ഉയരത്തിൽ തുറന്നു.</translation>
 <translation id="6973932557599545801">ക്ഷമിക്കണം, എനിക്ക് സഹായിക്കാൻ കഴിയില്ല, സ്വയം പൂരിപ്പിക്കുക.</translation>
 <translation id="7658239707568436148">റദ്ദാക്കൂ</translation>
 <translation id="7871791972254842204">പിന്നീട് <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> എന്നതിലെ നയങ്ങളും നിബന്ധനകളും വായിച്ച് അംഗീകരിക്കുക</translation>
+<translation id="8253702004019660079">Chrome-ലെ Google അസിസ്‌റ്റന്റ്.</translation>
 <translation id="8723954843026426558">നയങ്ങളും നിബന്ധനകളും, സ്വകാര്യതാ നയം, <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />-ന്‍റെ റദ്ദാക്കാനുള്ള അവകാശം എന്നിവ ഞാൻ അംഗീകരിക്കുന്നു.</translation>
 <translation id="9138504265731110181">വെബ്‌സൈറ്റിലെ തിരയൽ വേഗത്തിലാക്കി Google അസിസ്‌റ്റന്‍റ് നിങ്ങളുടെ സമയം ലാഭിക്കുന്നു</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb
index 92da558..0477efc 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_no.xtb
@@ -2,13 +2,18 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="no">
 <translation id="1135993792949700405">Chrome sender personopplysningene du har valgt, til <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
+<translation id="1625889395409731085">Vil du åpne den eksterne linken?</translation>
 <translation id="3604604794717279723">Godta</translation>
+<translation id="4437727785356380473">Google-assistenten i Chrome er lukket.</translation>
 <translation id="4850886885716139402">Visning</translation>
 <translation id="5014174725590676422">Skjermen for første kjøring av Google-assistenten i Chrome vises</translation>
 <translation id="5188078772080029703">Chrome sender nettstedets nettadresse og innhold, samt e-postadressen din og kredittkorttypen som er lagret i Chrome, til Google. Du kan slå av dette i Chrome-innstillingene. <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
+<translation id="5267269112080050255">Google-assistenten i Chrome er åpnet i full høyde.</translation>
+<translation id="6555233628095991027">Google-assistenten i Chrome er åpnet i halv høyde.</translation>
 <translation id="6973932557599545801">Beklager, jeg kan ikke hjelpe deg. Fortsett på egen hånd.</translation>
 <translation id="7658239707568436148">Avbryt</translation>
 <translation id="7871791972254842204">Les og godta vilkårene på <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> senere</translation>
+<translation id="8253702004019660079">Google-assistenten i Chrome.</translation>
 <translation id="8723954843026426558">Jeg godtar vilkårene, personvernreglene og angreretten for <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /></translation>
 <translation id="9138504265731110181">Google-assistenten sparer tid ved å hjelpe deg med betalinger på nettet</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
index 4a084c6c..57f7148 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_ru.xtb
@@ -2,13 +2,18 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="ru">
 <translation id="1135993792949700405">Персональные данные, выбранные вами для автозаполнения, будут переданы <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />.</translation>
+<translation id="1625889395409731085">Открыть внешнюю ссылку?</translation>
 <translation id="3604604794717279723">Принимаю</translation>
+<translation id="4437727785356380473">Окно Google Ассистента в Chrome закрыто.</translation>
 <translation id="4850886885716139402">Посмотреть</translation>
 <translation id="5014174725590676422">Показан экран первого запуска Google Ассистента в Chrome</translation>
 <translation id="5188078772080029703">URL сайта и его содержимое, а также адрес электронной почты и тип кредитной карты, сохраненные в Chrome, будут переданы в Google. Вы можете отключить эти параметры в настройках Chrome. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
+<translation id="5267269112080050255">Окно Google Ассистента открыто на весь экран в Chrome.</translation>
+<translation id="6555233628095991027">Окно Google Ассистента в Chrome открыто наполовину.</translation>
 <translation id="6973932557599545801">Извините, я ничем не могу помочь. Продолжите самостоятельно.</translation>
 <translation id="7658239707568436148">Отмена</translation>
 <translation id="7871791972254842204">Прочитать и принять Условия использования (<ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />) позже.</translation>
+<translation id="8253702004019660079">Google Ассистент в Chrome</translation>
 <translation id="8723954843026426558">Я соглашаюсь с Условиями использования и Политикой конфиденциальности сайта <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />, а также понимаю, что у меня есть право на отзыв данного согласия.</translation>
 <translation id="9138504265731110181">Google Ассистент экономит ваше время, помогая оформлять заказы в Интернете.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb
index 460f558..7a3304a 100644
--- a/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb
+++ b/chrome/android/features/autofill_assistant/java/strings/translations/android_chrome_autofill_assistant_strings_te.xtb
@@ -2,13 +2,18 @@
 <!DOCTYPE translationbundle>
 <translationbundle lang="te">
 <translation id="1135993792949700405">Chrome మీరు ఎంచుకున్న వ్యక్తిగత డేటాను <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />కు పంపుతుంది</translation>
+<translation id="1625889395409731085">బాహ్య లింక్‌ను తెరవాలా?</translation>
 <translation id="3604604794717279723">నేను ఆమోదిస్తున్నాను</translation>
+<translation id="4437727785356380473">Chromeలో Google అసిస్టెంట్ మూసివేయబడింది.</translation>
 <translation id="4850886885716139402">వీక్షణ</translation>
 <translation id="5014174725590676422">Chromeలో Google అసిస్టెంట్ మొదటి అమలు స్క్రీన్ చూపబడింది</translation>
 <translation id="5188078772080029703">Chrome ఈ సైట్ యొక్క URL మరియు కంటెంట్‌తో పాటు Chromeలో సేవ్ చేసిన మీ ఇమెయిల్ మరియు క్రెడిట్ కార్డ్ రకాన్ని Googleకు పంపుతుంది. మీరు Chrome సెట్టింగ్‌లలో దీన్ని ఆఫ్ చేయవచ్చు. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
+<translation id="5267269112080050255">Chromeలో Google అసిస్టెంట్ పూర్తి ఎత్తులో తెరవబడింది.</translation>
+<translation id="6555233628095991027">Chromeలో Google అసిస్టెంట్ సగం ఎత్తులో తెరవబడింది.</translation>
 <translation id="6973932557599545801">క్షమించండి నేను సహాయం చేయలేకపోయాను, దయచేసి మీరే స్వంతంగా కొనసాగండి.</translation>
 <translation id="7658239707568436148">రద్దు చేయి</translation>
 <translation id="7871791972254842204"><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" />లోని నిబంధనలు &amp; షరతులను తర్వాత చదివి, అంగీకరించండి</translation>
+<translation id="8253702004019660079">Chromeలో Google అసిస్టెంట్.</translation>
 <translation id="8723954843026426558"><ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> నిబంధనలు &amp; షరతులు, గోప్యతా విధానం, ఉపసంహరణ హక్కుకు నేను అంగీకరిస్తున్నాను</translation>
 <translation id="9138504265731110181">వెబ్‌లో తనిఖీ చేయడం ద్వారా Google అసిస్టెంట్ మీ సమయాన్ని ఆదా చేయడంలో మీకు సహాయపడుతుంది.</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFacade.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFacade.java
index 902641ca..d338b16 100644
--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFacade.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantFacade.java
@@ -148,19 +148,22 @@
      */
     private static void checkAndLoadDynamicModuleIfNeeded(
             ChromeActivity activity, Callback<Boolean> callback) {
+        // Required to access resources in DFM using this activity as context.
+        ModuleInstaller.initActivity(activity);
         if (AutofillAssistantModule.isInstalled()) {
             callback.onResult(true);
             return;
         }
-        getTab(activity, tab -> { loadDynamicModuleWithUi(tab, callback); });
+        getTab(activity, tab -> { loadDynamicModuleWithUi(activity, tab, callback); });
     }
 
-    private static void loadDynamicModuleWithUi(Tab tab, Callback<Boolean> callback) {
+    private static void loadDynamicModuleWithUi(
+            ChromeActivity activity, Tab tab, Callback<Boolean> callback) {
         ModuleInstallUi ui = new ModuleInstallUi(tab, R.string.autofill_assistant_module_title,
                 new ModuleInstallUi.FailureUiListener() {
                     @Override
                     public void onRetry() {
-                        loadDynamicModuleWithUi(tab, callback);
+                        loadDynamicModuleWithUi(activity, tab, callback);
                     }
 
                     @Override
@@ -172,6 +175,9 @@
         ui.showInstallStartUi();
         ModuleInstaller.install("autofill_assistant", (success) -> {
             if (success) {
+                // Clean install of chrome will have issues here without initializing
+                // after installation of DFM.
+                ModuleInstaller.initActivity(activity);
                 // Don't show success UI from DFM, transition to autobot UI directly.
                 callback.onResult(true);
                 return;
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
index b6d0e26..1259b8bf 100644
--- a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
+++ b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
@@ -75,6 +75,6 @@
         android:elevation="4dp"
         android:scaleType="center"
         android:layout_gravity="end"
-        android:contentDescription="@string/accessibility_tabstrip_btn_close_tab"
-        android:src="@drawable/btn_close"/>
+        android:tint="@color/modern_grey_800"
+        android:contentDescription="@string/accessibility_tabstrip_btn_close_tab"/>
 </FrameLayout>
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_list_recycler_view_layout.xml b/chrome/android/features/tab_ui/java/res/layout/tab_list_recycler_view_layout.xml
index cfeb7f3b..c188cad 100644
--- a/chrome/android/features/tab_ui/java/res/layout/tab_list_recycler_view_layout.xml
+++ b/chrome/android/features/tab_ui/java/res/layout/tab_list_recycler_view_layout.xml
@@ -7,6 +7,7 @@
     android:id="@+id/tab_list_view"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:clipToPadding="false"
     android:paddingStart="8dp"
     android:paddingEnd="8dp"
     android:visibility="invisible"/>
diff --git a/chrome/android/features/tab_ui/java/res/values/dimens.xml b/chrome/android/features/tab_ui/java/res/values/dimens.xml
index 487a5fc..4578919 100644
--- a/chrome/android/features/tab_ui/java/res/values/dimens.xml
+++ b/chrome/android/features/tab_ui/java/res/values/dimens.xml
@@ -9,6 +9,7 @@
     <dimen name="tab_list_card_padding">8dp</dimen>
     <dimen name="tab_list_mini_card_radius">4dp</dimen>
     <dimen name="tab_list_mini_card_frame_size">1dp</dimen>
+    <dimen name="tab_grid_close_button_size">18dp</dimen>
     <dimen name="tab_grid_thumbnail_card_default_size">152dp</dimen>
     <dimen name="tab_grid_thumbnail_favicon_frame_padding">16dp</dimen>
     <dimen name="tab_grid_thumbnail_favicon_padding">24dp</dimen>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java
index 39e270b..125e47d 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewHolder.java
@@ -4,7 +4,8 @@
 
 package org.chromium.chrome.browser.tasks.tab_management;
 
-import android.support.v4.graphics.drawable.DrawableCompat;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
 import android.support.v7.widget.RecyclerView;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -12,15 +13,18 @@
 import android.widget.ImageView;
 import android.widget.TextView;
 
-import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.chrome.tab_ui.R;
 import org.chromium.ui.widget.ButtonCompat;
 
+import java.lang.ref.WeakReference;
+
 /**
  * {@link RecyclerView.ViewHolder} for tab grid. Owns the tab info card
  * and the associated view hierarchy.
  */
 class TabGridViewHolder extends RecyclerView.ViewHolder {
+    private static WeakReference<Bitmap> sCloseButtonBitmapWeakRef;
+
     public final ImageView favicon;
     public final TextView title;
     public final ImageView thumbnail;
@@ -35,11 +39,19 @@
         this.title = itemView.findViewById(R.id.tab_title);
         this.favicon = itemView.findViewById(R.id.tab_favicon);
         this.closeButton = itemView.findViewById(R.id.close_button);
-        DrawableCompat.setTint(this.closeButton.getDrawable(),
-                ApiCompatibilityUtils.getColor(
-                        itemView.getResources(), org.chromium.chrome.R.color.light_icon_color));
         this.createGroupButton = itemView.findViewById(R.id.create_group_button);
         this.backgroundView = itemView.findViewById(R.id.background_view);
+
+        if (sCloseButtonBitmapWeakRef == null || sCloseButtonBitmapWeakRef.get() == null) {
+            int closeButtonSize =
+                    (int) itemView.getResources().getDimension(R.dimen.tab_grid_close_button_size);
+            Bitmap bitmap =
+                    BitmapFactory.decodeResource(itemView.getResources(), R.drawable.btn_close);
+            sCloseButtonBitmapWeakRef = new WeakReference<>(
+                    Bitmap.createScaledBitmap(bitmap, closeButtonSize, closeButtonSize, true));
+            bitmap.recycle();
+        }
+        this.closeButton.setImageBitmap(sCloseButtonBitmapWeakRef.get());
     }
 
     public static TabGridViewHolder create(ViewGroup parent, int itemViewType) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
index 6b48bafd..aa10e15 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/AppHooks.java
@@ -464,4 +464,10 @@
      * Starts monitoring network quality. Must be called after native initialization is complete.
      */
     public void startMonitoringNetworkQuality() {}
+
+    /**
+     * Starts the observer for listening to system settings changes. Must be called on
+     * ChromeActivity initialization.
+     */
+    public void startSystemSettingsObserver() {}
 }
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 221373c..eb4d052 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeActivity.java
@@ -1473,6 +1473,7 @@
             getComponent().resolveContextualSuggestionsCoordinator();
         }
         AppHooks.get().startMonitoringNetworkQuality();
+        AppHooks.get().startSystemSettingsObserver();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java
index 144cd28..04c05d8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBar.java
@@ -6,14 +6,22 @@
 
 import android.content.Context;
 import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.support.annotation.CallSuper;
 import android.support.annotation.ColorRes;
 import android.support.annotation.Nullable;
 import android.view.View;
 import android.widget.TextView;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.snackbar.SnackbarManager;
+import org.chromium.chrome.browser.touchless.dialog.TouchlessDialogProperties;
+import org.chromium.chrome.browser.touchless.dialog.TouchlessDialogProperties.Priority;
+import org.chromium.ui.modaldialog.ModalDialogProperties;
+import org.chromium.ui.modelutil.PropertyModel;
 
 /**
  * The base class for all InfoBar classes.
@@ -35,6 +43,8 @@
     private boolean mIsDismissed;
     private boolean mControlsEnabled = true;
 
+    private @Nullable PropertyModel mModel;
+
     // This points to the InfoBarAndroid class not any of its subclasses.
     private long mNativeInfoBarPtr;
 
@@ -111,6 +121,63 @@
     }
 
     /**
+     * Create a property model for view systems that use this rather than a custom view.
+     * @return A new property model.
+     */
+    @CallSuper
+    protected PropertyModel createModel() {
+        Drawable icon;
+        if (mIconBitmap != null) {
+            icon = new BitmapDrawable(mIconBitmap);
+        } else {
+            icon = ApiCompatibilityUtils.getDrawable(getContext().getResources(), mIconDrawableId);
+        }
+
+        PropertyModel model =
+                new PropertyModel.Builder(TouchlessDialogProperties.ALL_DIALOG_KEYS)
+                        .with(TouchlessDialogProperties.IS_FULLSCREEN, false)
+                        .with(TouchlessDialogProperties.PRIORITY, Priority.HIGH)
+                        .with(TouchlessDialogProperties.CANCEL_ACTION,
+                                view -> onCloseButtonClicked())
+                        .with(TouchlessDialogProperties.CANCEL_NAME,
+                                mContext.getResources().getString(R.string.cancel))
+                        .with(TouchlessDialogProperties.SELECT_NAME,
+                                mContext.getResources().getString(R.string.select))
+                        .with(TouchlessDialogProperties.ALT_ACTION, null)
+                        .with(TouchlessDialogProperties.ALT_NAME, null)
+                        .with(ModalDialogProperties.TITLE, mMessage.toString())
+                        .with(ModalDialogProperties.TITLE_ICON, icon)
+                        .with(ModalDialogProperties.CONTROLLER,
+                                new ModalDialogProperties.Controller() {
+                                    @Override
+                                    public void onClick(PropertyModel model, int buttonType) {}
+
+                                    @Override
+                                    public void onDismiss(PropertyModel model, int dismissalCause) {
+                                        mContainer.removeInfoBar(InfoBar.this);
+                                    }
+                                })
+                        .build();
+        mModel = model;
+        return model;
+    }
+
+    /**
+     * @return The model for this infobar if one was created.
+     */
+    @Nullable
+    PropertyModel getModel() {
+        return mModel;
+    }
+
+    /**
+     * @return Whether this InfoBar is supported in touchless mode.
+     */
+    protected boolean supportsTouchlessMode() {
+        return false;
+    }
+
+    /**
      * If this returns true, the infobar contents will be replaced with a one-line layout.
      * When overriding this, also override {@link #getAccessibilityMessage}.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java
index ca3e7f8..e16cdd25 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java
@@ -19,12 +19,15 @@
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TabObserver;
+import org.chromium.chrome.browser.util.FeatureUtilities;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheet;
 import org.chromium.chrome.browser.widget.bottomsheet.BottomSheetObserver;
 import org.chromium.chrome.browser.widget.bottomsheet.EmptyBottomSheetObserver;
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.KeyboardVisibilityDelegate.KeyboardVisibilityListener;
+import org.chromium.ui.modaldialog.DialogDismissalCause;
+import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType;
 
 import java.util.ArrayList;
 
@@ -288,6 +291,18 @@
             return;
         }
 
+        infoBar.setContext(mInfoBarContainerView.getContext());
+        infoBar.setInfoBarContainer(this);
+
+        // TODO(957153): In touchless we will be needlessly logging show/close events. We should
+        //               clean this up to avoid skewing the metrics.
+        if (FeatureUtilities.isNoTouchModeEnabled() && !infoBar.supportsTouchlessMode()) {
+            // Pose the closing of the infobar as the native container does not handle closing the
+            // infobar during the show process well (native will crash).
+            mTab.getView().post(() -> infoBar.onCloseButtonClicked());
+            return;
+        }
+
         // We notify observers immediately (before the animation starts).
         for (InfoBarContainerObserver observer : mObservers) {
             observer.onAddInfoBar(this, infoBar, mInfoBars.isEmpty());
@@ -299,10 +314,13 @@
         // notify it's been added, as tests rely on this notification but expects the infobar view
         // to be available when they get the notification.
         mInfoBars.add(infoBar);
-        infoBar.setContext(mInfoBarContainerView.getContext());
-        infoBar.setInfoBarContainer(this);
 
-        mInfoBarContainerView.addInfoBar(infoBar);
+        if (FeatureUtilities.isNoTouchModeEnabled() && infoBar.supportsTouchlessMode()) {
+            mTab.getActivity().getModalDialogManager().showDialog(
+                    infoBar.createModel(), ModalDialogType.APP);
+        } else {
+            mInfoBarContainerView.addInfoBar(infoBar);
+        }
     }
 
     /**
@@ -347,18 +365,29 @@
         assert !mDestroyed;
 
         if (!mInfoBars.remove(infoBar)) {
+            // In touchless mode, an infobar can be removed without technically being added. This
+            // is allowed to support whitelisted infobars (while easily blocking the rest).
+            if (FeatureUtilities.isNoTouchModeEnabled()) return;
             assert false : "Trying to remove an InfoBar that is not in this container.";
             return;
         }
 
+        if (infoBar.supportsTouchlessMode() && FeatureUtilities.isNoTouchModeEnabled()
+                && infoBar.getModel() != null) {
+            mTab.getActivity().getModalDialogManager().dismissDialog(
+                    infoBar.getModel(), DialogDismissalCause.UNKNOWN);
+        }
+
         // Notify observers immediately, before any animations begin.
         for (InfoBarContainerObserver observer : mObservers) {
             observer.onRemoveInfoBar(this, infoBar, mInfoBars.isEmpty());
         }
 
-        assert mInfoBarContainerView
-                != null : "The container view is null when removing an InfoBar.";
-        mInfoBarContainerView.removeInfoBar(infoBar);
+        if (!FeatureUtilities.isNoTouchModeEnabled()) {
+            assert mInfoBarContainerView
+                    != null : "The container view is null when removing an InfoBar.";
+            mInfoBarContainerView.removeInfoBar(infoBar);
+        }
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/RequestGenerator.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/RequestGenerator.java
index b419c1d..847c273 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/RequestGenerator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/RequestGenerator.java
@@ -198,10 +198,11 @@
     public int getNumGoogleAccountsOnDevice() {
         // RequestGenerator may be invoked from JobService or AlarmManager (through OmahaService),
         // so have to make sure AccountManagerFacade instance is initialized.
-        PostTask.runSynchronously(UiThreadTaskTraits.DEFAULT,
-                () -> ProcessInitializationHandler.getInstance().initializePreNative());
         int numAccounts = 0;
         try {
+            // TODO(waffles@chromium.org): Ideally, this should be asynchronous.
+            PostTask.runSynchronously(UiThreadTaskTraits.DEFAULT,
+                    () -> ProcessInitializationHandler.getInstance().initializePreNative());
             numAccounts = AccountManagerFacade.get().getGoogleAccounts().size();
         } catch (Exception e) {
             Log.e(TAG, "Can't get number of accounts.", e);
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 fb12b71e..a721982 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_es.xtb
@@ -45,6 +45,7 @@
 <translation id="1285320974508926690">No traducir nunca este sitio</translation>
 <translation id="1291207594882862231">Borrar el historial, las cookies, los datos de sitios web, la caché…</translation>
 <translation id="129553762522093515">Cerrado recientemente</translation>
+<translation id="1303507811548703290"><ph name="DOMAIN" /> - Enviado desde <ph name="DEVICE_NAME" /></translation>
 <translation id="1326317727527857210">Inicia sesión en Chrome para ver las pestañas de tus otros dispositivos.</translation>
 <translation id="1331212799747679585">No se ha podido actualizar Chrome. Más opciones</translation>
 <translation id="1332501820983677155">Combinaciones de teclas de funciones de Google Chrome</translation>
@@ -171,6 +172,7 @@
 <translation id="2154484045852737596">Editar tarjeta</translation>
 <translation id="2154710561487035718">Copiar URL</translation>
 <translation id="2156074688469523661">Sitios web restantes (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="218608176142494674">Compartir</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, una aplicación web disponible en <ph name="APP_URL" /></translation>
 <translation id="2227444325776770048">Continuar como <ph name="USER_FULL_NAME" /></translation>
 <translation id="2234876718134438132">Servicios de Google y sincronización</translation>
@@ -644,6 +646,7 @@
 <translation id="5797070761912323120">Es posible que Google utilice tu historial para personalizar la Búsqueda, los anuncios y otros servicios de Google</translation>
 <translation id="5804241973901381774">Permisos</translation>
 <translation id="5809361687334836369">{HOURS,plural, =1{Hace # hora}other{Hace # horas}}</translation>
+<translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Todos los derechos reservados.</translation>
 <translation id="5817918615728894473">Vincular</translation>
 <translation id="583281660410589416">Desconocido</translation>
 <translation id="5833984609253377421">Compartir enlace</translation>
@@ -894,6 +897,7 @@
 <translation id="756809126120519699">Datos de Chrome borrados</translation>
 <translation id="757524316907819857">Impedir que los sitios web reproduzcan contenido protegido</translation>
 <translation id="757855969265046257">{FILES,plural, =1{<ph name="FILES_DOWNLOADED_ONE" /> archivo descargado}other{<ph name="FILES_DOWNLOADED_MANY" /> archivos descargados}}</translation>
+<translation id="7588219262685291874">Activar el tema oscuro cuando el dispositivo esté en modo de ahorro de batería</translation>
 <translation id="7589445247086920869">Bloquear para el motor de búsqueda actual</translation>
 <translation id="7593557518625677601">Abre los ajustes de Android y vuelve a habilitar la sincronización del sistema Android para iniciar la sincronización de Chrome</translation>
 <translation id="7596558890252710462">Sistema operativo</translation>
@@ -992,6 +996,7 @@
 <translation id="8266862848225348053">Ubicación de las descargas</translation>
 <translation id="8274165955039650276">Ver descargas</translation>
 <translation id="8283853025636624853">Sincronizando con <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8300705686683892304">Administrados por una aplicación</translation>
 <translation id="8310344678080805313">Pestañas estándar</translation>
 <translation id="8313455859591948645">Editar página de inicio</translation>
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> y más sitios web</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 9d18eb5..aa6a99f6 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_fil.xtb
@@ -45,6 +45,7 @@
 <translation id="1285320974508926690">Huwag isalin kailanman ang site na ito</translation>
 <translation id="1291207594882862231">I-clear ang history, cookies, site data, cache…</translation>
 <translation id="129553762522093515">Kamakailang isinara</translation>
+<translation id="1303507811548703290"><ph name="DOMAIN" /> - Ipinadala mula sa <ph name="DEVICE_NAME" /></translation>
 <translation id="1326317727527857210">Upang makuha ang iyong mga tab mula sa iba mo pang mga device, mag-sign in sa Chrome.</translation>
 <translation id="1331212799747679585">Hindi ma-update ang Chrome. Higit pang opsyon</translation>
 <translation id="1332501820983677155">Mga shortcut ng feature ng Google Chrome</translation>
@@ -171,6 +172,7 @@
 <translation id="2154484045852737596">I-edit ang card</translation>
 <translation id="2154710561487035718">Kopyahin ang URL</translation>
 <translation id="2156074688469523661">Mga natitirang site (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="218608176142494674">Pagbabahagi</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, web app. <ph name="APP_URL" /></translation>
 <translation id="2227444325776770048">Magpatuloy bilang si <ph name="USER_FULL_NAME" /></translation>
 <translation id="2234876718134438132">Sync at mga serbisyo ng Google</translation>
@@ -644,6 +646,7 @@
 <translation id="5797070761912323120">Maaaring gamitin ng Google ang iyong history para i-personalize ang Search, mga ad, at iba pang serbisyo ng Google</translation>
 <translation id="5804241973901381774">Mga Pahintulot</translation>
 <translation id="5809361687334836369">{HOURS,plural, =1{# oras ang nakalipas}one{# oras ang nakalipas}other{# na oras ang nakalipas}}</translation>
+<translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Nakalaan ang lahat ng karapatan.</translation>
 <translation id="5817918615728894473">Ipares</translation>
 <translation id="583281660410589416">Hindi-alam</translation>
 <translation id="5833984609253377421">Ibahagi ang link</translation>
@@ -894,6 +897,7 @@
 <translation id="756809126120519699">Na-clear ang data ng Chrome</translation>
 <translation id="757524316907819857">I-block ang mga site sa pag-play ng pinoprotektahang content</translation>
 <translation id="757855969265046257">{FILES,plural, =1{<ph name="FILES_DOWNLOADED_ONE" /> file ang na-download}one{<ph name="FILES_DOWNLOADED_MANY" /> file ang na-download}other{<ph name="FILES_DOWNLOADED_MANY" /> na file ang na-download}}</translation>
+<translation id="7588219262685291874">I-on ang madilim na tema kapag naka-on ang Pangtipid sa Baterya ng iyong device</translation>
 <translation id="7589445247086920869">I-block para sa kasalukuyang search engine</translation>
 <translation id="7593557518625677601">Buksan ang mga setting ng Android at muling i-enable ang Android system sync upang simulan ang Chrome sync</translation>
 <translation id="7596558890252710462">Operating system</translation>
@@ -992,6 +996,7 @@
 <translation id="8266862848225348053">Lokasyon ng download</translation>
 <translation id="8274165955039650276">Tingnan ang mga download</translation>
 <translation id="8283853025636624853">Sini-sync sa <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8300705686683892304">Pinapamahalaan ng app</translation>
 <translation id="8310344678080805313">Mga karaniwang tab</translation>
 <translation id="8313455859591948645">I-edit ang page sa pagsisimula</translation>
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> at higit pang site</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 83443316..55c5cd7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_hi.xtb
@@ -142,7 +142,7 @@
 <translation id="2002537628803770967">Google Pay का इस्तेमाल करने वाले क्रेडिट कार्ड और पते</translation>
 <translation id="200815880754187296"><ph name="KILOBYTES" /> केबी अन्य ऐप्लिकेशन</translation>
 <translation id="2013642289801508067">{FILE_COUNT,plural, =1{# फ़ाइल}one{# फ़ाइलें}other{# फ़ाइलें}}</translation>
-<translation id="2017836877785168846">इतिहास साफ़ करता है और पता बार में स्वत: पूर्णता को साफ़ करता है.</translation>
+<translation id="2017836877785168846">इतिहास साफ़ करता है और पता बार मेंअपने-आपपूर्णता को साफ़ करता है.</translation>
 <translation id="2018707881002649255">आप नीचे जो संपर्क चुनेंगे उन्हें <ph name="BEGIN_BOLD" /><ph name="SITE" /><ph name="END_BOLD" /> वेबसाइट से शेयर किया जाएगा.</translation>
 <translation id="2021896219286479412">पूरी स्क्रीन के साइट नियंत्रण</translation>
 <translation id="2038563949887743358">अनुरोध डेस्कटॉप साइट चालू करें</translation>
@@ -294,7 +294,7 @@
 <translation id="3205824638308738187">करीब-करीब पूरा हो गया!</translation>
 <translation id="3207960819495026254">बुकमार्क किया गया</translation>
 <translation id="3211426585530211793"><ph name="ITEM_TITLE" /> मिटाया गया</translation>
-<translation id="321773570071367578">यदि आप अपना 'पासफ़्रेज़' भूल गए हैं या यह सेटिंग बदलना चाहते हैं, तो <ph name="BEGIN_LINK" /> सिंक रीसेट करें<ph name="END_LINK" /></translation>
+<translation id="321773570071367578">अगर आप अपना 'पासफ़्रेज़' भूल गए हैं या यह सेटिंग बदलना चाहते हैं, तो <ph name="BEGIN_LINK" /> सिंक रीसेट करें<ph name="END_LINK" /></translation>
 <translation id="3227137524299004712">माइक्रोफ़ोन</translation>
 <translation id="3232754137068452469">वेब ऐप्लिकेशन</translation>
 <translation id="3234355010754616171">नया निजी टैब</translation>
@@ -303,7 +303,7 @@
 <translation id="3254409185687681395">इस पेज को बुकमार्क करें</translation>
 <translation id="3259831549858767975">पेज पर सब कुछ छोटा करें</translation>
 <translation id="3269093882174072735">इमेज लोड करें</translation>
-<translation id="3269956123044984603">अपने अन्य डिवाइस से अपने टैब प्राप्त करने के लिए, Android खाता सेटिंग में “डेटा स्वत: समन्वयित करें” चालू करें.</translation>
+<translation id="3269956123044984603">अपने अन्य डिवाइस से अपने टैब प्राप्त करने के लिए, Android खाता सेटिंग में “डेटाअपने-आपसमन्वयित करें” चालू करें.</translation>
 <translation id="3282568296779691940">Chrome में साइन इन करें</translation>
 <translation id="3288003805934695103">पेज को पुनः लोड करें</translation>
 <translation id="32895400574683172">सूचनाओं की अनुमति है</translation>
@@ -834,7 +834,7 @@
 <translation id="7066151586745993502">{NUM_SELECTED,plural, =1{1 चुना गया}one{# चुने गए}other{# चुने गए}}</translation>
 <translation id="7077143737582773186">SD कार्ड</translation>
 <translation id="7087918508125750058"><ph name="ITEM_COUNT" /> चुने गए.  विकल्प, स्क्रीन के ऊपरी भाग के पास उपलब्ध हैं</translation>
-<translation id="7121362699166175603">पता बार में स्वत: पूर्णता और इतिहास को हटाता है. आपके Google खाते में <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर अन्य प्रकार के ब्राउज़िंग इतिहास हो सकतेे हैं.</translation>
+<translation id="7121362699166175603">पता बार मेंअपने-आपपूर्णता और इतिहास को हटाता है. आपके Google खाते में <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर अन्य प्रकार के ब्राउज़िंग इतिहास हो सकतेे हैं.</translation>
 <translation id="7128222689758636196">मौजूदा सर्च इंजन के लिए अनुमति दें</translation>
 <translation id="7138678301420049075">अन्य</translation>
 <translation id="7139148793369023665">'इसी तरह के और भी' को बंद किया गया</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
index b58c0bd..dfed135e 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ml.xtb
@@ -45,6 +45,7 @@
 <translation id="1285320974508926690">ഈ സൈറ്റ് ഒരിക്കലും വിവര്‍‌ത്തനം ചെയ്യരുത്</translation>
 <translation id="1291207594882862231">ചരിത്രവും കുക്കികളും സൈറ്റ് വിവരവും കാഷെയും മായ്‌ക്കുക...</translation>
 <translation id="129553762522093515">സമീപകാലത്ത് അടച്ചവ</translation>
+<translation id="1303507811548703290"><ph name="DOMAIN" /> - <ph name="DEVICE_NAME" />-ൽ നിന്ന് അയച്ചത്</translation>
 <translation id="1326317727527857210">നിങ്ങളുടെ മറ്റ് ഉപകരണങ്ങളിൽ നിന്നുള്ള ടാബുകൾ ലഭിക്കാൻ, Chrome-ൽ സൈൻ ഇൻ ചെയ്യുക.</translation>
 <translation id="1331212799747679585">Chrome അപ്‌ഡേറ്റ് ചെയ്യാനാവില്ല. കൂടുതൽ ഓപ്‌ഷനുകൾ</translation>
 <translation id="1332501820983677155">Google Chrome ഫീച്ചർ കുറുക്കുവഴികൾ</translation>
@@ -171,6 +172,7 @@
 <translation id="2154484045852737596">കാർഡ് എഡിറ്റുചെയ്യുക</translation>
 <translation id="2154710561487035718">URL പകര്‍ത്തുക</translation>
 <translation id="2156074688469523661">ശേഷിക്കുന്ന സൈറ്റുകൾ (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="218608176142494674">പങ്കിടൽ</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, വെബ് ആപ്പ്. <ph name="APP_URL" /></translation>
 <translation id="2227444325776770048"><ph name="USER_FULL_NAME" /> എന്ന പേരിൽ തുടരുക</translation>
 <translation id="2234876718134438132">സമന്വയവും Google സേവനങ്ങളും</translation>
@@ -644,6 +646,7 @@
 <translation id="5797070761912323120">തിരയലും പരസ്യവും മറ്റ് Google സേവനങ്ങളും വ്യക്തിപരമാക്കാൻ Google നിങ്ങളുടെ ചരിത്രം ഉപയോഗിച്ചേക്കാം</translation>
 <translation id="5804241973901381774">അനുമതികൾ</translation>
 <translation id="5809361687334836369">{HOURS,plural, =1{# മണിക്കൂര്‍ മുമ്പ്}other{# മണിക്കൂര്‍ മുമ്പ്}}</translation>
+<translation id="5810288467834065221">പകർപ്പവകാശം <ph name="YEAR" /> Google LLC. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്‍തം.</translation>
 <translation id="5817918615728894473">ജോടിയാക്കുക</translation>
 <translation id="583281660410589416">അജ്ഞാതം</translation>
 <translation id="5833984609253377421">ലിങ്ക് പങ്കിടുക</translation>
@@ -894,6 +897,7 @@
 <translation id="756809126120519699">Chrome ഡാറ്റ മായ്‌ച്ചു</translation>
 <translation id="757524316907819857">പരിരക്ഷിത ഉള്ളടക്കം പ്ലേ ചെയ്യുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation>
 <translation id="757855969265046257">{FILES,plural, =1{<ph name="FILES_DOWNLOADED_ONE" /> ഫയൽ ഡൗൺലോഡ് ചെയ്‌തു}other{<ph name="FILES_DOWNLOADED_MANY" /> ഫയലുകൾ ഡൗൺലോഡ് ചെയ്‌തു}}</translation>
+<translation id="7588219262685291874">ഉപകരണത്തിന്റെ ബാറ്ററി ലാഭിക്കൽ ഓണായിരിക്കുമ്പോൾ ഇരുണ്ട തീം ഓണാക്കുക</translation>
 <translation id="7589445247086920869">നിലവിലെ തിരയൽ എഞ്ചിനിൽ ബ്ലോക്ക് ചെയ്യുക</translation>
 <translation id="7593557518625677601">Chrome സമന്വയം ആരംഭിക്കാൻ Android ക്രമീകരണം തുറന്ന് Android സിസ്‌റ്റം സമന്വയിപ്പിക്കൽ വീണ്ടും പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="7596558890252710462">ഓപ്പറേറ്റിംഗ് സിസ്റ്റം</translation>
@@ -992,6 +996,7 @@
 <translation id="8266862848225348053">ഡൗൺലോഡ് ലൊക്കേഷൻ</translation>
 <translation id="8274165955039650276">ഡൗൺലോഡുകൾ കാണുക</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" /> അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കുന്നു</translation>
+<translation id="8300705686683892304">ആപ്പ് മാനേജ് ചെയ്യുന്നത്</translation>
 <translation id="8310344678080805313">സ്റ്റാൻഡേർഡ് ടാബുകൾ</translation>
 <translation id="8313455859591948645">ആരംഭ പേജ് എഡിറ്റ് ചെയ്യുക</translation>
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> ഡൊമെയ്‌നും കൂടുതൽ സൈറ്റുകളും</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 253c484..177d22a5 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_no.xtb
@@ -45,6 +45,7 @@
 <translation id="1285320974508926690">Oversett aldri dette nettstedet</translation>
 <translation id="1291207594882862231">Slett loggoppføringer, informasjonskapsler, nettstedsdata, bufferen …</translation>
 <translation id="129553762522093515">Nylig lukket</translation>
+<translation id="1303507811548703290"><ph name="DOMAIN" /> – sendt fra <ph name="DEVICE_NAME" /></translation>
 <translation id="1326317727527857210">For å få fanene dine fra de andre enhetene du bruker, logg på Chrome.</translation>
 <translation id="1331212799747679585">Kan ikke oppdatere Chrome. Flere alternativer</translation>
 <translation id="1332501820983677155">Hurtigtaster for funksjoner i Google Chrome.</translation>
@@ -171,6 +172,7 @@
 <translation id="2154484045852737596">Endre kortet</translation>
 <translation id="2154710561487035718">Kopier nettadresse</translation>
 <translation id="2156074688469523661">Andre nettsteder (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="218608176142494674">Deling</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, nettprogram. <ph name="APP_URL" /></translation>
 <translation id="2227444325776770048">Fortsett som <ph name="USER_FULL_NAME" /></translation>
 <translation id="2234876718134438132">Synkronisering/Google-tjenester</translation>
@@ -644,6 +646,7 @@
 <translation id="5797070761912323120">Google kan bruke loggen din for å gi Søk, annonser og andre Google-tjenester et personlig preg</translation>
 <translation id="5804241973901381774">Tillatelser</translation>
 <translation id="5809361687334836369">{HOURS,plural, =1{for # time siden}other{for # timer siden}}</translation>
+<translation id="5810288467834065221">Copyright <ph name="YEAR" /> Google LLC. Med enerett.</translation>
 <translation id="5817918615728894473">Koble sammen</translation>
 <translation id="583281660410589416">Ukjent</translation>
 <translation id="5833984609253377421">Del en link</translation>
@@ -894,6 +897,7 @@
 <translation id="756809126120519699">Chrome-dataene er slettet</translation>
 <translation id="757524316907819857">Blokkér nettsteder fra å spille av beskyttet innhold</translation>
 <translation id="757855969265046257">{FILES,plural, =1{<ph name="FILES_DOWNLOADED_ONE" /> fil er lastet ned}other{<ph name="FILES_DOWNLOADED_MANY" /> filer er lastet ned}}</translation>
+<translation id="7588219262685291874">Slå på mørkt tema når batterisparing er påslått på enheten</translation>
 <translation id="7589445247086920869">Blokkert for den aktive søkemotoren</translation>
 <translation id="7593557518625677601">Start Chrome-synkronisering ved å slå på synkronisering i Android-innstillingene</translation>
 <translation id="7596558890252710462">Operativsystem</translation>
@@ -992,6 +996,7 @@
 <translation id="8266862848225348053">Nedlastingssted</translation>
 <translation id="8274165955039650276">Se nedlastinger</translation>
 <translation id="8283853025636624853">Synkroniserer til <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8300705686683892304">Administreres av app</translation>
 <translation id="8310344678080805313">Standardfaner</translation>
 <translation id="8313455859591948645">Endre oppstartssiden</translation>
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> og flere nettsteder</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 e2538f6..52eacac 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_pl.xtb
@@ -995,7 +995,7 @@
 <translation id="8261506727792406068">Usuń</translation>
 <translation id="8266862848225348053">Miejsce zapisywania pobranych plików</translation>
 <translation id="8274165955039650276">Zobacz pobrane</translation>
-<translation id="8283853025636624853">Synchronizowanie z kontem <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
+<translation id="8283853025636624853">Synchronizacja z kontem <ph name="SYNC_ACCOUNT_USER_NAME" /></translation>
 <translation id="8300705686683892304">Zarządzane przez aplikację</translation>
 <translation id="8310344678080805313">Karty standardowe</translation>
 <translation id="8313455859591948645">Zmiana strony startowej</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 3ad140a..3f89ce7 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ru.xtb
@@ -45,6 +45,7 @@
 <translation id="1285320974508926690">Никогда не переводить этот сайт</translation>
 <translation id="1291207594882862231">Удалить файлы cookie и данные сайтов, очистить историю и кеш</translation>
 <translation id="129553762522093515">Недавно закрытые</translation>
+<translation id="1303507811548703290">Отправитель: <ph name="DOMAIN" />, устройство: <ph name="DEVICE_NAME" /></translation>
 <translation id="1326317727527857210">Чтобы получить доступ к вкладкам на всех ваших устройствах, войдите в Chrome.</translation>
 <translation id="1331212799747679585">Не удалось обновить Chrome. Другие настройки</translation>
 <translation id="1332501820983677155">Функции Google Chrome</translation>
@@ -171,6 +172,7 @@
 <translation id="2154484045852737596">Изменение данных карты</translation>
 <translation id="2154710561487035718">Копировать URL</translation>
 <translation id="2156074688469523661">Прочие сайты (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="218608176142494674">Совместный доступ</translation>
 <translation id="2206488550163399966">Приложение "<ph name="APP_NAME" />" (<ph name="APP_URL" />)</translation>
 <translation id="2227444325776770048">Продолжить как <ph name="USER_FULL_NAME" /></translation>
 <translation id="2234876718134438132">Синхронизация сервисов Google</translation>
@@ -644,6 +646,7 @@
 <translation id="5797070761912323120">Google может использовать вашу историю, чтобы персонализировать рекламу, а также Поиск и другие сервисы.</translation>
 <translation id="5804241973901381774">Разрешения</translation>
 <translation id="5809361687334836369">{HOURS,plural, =1{# час назад}one{# час назад}few{# часа назад}many{# часов назад}other{# часа назад}}</translation>
+<translation id="5810288467834065221">© Google LLC, <ph name="YEAR" />. Все права защищены.</translation>
 <translation id="5817918615728894473">Подключить</translation>
 <translation id="583281660410589416">Неизвестно</translation>
 <translation id="5833984609253377421">Отправить ссылку</translation>
@@ -894,6 +897,7 @@
 <translation id="756809126120519699">Данные Chrome удалены</translation>
 <translation id="757524316907819857">Запретить сайтам воспроизводить защищенный контент</translation>
 <translation id="757855969265046257">{FILES,plural, =1{Скачан <ph name="FILES_DOWNLOADED_ONE" /> файл}one{Скачан <ph name="FILES_DOWNLOADED_MANY" /> файл}few{Скачано <ph name="FILES_DOWNLOADED_MANY" /> файла}many{Скачано <ph name="FILES_DOWNLOADED_MANY" /> файлов}other{Скачано <ph name="FILES_DOWNLOADED_MANY" /> файла}}</translation>
+<translation id="7588219262685291874">Использовать тёмную тему, когда включен режим энергосбережения</translation>
 <translation id="7589445247086920869">Закрыть доступ текущей поисковой системе</translation>
 <translation id="7593557518625677601">Откройте настройки Android и снова включите синхронизацию системы</translation>
 <translation id="7596558890252710462">Операционная система</translation>
@@ -992,6 +996,7 @@
 <translation id="8266862848225348053">Расположение скачиваемых файлов</translation>
 <translation id="8274165955039650276">Показать скачанные файлы</translation>
 <translation id="8283853025636624853">Синхронизация с аккаунтом <ph name="SYNC_ACCOUNT_USER_NAME" />…</translation>
+<translation id="8300705686683892304">Под управлением приложения</translation>
 <translation id="8310344678080805313">Обычные вкладки</translation>
 <translation id="8313455859591948645">Изменение стартовой страницы</translation>
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> и другие сайты</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
index 488a65f0..d21de77 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_ta.xtb
@@ -549,7 +549,7 @@
 <translation id="510275257476243843">1 மணிநேரம் மீதமுள்ளது</translation>
 <translation id="5123685120097942451">மறைநிலைத் தாவல்</translation>
 <translation id="5127805178023152808">ஒத்திசைவு முடக்கத்தில்</translation>
-<translation id="5129038482087801250">இணையப் பயன்பாட்டை நிறுவு</translation>
+<translation id="5129038482087801250">இணைய ஆப்ஸை நிறுவு</translation>
 <translation id="5132942445612118989">எல்லாச் சாதனங்களிலும் உங்கள் கடவுச்சொற்கள், வரலாறு மற்றும் பலவற்றை ஒத்திசைக்கலாம்</translation>
 <translation id="5139940364318403933">Google இயக்ககத்தை எப்படிப் பயன்படுத்துவது என்பதை அறிக</translation>
 <translation id="515227803646670480">சேமித்தத் தரவை அழி</translation>
@@ -851,7 +851,7 @@
 <translation id="7274013316676448362">தடுக்கப்பட்ட தளம்</translation>
 <translation id="7290209999329137901">இதை மறுபெயரிட இயலாது</translation>
 <translation id="7291387454912369099">அசிஸ்டண்ட் மூலம் செக்அவுட்</translation>
-<translation id="729975465115245577">கடவுச்சொற்கள் கோப்பைச் சேமிக்க, உங்கள் சாதனத்தில் பயன்பாடு எதுவும் இல்லை.</translation>
+<translation id="729975465115245577">கடவுச்சொற்கள் கோப்பைச் சேமிக்க, உங்கள் சாதனத்தில் ஆப்ஸ் எதுவும் இல்லை.</translation>
 <translation id="7302081693174882195">விவரங்கள்: சேமிக்கப்பட்ட டேட்டா அளவின்படி வரிசைப்படுத்தப்பட்டுள்ளன</translation>
 <translation id="7328017930301109123">’லைட்’ பயன்முறையில், பக்கங்களை Chrome வேகமாக ஏற்றுவதோடு, டேட்டாவை 60 சதவீதம் குறைவாகவும் பயன்படுத்தும்.</translation>
 <translation id="7333031090786104871">முந்தைய தளத்தை இன்னும் சேர்க்கிறது</translation>
diff --git a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
index 88423060..961e0806 100644
--- a/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
+++ b/chrome/android/java/strings/translations/android_chrome_strings_te.xtb
@@ -45,6 +45,7 @@
 <translation id="1285320974508926690">ఈ సైట్‌ను ఎప్పటికీ అనువదించవద్దు</translation>
 <translation id="1291207594882862231">చరిత్ర, కుక్కీలు, సైట్ డేటా, కాష్‌ను తీసివేస్తుంది…</translation>
 <translation id="129553762522093515">ఇటీవల మూసివెయ్యబడినవి</translation>
+<translation id="1303507811548703290"><ph name="DOMAIN" /> - దీనిని పంపిన పరికరం <ph name="DEVICE_NAME" /></translation>
 <translation id="1326317727527857210">మీ ఇతర పరికరాల నుండి మీ ట్యాబ్‌లను పొందడానికి, Chromeకు సైన్ ఇన్ చేయండి.</translation>
 <translation id="1331212799747679585">Chromeని అప్‌డేట్ చేయడం సాధ్యపడదు. మరిన్ని ఎంపికలు</translation>
 <translation id="1332501820983677155">Google Chrome లక్షణ సత్వరమార్గాలు</translation>
@@ -171,6 +172,7 @@
 <translation id="2154484045852737596">కార్డ్‌ను సవరించండి</translation>
 <translation id="2154710561487035718">URLను కాపీ చేయి</translation>
 <translation id="2156074688469523661">మిగిలిన సైట్‌లు (<ph name="NUMBER_OF_SITES" />)</translation>
+<translation id="218608176142494674">షేరింగ్</translation>
 <translation id="2206488550163399966"><ph name="APP_NAME" />, వెబ్ యాప్. <ph name="APP_URL" /></translation>
 <translation id="2227444325776770048"><ph name="USER_FULL_NAME" />గా కొనసాగించు</translation>
 <translation id="2234876718134438132">సింక్ మరియు Google సేవలు</translation>
@@ -644,6 +646,7 @@
 <translation id="5797070761912323120">శోధన, ప్రకటనలు, ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ చరిత్రను ఉపయోగించే అవకాశం ఉంటుంది</translation>
 <translation id="5804241973901381774">అనుమతులు</translation>
 <translation id="5809361687334836369">{HOURS,plural, =1{# గంట క్రితం}other{# గంటల క్రితం}}</translation>
+<translation id="5810288467834065221">కాపీరైట్ <ph name="YEAR" /> Google LLC. సర్వ హక్కులు ప్రత్యేకించబడ్డాయి.</translation>
 <translation id="5817918615728894473">జత చేయి</translation>
 <translation id="583281660410589416">తెలియని</translation>
 <translation id="5833984609253377421">లింక్‌ను షేర్ చేయి</translation>
@@ -894,6 +897,7 @@
 <translation id="756809126120519699">Chrome డేటా తీసివేయబడింది</translation>
 <translation id="757524316907819857">రక్షిత కంటెంట్‌ను ప్లే చేయకుండా సైట్‌లను బ్లాక్ చేస్తుంది</translation>
 <translation id="757855969265046257">{FILES,plural, =1{<ph name="FILES_DOWNLOADED_ONE" /> ఫైల్ డౌన్‌లోడ్ చేయబడింది}other{<ph name="FILES_DOWNLOADED_MANY" /> ఫైల్‌లు డౌన్‌లోడ్ చేయబడ్డాయి}}</translation>
+<translation id="7588219262685291874">మీ పరికరం బ్యాటరీ సేవర్ ఆన్‌లో ఉన్నప్పుడు ముదురు రంగు థీమ్‌ను ఆన్ చేస్తుంది</translation>
 <translation id="7589445247086920869">ప్రస్తుత శోధన ఇంజిన్‌కు బ్లాక్ చేయండి</translation>
 <translation id="7593557518625677601">Chrome సమకాలీకరణను ప్రారంభిండానికి Android సెట్టింగ్‌లు తెరిచి, Android సిస్టమ్ సమకాలీకరణను మళ్లీ ప్రారంభించండి</translation>
 <translation id="7596558890252710462">ఆపరేటింగ్ సిస్టమ్</translation>
@@ -992,6 +996,7 @@
 <translation id="8266862848225348053">డౌన్‌లోడ్‌ల ఫోల్డర్</translation>
 <translation id="8274165955039650276">డౌన్‌లోడ్‌లు చూడండి</translation>
 <translation id="8283853025636624853"><ph name="SYNC_ACCOUNT_USER_NAME" />కు సమకాలీకరిస్తోంది</translation>
+<translation id="8300705686683892304">యాప్ ద్వారా నిర్వహించబడుతున్నవి</translation>
 <translation id="8310344678080805313">ప్రామాణిక ట్యాబ్‌లు</translation>
 <translation id="8313455859591948645">ప్రారంభ పేజీని సవరించండి</translation>
 <translation id="8316092324682955408"><ph name="DOMAIN_NAME" /> మరియు మరిన్ని సైట్‌లు</translation>
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java
index 4b12b81..01a56d0 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserControllerInputTest.java
@@ -47,7 +47,8 @@
  * End-to-end tests for Daydream controller input while in the VR browser.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@CommandLineFlags.
+Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=LogJsConsoleMessages"})
 @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM_OR_STANDALONE)
 public class VrBrowserControllerInputTest {
     // We explicitly instantiate a rule here instead of using parameterization since this class
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java
index 2c351b1..16e169d89 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserDialogTest.java
@@ -43,7 +43,8 @@
  * End-to-End test for capturing and comparing screen images for VR Browsering Dialogs
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@CommandLineFlags.
+Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=LogJsConsoleMessages"})
 @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM_OR_STANDALONE)
 public class VrBrowserDialogTest {
     // We need to make sure the port is constant, otherwise the URL changes between test runs, which
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java
index a93f031..46b7adc5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNativeUiTest.java
@@ -45,7 +45,8 @@
  * End-to-end tests for native UI presentation in VR Browser mode.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-webvr"})
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+        "enable-features=LogJsConsoleMessages", "enable-webvr"})
 @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM_OR_STANDALONE)
 public class VrBrowserNativeUiTest {
     // We need to make sure the port is constant, otherwise the URL changes between test runs, which
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNavigationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNavigationTest.java
index 638d132..23344fe 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNavigationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserNavigationTest.java
@@ -60,7 +60,8 @@
  * "VR Shell".
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-webvr"})
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+        "enable-features=LogJsConsoleMessages", "enable-webvr"})
 @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM_OR_STANDALONE)
 public class VrBrowserNavigationTest {
     // We explicitly instantiate a rule here instead of using parameterization since this class
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
index 6cd37b3..43d183c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserTransitionTest.java
@@ -60,7 +60,8 @@
  * into the VR browser.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@CommandLineFlags.
+Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=LogJsConsoleMessages"})
 public class VrBrowserTransitionTest {
     // We explicitly instantiate a rule here instead of using parameterization since this class
     // only ever runs in ChromeTabbedActivity.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserWebInputEditingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserWebInputEditingTest.java
index c1722bca..05fbe22 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserWebInputEditingTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrBrowserWebInputEditingTest.java
@@ -44,7 +44,8 @@
  * End-to-end tests for interacting with HTML input elements on a webpage.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@CommandLineFlags.
+Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=LogJsConsoleMessages"})
 @Restriction(RESTRICTION_TYPE_VIEWER_DAYDREAM_OR_STANDALONE)
 public class VrBrowserWebInputEditingTest {
     // We explicitly instantiate a rule here instead of using parameterization since this class
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrDaydreamReadyModuleInstallTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrDaydreamReadyModuleInstallTest.java
index 1a3d413..0d6109b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrDaydreamReadyModuleInstallTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrDaydreamReadyModuleInstallTest.java
@@ -38,7 +38,8 @@
  */
 @RunWith(ParameterizedRunner.class)
 @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@CommandLineFlags.
+Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=LogJsConsoleMessages"})
 @MinAndroidSdkLevel(Build.VERSION_CODES.N) // Daydream is only supported on N+.
 public class VrDaydreamReadyModuleInstallTest {
     @ClassParameter
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrFeedbackInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrFeedbackInfoBarTest.java
index 3891b8c..0754b96 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrFeedbackInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrFeedbackInfoBarTest.java
@@ -35,7 +35,8 @@
  * Tests for the infobar that prompts the user to enter feedback on their VR browsing experience.
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-webvr"})
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+        "enable-features=LogJsConsoleMessages", "enable-webvr"})
 @Restriction({RESTRICTION_TYPE_DEVICE_DAYDREAM, RESTRICTION_TYPE_SVR})
 public class VrFeedbackInfoBarTest {
     // We explicitly instantiate a rule here instead of using parameterization since this class
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java
index 08372dc..63ae2131 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/VrInstallUpdateInfoBarTest.java
@@ -51,7 +51,8 @@
  */
 @RunWith(ParameterizedRunner.class)
 @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@CommandLineFlags.
+Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=LogJsConsoleMessages"})
 @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) // WebVR is only supported on K+
 @Restriction(RESTRICTION_TYPE_SVR)
 public class VrInstallUpdateInfoBarTest {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java
index a0bc349..017d51f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java
@@ -37,8 +37,8 @@
  */
 @RunWith(ParameterizedRunner.class)
 @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
-@CommandLineFlags.
-Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-features=WebXR,WebXRHitTest"})
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+        "enable-features=WebXR,WebXRHitTest,LogJsConsoleMessages"})
 @MinAndroidSdkLevel(Build.VERSION_CODES.N) // WebXR for AR is only supported on N+
 public class WebXrArSessionTest {
     @ClassParameter
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java
index 084461d..229132d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrDeviceTest.java
@@ -45,7 +45,8 @@
  */
 @RunWith(ParameterizedRunner.class)
 @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-webvr"})
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+        "enable-features=LogJsConsoleMessages", "enable-webvr"})
 @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) // WebVR is only supported on K+
 public class WebXrVrDeviceTest {
     @ClassParameter
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrInputTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrInputTest.java
index 5c33964..0d068ce 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrInputTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrInputTest.java
@@ -63,7 +63,8 @@
  */
 @RunWith(ParameterizedRunner.class)
 @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-webvr"})
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+        "enable-features=LogJsConsoleMessages", "enable-webvr"})
 @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) // WebVR and WebXR are only supported on K+
 public class WebXrVrInputTest {
     @ClassParameter
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java
index dd5fef3..f45c006 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTabTest.java
@@ -41,7 +41,8 @@
  */
 @RunWith(ParameterizedRunner.class)
 @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-webvr"})
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+        "enable-features=LogJsConsoleMessages", "enable-webvr"})
 @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) // WebVR is only supported on K+
 public class WebXrVrTabTest {
     @ClassParameter
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java
index 9f6cfb3..69aab7d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrTransitionTest.java
@@ -67,7 +67,8 @@
  */
 @RunWith(ParameterizedRunner.class)
 @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class)
-@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, "enable-webvr"})
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE,
+        "enable-features=LogJsConsoleMessages", "enable-webvr"})
 @MinAndroidSdkLevel(Build.VERSION_CODES.KITKAT) // WebVR and WebXR are only supported on K+
 @TargetApi(Build.VERSION_CODES.KITKAT) // Necessary to allow taking screenshots with UiAutomation
 public class WebXrVrTransitionTest {
diff --git a/chrome/android/webapk/strings/translations/android_webapk_strings_ta.xtb b/chrome/android/webapk/strings/translations/android_webapk_strings_ta.xtb
index b80a74b..a1a05a7 100644
--- a/chrome/android/webapk/strings/translations/android_webapk_strings_ta.xtb
+++ b/chrome/android/webapk/strings/translations/android_webapk_strings_ta.xtb
@@ -1,9 +1,9 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ta">
-<translation id="1700971771753530690"><ph name="APP_NAME" />க்கு, பின்வரும் பயன்பாடு தேவை:</translation>
+<translation id="1700971771753530690"><ph name="APP_NAME" />க்கு, பின்வரும் ஆப்ஸ் தேவை:</translation>
 <translation id="2697679025356221813"><ph name="APP_NAME" />க்கு இணைய உலாவி தேவை</translation>
-<translation id="3858759029325727987">இந்தப் பயன்பாட்டை ஆதரிக்கும் உலாவியைத் தேர்வு செய்யவும்:</translation>
+<translation id="3858759029325727987">இந்த ஆப்ஸை ஆதரிக்கும் உலாவியைத் தேர்வு செய்யவும்:</translation>
 <translation id="6377677440246641805"><ph name="BROWSER_NAME" />\nஆதரிக்கப்படவில்லை</translation>
 <translation id="7671141431838911305">நிறுவு</translation>
 <translation id="8252328707312954493">மூடு</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb
index 526bf98..34e539c 100644
--- a/chrome/app/resources/chromium_strings_hi.xtb
+++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -206,7 +206,7 @@
 <translation id="7337881442233988129">क्रोमियम</translation>
 <translation id="7339898014177206373">नई विंडो</translation>
 <translation id="734373864078049451">आपके वेब, बुकमार्क, और अन्य क्रोमियम सामग्री यहां मौजूद रहती है.</translation>
-<translation id="7344413941077984497">यह सेट करने के लिए कि <ph name="NEW_PROFILE_NAME" /> द्वारा कौन सी वेबसाइट देखी जा सकती है, आप <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" /> पर जाकर प्रतिबंध और सेटिंग कॉन्फ़िगर कर सकते हैं. यदि आप डिफ़ॉल्ट सेटिंग नहीं बदलते हैं, तो <ph name="NEW_PROFILE_NAME" /> द्वारा वेब प्रोफ़ाइल पर सब कुछ ब्राउज़ किया जा सकता है.
+<translation id="7344413941077984497">यह सेट करने के लिए कि <ph name="NEW_PROFILE_NAME" /> द्वारा कौन सी वेबसाइट देखी जा सकती है, आप <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" /> पर जाकर प्रतिबंध और सेटिंग कॉन्फ़िगर कर सकते हैं. अगर आप डिफ़ॉल्ट सेटिंग नहीं बदलते हैं, तो <ph name="NEW_PROFILE_NAME" /> द्वारा वेब प्रोफ़ाइल पर सब कुछ ब्राउज़ किया जा सकता है.
 
 <ph name="NEW_PROFILE_NAME" /> को अपना खाता एक्सेस करने से रोकने के लिए, जब आप क्रोमियम का उपयोग नहीं कर रहे हों तो अपनी प्रोफ़ाइल को अवश्य लॉक कर दें. ऐसा करने के लिए, ब्राउज़र के ऊपर-दाएं कोने में स्थित अपना प्रोफ़ाइल नाम क्लिक करें और "बाहर निकलें और चाइल्ड लॉक करें" चुनें.
 <ph name="BEGIN_LINK_2" />अधिक जानें<ph name="END_LINK_2" />
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb
index 1b82761e..b19ec66 100644
--- a/chrome/app/resources/generated_resources_am.xtb
+++ b/chrome/app/resources/generated_resources_am.xtb
@@ -2074,7 +2074,6 @@
 <translation id="42126664696688958">ወደ ውጪ ላክ</translation>
 <translation id="42137655013211669">የዚህ መርጃ መዳረሻ በአገልጋዩ ተከልክሏል።</translation>
 <translation id="4215350869199060536">ውይ ውይ፣ በስም ውስጥ ህገ-ወጥ ምልክቶች!</translation>
-<translation id="4222932583846282852">በመሰረዝ ላይ...</translation>
 <translation id="4225397296022057997">በሁሉም ጣቢያዎች ላይ</translation>
 <translation id="4235200303672858594">መላው የማያ ገጽ</translation>
 <translation id="4235965441080806197">መግባትን ሰርዝ</translation>
@@ -3827,7 +3826,6 @@
 <translation id="7017480957358237747">የተወሰኑ ድር ጣቢያዎችን ይፍቀዱ ወይም ይከልክሉ።</translation>
 <translation id="7018275672629230621">የአሰሳ ታሪክዎን ያነብባል እና ይቀይራል</translation>
 <translation id="7019805045859631636">ፈጣን</translation>
-<translation id="702252130983202758">የእርስዎ መተግበሪያዎች</translation>
 <translation id="7022562585984256452">የእርስዎ መነሻ ገጽ ተዋቅሯል።</translation>
 <translation id="7025190659207909717">የተንቀሳቃሽ ስልክ ውሂብ አገልግሎት ማቀናበር</translation>
 <translation id="7029809446516969842">የይለፍ ቃላት</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 9ba641f..a86cca52 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -2007,6 +2007,7 @@
 <translation id="409579654357498729">إضافة إلى الطباعة السحابية</translation>
 <translation id="4096508467498758490">إيقاف إضافات وضع مطور البرامج</translation>
 <translation id="4096824249111507322">يتم حاليًا تحضيرالوحدة الآمنة، يُرجى الانتظار (قد يستغرق ذلك بضع دقائق)...</translation>
+<translation id="4097560579602855702">‏البحث في Google</translation>
 <translation id="4099060993766194518">هل تريد استعادة محرك البحث التلقائي؟</translation>
 <translation id="4099874310852108874">حدث خطأ في الشبكة.</translation>
 <translation id="4100733287846229632">المساحة على الجهاز منخفضة للغاية</translation>
@@ -2072,7 +2073,6 @@
 <translation id="42126664696688958">تصدير</translation>
 <translation id="42137655013211669">الدخول إلى هذا المورد محظور  من الخادم</translation>
 <translation id="4215350869199060536">عفوًا، يشتمل الاسم على رموز غير مسموح بها!</translation>
-<translation id="4222932583846282852">جارٍ الإلغاء...</translation>
 <translation id="4225397296022057997">على جميع المواقع</translation>
 <translation id="4235200303672858594">الشاشة بالكامل</translation>
 <translation id="4235965441080806197">إلغاء تسجيل الدخول</translation>
@@ -3826,7 +3826,6 @@
 <translation id="7017480957358237747">السماح ببعض المواقع أو حظرها،</translation>
 <translation id="7018275672629230621">الاطّلاع على سجل التصفح وتغييره</translation>
 <translation id="7019805045859631636">سريع</translation>
-<translation id="702252130983202758">تطبيقاتك</translation>
 <translation id="7022562585984256452">تم تعيين صفحتك الرئيسية.</translation>
 <translation id="7025190659207909717">إدارة خدمة بيانات الجوال</translation>
 <translation id="7029809446516969842">كلمات المرور</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb
index 2cd0e4c4..6844bab 100644
--- a/chrome/app/resources/generated_resources_bg.xtb
+++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -2011,6 +2011,7 @@
 <translation id="409579654357498729">Добавяне към Отпечатване в облак</translation>
 <translation id="4096508467498758490">Деактивиране на разширенията в режим за програмисти</translation>
 <translation id="4096824249111507322">Модулът за сигурност се подготвя. Моля, изчакайте (това може да отнеме няколко минути)...</translation>
+<translation id="4097560579602855702">Търсете с Google</translation>
 <translation id="4099060993766194518">Да се възстанови ли основната търсеща машина?</translation>
 <translation id="4099874310852108874">Възникна грешка в мрежата.</translation>
 <translation id="4100733287846229632">Мястото на устройството е критично малко</translation>
@@ -2076,7 +2077,6 @@
 <translation id="42126664696688958">Експортиране</translation>
 <translation id="42137655013211669">Достъпът до този ресурс бе забранен от сървъра.</translation>
 <translation id="4215350869199060536">Ами сега! Името съдържа невалидни символи!</translation>
-<translation id="4222932583846282852">Анулира се...</translation>
 <translation id="4225397296022057997">На всички сайтове</translation>
 <translation id="4235200303672858594">Цял екран</translation>
 <translation id="4235965441080806197">Анулиране на влизането</translation>
@@ -3830,7 +3830,6 @@
 <translation id="7017480957358237747">да разрешавате или забранявате определени уебсайтове;</translation>
 <translation id="7018275672629230621">Четене и промяна на историята на сърфирането ви</translation>
 <translation id="7019805045859631636">Бързо</translation>
-<translation id="702252130983202758">Вашите приложения</translation>
 <translation id="7022562585984256452">Началната ви страница е зададена.</translation>
 <translation id="7025190659207909717">Управление на мобилната услуга за данни</translation>
 <translation id="7029809446516969842">Пароли</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb
index 940df65..f05fd0e5 100644
--- a/chrome/app/resources/generated_resources_bn.xtb
+++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -2073,7 +2073,6 @@
 <translation id="42126664696688958">রপ্তানি</translation>
 <translation id="42137655013211669">এই সম্পদে অ্যাক্সেস করা সার্ভার দ্বারা নিষিদ্ধ ছিল।</translation>
 <translation id="4215350869199060536">উপস, নামে অবৈধ চিহ্ন রয়েছে!</translation>
-<translation id="4222932583846282852">বাতিল করা হচ্ছে…</translation>
 <translation id="4225397296022057997">সমস্ত সাইটে</translation>
 <translation id="4235200303672858594">সম্পূর্ণ স্ক্রিন</translation>
 <translation id="4235965441080806197">সাইন ইন বাতিল করুন</translation>
@@ -3828,7 +3827,6 @@
 <translation id="7017480957358237747">নির্দিষ্ট কিছু ওয়েবসাইটকে অনুমতি দিন বা নিষিদ্ধ করুন</translation>
 <translation id="7018275672629230621">আপনার ব্রাউজিং ইতিহাস পড়ুন এবং পরিবর্তন করুন</translation>
 <translation id="7019805045859631636">দ্রুত</translation>
-<translation id="702252130983202758">আপনার অ্যাপ</translation>
 <translation id="7022562585984256452">আপনার হোম পৃষ্ঠা সেট করা হয়েছে৷</translation>
 <translation id="7025190659207909717">মোবাইল ডেটা পরিষেবা পরিচালন</translation>
 <translation id="7029809446516969842">পাসওয়ার্ড</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb
index c9eb3d9..ecd9f78 100644
--- a/chrome/app/resources/generated_resources_ca.xtb
+++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -2071,7 +2071,6 @@
 <translation id="42126664696688958">Exporta</translation>
 <translation id="42137655013211669">El servidor ha prohibit l'accés a aquest recurs.</translation>
 <translation id="4215350869199060536">El nom conté símbols no permesos.</translation>
-<translation id="4222932583846282852">S'està cancel·lant...</translation>
 <translation id="4225397296022057997">En tots els llocs web</translation>
 <translation id="4235200303672858594">Tota la pantalla</translation>
 <translation id="4235965441080806197">Cancel·la l'inici de sessió</translation>
@@ -3826,7 +3825,6 @@
 <translation id="7017480957358237747">permet o prohibeix llocs web determinats,</translation>
 <translation id="7018275672629230621">Llegir i canviar l'historial de navegació</translation>
 <translation id="7019805045859631636">Ràpid</translation>
-<translation id="702252130983202758">Les teves aplicacions</translation>
 <translation id="7022562585984256452">S'ha definit la pàgina d'inici.</translation>
 <translation id="7025190659207909717">Gestió de serveis de dades mòbils</translation>
 <translation id="7029809446516969842">Contrasenyes</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb
index 7d02ecc..fdf1dc8 100644
--- a/chrome/app/resources/generated_resources_cs.xtb
+++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -2008,6 +2008,7 @@
 <translation id="409579654357498729">Přidat do služby Cloud Print</translation>
 <translation id="4096508467498758490">Deaktivovat rozšíření v režimu pro vývojáře</translation>
 <translation id="4096824249111507322">Připravuje se modul zabezpečení. Čekejte prosím (možná i několik minut)...</translation>
+<translation id="4097560579602855702">Vyhledávat na Googlu</translation>
 <translation id="4099060993766194518">Obnovit výchozí vyhledávač?</translation>
 <translation id="4099874310852108874">Došlo k chybě sítě.</translation>
 <translation id="4100733287846229632">V zařízení je kriticky málo místa</translation>
@@ -2073,7 +2074,6 @@
 <translation id="42126664696688958">Exportovat</translation>
 <translation id="42137655013211669">Server zakázal přístup k tomuto zdroji.</translation>
 <translation id="4215350869199060536">Jejda, název obsahuje zakázané znaky!</translation>
-<translation id="4222932583846282852">Rušení...</translation>
 <translation id="4225397296022057997">Na všech webech</translation>
 <translation id="4235200303672858594">Celá obrazovka</translation>
 <translation id="4235965441080806197">Zrušit přihlášení</translation>
@@ -3826,7 +3826,6 @@
 <translation id="7017480957358237747">povolit nebo zakázat některé weby,</translation>
 <translation id="7018275672629230621">Číst a upravovat vaši historii procházení</translation>
 <translation id="7019805045859631636">Rychle</translation>
-<translation id="702252130983202758">Vaše aplikace</translation>
 <translation id="7022562585984256452">Domovská stránka byla nastavena.</translation>
 <translation id="7025190659207909717">Správa mobilních datových služeb</translation>
 <translation id="7029809446516969842">Hesla</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb
index a2b47c6..7901b40 100644
--- a/chrome/app/resources/generated_resources_da.xtb
+++ b/chrome/app/resources/generated_resources_da.xtb
@@ -2010,6 +2010,7 @@
 <translation id="409579654357498729">Føj til Cloudprinter</translation>
 <translation id="4096508467498758490">Deaktiver udvidelser, der kører i udviklertilstand</translation>
 <translation id="4096824249111507322">Sikkerhedsmodulet forberedes. Vent lidt (dette kan tage et par minutter)...</translation>
+<translation id="4097560579602855702">Søg på Google</translation>
 <translation id="4099060993766194518">Vil du gendanne standardsøgemaskinen?</translation>
 <translation id="4099874310852108874">Der opstod en netværksfejl.</translation>
 <translation id="4100733287846229632">Der er næsten ikke mere plads på enheden</translation>
@@ -2075,7 +2076,6 @@
 <translation id="42126664696688958">Eksportér</translation>
 <translation id="42137655013211669">Serveren har forbudt dig adgang til denne ressource.</translation>
 <translation id="4215350869199060536">Ups! Navnet indeholder ulovlige tegn.</translation>
-<translation id="4222932583846282852">Annullerer…</translation>
 <translation id="4225397296022057997">På alle websites</translation>
 <translation id="4235200303672858594">Hele skærmen</translation>
 <translation id="4235965441080806197">Annuller login</translation>
@@ -3829,7 +3829,6 @@
 <translation id="7017480957358237747">tillad eller forbyd visse websites,</translation>
 <translation id="7018275672629230621">Læs og rediger din browserhistorik</translation>
 <translation id="7019805045859631636">Hurtig</translation>
-<translation id="702252130983202758">Dine apps</translation>
 <translation id="7022562585984256452">Din startside er blevet konfigureret.</translation>
 <translation id="7025190659207909717">Administration af mobildatatjeneste</translation>
 <translation id="7029809446516969842">Adgangskoder</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb
index 6435705..602d1a1 100644
--- a/chrome/app/resources/generated_resources_de.xtb
+++ b/chrome/app/resources/generated_resources_de.xtb
@@ -2072,7 +2072,6 @@
 <translation id="42126664696688958">Exportieren</translation>
 <translation id="42137655013211669">Der Zugriff auf diese Ressource wurde vom Server nicht zugelassen.</translation>
 <translation id="4215350869199060536">Der Name enthält unzulässige Zeichen.</translation>
-<translation id="4222932583846282852">Wird abgebrochen…</translation>
 <translation id="4225397296022057997">Auf allen Websites</translation>
 <translation id="4235200303672858594">Gesamten Bildschirm</translation>
 <translation id="4235965441080806197">Anmeldung abbrechen</translation>
@@ -3825,7 +3824,6 @@
 <translation id="7017480957358237747">bestimmte Websites freigeben oder sperren,</translation>
 <translation id="7018275672629230621">Ihren Browserverlauf lesen und ändern</translation>
 <translation id="7019805045859631636">Schnell</translation>
-<translation id="702252130983202758">Meine Apps</translation>
 <translation id="7022562585984256452">Ihre Startseite wurde eingerichtet.</translation>
 <translation id="7025190659207909717">Verwaltung mobiler Datendienste</translation>
 <translation id="7029809446516969842">Passwörter</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb
index d3cbb3a7..bf81f4c 100644
--- a/chrome/app/resources/generated_resources_el.xtb
+++ b/chrome/app/resources/generated_resources_el.xtb
@@ -2012,6 +2012,7 @@
 <translation id="409579654357498729">Προσθήκη στο Cloud Print</translation>
 <translation id="4096508467498758490">Απενεργοποίηση επεκτάσεων λειτουργίας προγραμματιστή</translation>
 <translation id="4096824249111507322">Η ασφαλής λειτουργική μονάδα προετοιμάζεται. Περιμένετε (η διαδικασία μπορεί να διαρκέσει λίγα λεπτά)…</translation>
+<translation id="4097560579602855702">Αναζήτηση στο Google</translation>
 <translation id="4099060993766194518">Επαναφορά προεπιλεγμένης μηχανής αναζήτησης;</translation>
 <translation id="4099874310852108874">Παρουσιάστηκε σφάλμα δικτύου.</translation>
 <translation id="4100733287846229632">Ο ελεύθερος χώρος της συσκευής είναι οριακός</translation>
@@ -2077,7 +2078,6 @@
 <translation id="42126664696688958">Εξαγωγή</translation>
 <translation id="42137655013211669">Η πρόσβαση σε αυτόν τον πόρο απαγορεύεται από το διακομιστή.</translation>
 <translation id="4215350869199060536">Ωχ! Υπάρχουν μη έγκυρα σύμβολα στο όνομα!</translation>
-<translation id="4222932583846282852">Ακύρωση…</translation>
 <translation id="4225397296022057997">Σε όλους τους ιστοτόπους</translation>
 <translation id="4235200303672858594">Πλήρης οθόνη</translation>
 <translation id="4235965441080806197">Ακύρωση σύνδεσης</translation>
@@ -3831,7 +3831,6 @@
 <translation id="7017480957358237747">επιτρέψτε ή απαγορεύστε την πρόσβαση σε συγκεκριμένους ιστότοπους,</translation>
 <translation id="7018275672629230621">Ανάγνωση και αλλαγή του ιστορικού περιήγησης</translation>
 <translation id="7019805045859631636">Γρήγορα</translation>
-<translation id="702252130983202758">Οι εφαρμογές σας</translation>
 <translation id="7022562585984256452">Η αρχική σελίδα σας έχει οριστεί.</translation>
 <translation id="7025190659207909717">Διαχείριση υπηρεσιών δεδομένων κινητής συσκευής</translation>
 <translation id="7029809446516969842">Κωδ. πρόσβασης</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 4badd5fb7..123fb0d 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -2076,7 +2076,6 @@
 <translation id="42126664696688958">Export</translation>
 <translation id="42137655013211669">Access to this resource was forbidden by the server.</translation>
 <translation id="4215350869199060536">Oops, illegal symbols in name!</translation>
-<translation id="4222932583846282852">Cancelling...</translation>
 <translation id="4225397296022057997">On all sites</translation>
 <translation id="4235200303672858594">Entire screen</translation>
 <translation id="4235965441080806197">Cancel sign in</translation>
@@ -3829,7 +3828,6 @@
 <translation id="7017480957358237747">allow or prohibit certain websites,</translation>
 <translation id="7018275672629230621">Read and change your browsing history</translation>
 <translation id="7019805045859631636">Fast</translation>
-<translation id="702252130983202758">Your apps</translation>
 <translation id="7022562585984256452">Your home page has been set.</translation>
 <translation id="7025190659207909717">Mobile data service management</translation>
 <translation id="7029809446516969842">Passwords</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb
index 3a93d50..beb95276 100644
--- a/chrome/app/resources/generated_resources_es-419.xtb
+++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -2074,7 +2074,6 @@
 <translation id="42126664696688958">Exportar</translation>
 <translation id="42137655013211669">El servidor prohibió el acceso a este recurso.</translation>
 <translation id="4215350869199060536">El nombre incluye símbolos no permitidos.</translation>
-<translation id="4222932583846282852">Cancelando…</translation>
 <translation id="4225397296022057997">En todos los sitios</translation>
 <translation id="4235200303672858594">Toda la pantalla</translation>
 <translation id="4235965441080806197">Cancelar acceso</translation>
@@ -3827,7 +3826,6 @@
 <translation id="7017480957358237747">permitir o prohibir determinados sitios web;</translation>
 <translation id="7018275672629230621">Leer y cambiar el historial de navegación</translation>
 <translation id="7019805045859631636">Rápido</translation>
-<translation id="702252130983202758">Tus apps</translation>
 <translation id="7022562585984256452">Se configuró tu página principal.</translation>
 <translation id="7025190659207909717">Administración del servicio de datos para celulares</translation>
 <translation id="7029809446516969842">Contraseñas</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb
index 5c9055e8..04ccdf2 100644
--- a/chrome/app/resources/generated_resources_es.xtb
+++ b/chrome/app/resources/generated_resources_es.xtb
@@ -8,6 +8,7 @@
 <translation id="1007408791287232274">No se han podido cargar dispositivos.</translation>
 <translation id="1008186147501209563">Exportar marcadores</translation>
 <translation id="1008557486741366299">Ahora no</translation>
+<translation id="1010498023906173788">Esta pestaña está conectada a un puerto serie.</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{La página no responde}other{Las páginas no responden}}</translation>
 <translation id="1012794136286421601">Se están sincronizando tus archivos de Documentos, Hojas de cálculo, Presentaciones y Dibujos de Google. Abre la aplicación Google Drive para acceder a ellos con y sin conexión.</translation>
 <translation id="1012876632442809908">Dispositivo USB-C (puerto frontal)</translation>
@@ -30,6 +31,7 @@
 <translation id="1036982837258183574">Pulsa |<ph name="ACCELERATOR" />| para salir del modo de pantalla completa</translation>
 <translation id="1038168778161626396">Solo cifrar</translation>
 <translation id="1039337018183941703">El archivo no es válido o está dañado</translation>
+<translation id="1041175011127912238">La página no responde</translation>
 <translation id="1042174272890264476">El ordenador también incluye la biblioteca RLZ de <ph name="SHORT_PRODUCT_NAME" />. RLZ asigna una etiqueta identificable, no exclusiva y no personal para medir las búsquedas y el uso de <ph name="SHORT_PRODUCT_NAME" /> derivados de una determinada campaña promocional. Estas etiquetas aparecen a veces en las consultas de la Búsqueda de Google realizadas en <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1046059554679513793">¡Vaya! Este nombre ya está en uso.</translation>
 <translation id="1046635659603195359">Parece que ya has configurado Voice Match con el Asistente de Google en otro dispositivo. Esas grabaciones anteriores pueden servir para crear un modelo de voz en este dispositivo. No debería llevar más de un minuto.</translation>
@@ -148,6 +150,7 @@
 <translation id="1211364473545090084">Navega por Internet sin guardar tu historial de navegación con una ventana de incógnito</translation>
 <translation id="1213037489357051291">Número de huellas digitales configuradas: <ph name="NUM_FINGERPRINTS" /></translation>
 <translation id="1215411991991485844">Nueva aplicación en segundo plano añadida</translation>
+<translation id="1217483152325416304">Tus datos locales se eliminarán pronto</translation>
 <translation id="1217668622537098248">Volver al clic izquierdo después de una acción</translation>
 <translation id="121783623783282548">Las contraseñas no coinciden.</translation>
 <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />El servicio de ubicación de Google utiliza distintas fuentes, como sensores y redes Wi‑Fi o móviles, para determinar la ubicación de este dispositivo.<ph name="END_PARAGRAPH1" />
@@ -308,6 +311,7 @@
 <translation id="1478340334823509079">Detalles: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">La instalación no está habilitada</translation>
 <translation id="1483493594462132177">Enviar</translation>
+<translation id="1484979925941077974">El sitio web está usando el Bluetooth</translation>
 <translation id="1485015260175968628">Ahora puede:</translation>
 <translation id="1485141095922496924">Versión <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation>
 <translation id="1486096554574027028">Buscar contraseñas</translation>
@@ -457,6 +461,7 @@
 <translation id="1708338024780164500">(Inactiva)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (resolución nativa)</translation>
+<translation id="1711401317189798723">Actualmente hay una copia de seguridad en curso de <ph name="CONTAINER_ID" /></translation>
 <translation id="1712349894969001173">Recibe esta contraseña en tu iPhone</translation>
 <translation id="1712552549805331520"><ph name="URL" /> quiere almacenar datos de forma permanente en tu ordenador local</translation>
 <translation id="1718835860248848330">Última hora</translation>
@@ -606,6 +611,7 @@
 <translation id="1932026958134051332">Opciones de accesibilidad mediante interruptores</translation>
 <translation id="1932098463447129402">Posterior a</translation>
 <translation id="1933809209549026293">Conecta un ratón o un teclado. Si utilizas un dispositivo Bluetooth, asegúrate de que esté listo para la vinculación.</translation>
+<translation id="1937774647013465102">No se puede importar el tipo de arquitectura de contenedores <ph name="ARCHITECTURE_CONTAINER" /> con este dispositivo, que es <ph name="ARCHITECTURE_DEVICE" />. Intenta restaurar este contenedor en otro dispositivo o accede a los archivos de esta imagen de contenedor abriéndola en la aplicación Archivos.</translation>
 <translation id="1938351510777341717">Tecla Comando externa</translation>
 <translation id="1940546824932169984">Dispositivos conectados</translation>
 <translation id="1944921356641260203">Actualización encontrada</translation>
@@ -890,9 +896,11 @@
 <translation id="2392369802118427583">Activar</translation>
 <translation id="2394566832561516196">La configuración se eliminará la próxima vez que se vuelva a cargar la página.</translation>
 <translation id="2395616325548404795">El dispositivo <ph name="DEVICE_TYPE" /> se ha registrado correctamente para ser administrado por la empresa, pero no ha podido enviar la información de la ubicación ni del recurso. Introduce manualmente esta información en la consola de administración de este dispositivo.</translation>
+<translation id="2396783860772170191">Introduce el PIN de 4 dígitos (0000-9999)</translation>
 <translation id="2408955596600435184">Introduce tu PIN</translation>
 <translation id="241082044617551207">Complemento desconocido</translation>
 <translation id="2413749388954403953">Cambiar la interfaz de usuario de marcadores</translation>
+<translation id="241639282915300771">Actualmente hay una restauración en curso de <ph name="CONTAINER_ID" /></translation>
 <translation id="241727068219398187">Se han cifrado los datos con tu contraseña de Google desde el
           <ph name="TIME" />. El cifrado no incluye los métodos de pago ni las direcciones de Google Pay.</translation>
 <translation id="2419706071571366386">Por motivos de seguridad, cierra la sesión cuando termines de utilizar tu ordenador.</translation>
@@ -985,6 +993,7 @@
 <translation id="2538361623464451692">Sincronización inhabilitada</translation>
 <translation id="2540449034743108469">Pulsa Iniciar para detectar las actividades de extensión</translation>
 <translation id="2541002089857695151">¿Quieres optimizar el envío de pantalla completa?</translation>
+<translation id="2541706104884128042">Se ha definido una nueva hora de dormir</translation>
 <translation id="2544853746127077729">Certificado de autenticación rechazado por la red</translation>
 <translation id="2549985041256363841">Iniciar grabación</translation>
 <translation id="2550212893339833758">Memoria trasladada al espacio de reserva</translation>
@@ -1076,6 +1085,7 @@
 <translation id="2677748264148917807">Salir</translation>
 <translation id="2678063897982469759">Volver a habilitar</translation>
 <translation id="268053382412112343">Hi&amp;storial</translation>
+<translation id="2682498795777673382">Actualizado por tu padre o madre</translation>
 <translation id="2683638487103917598">Carpeta ordenada</translation>
 <translation id="2684004000387153598">Para continuar, haz clic en Aceptar y, a continuación, en Añadir perfil para crear un perfil con tu dirección de correo electrónico.</translation>
 <translation id="2688196195245426394">Error al registrar el dispositivo en el servidor (<ph name="CLIENT_ERROR" />)</translation>
@@ -1109,6 +1119,7 @@
 <translation id="2731392572903530958">Volv&amp;er a abrir ventana cerrada</translation>
 <translation id="2731700343119398978">Espera...</translation>
 <translation id="2731710757838467317">Se está creando el usuario supervisado. Esta acción puede tardar unos minutos.</translation>
+<translation id="2731971182069536520">La próxima vez que reinicies tu dispositivo, tu administrador realizará una actualización única que eliminará tus datos locales.</translation>
 <translation id="2734760316755174687">También se restablecerán los permisos de los sitios web de <ph name="SITE_GROUP_NAME" />.</translation>
 <translation id="2735438478659026460">Hacer clic automáticamente cuando se detenga el cursor del ratón</translation>
 <translation id="2735712963799620190">Programar</translation>
@@ -1312,6 +1323,7 @@
 <translation id="304747341537320566">Motores de voz</translation>
 <translation id="3047644958362961983">Esta información nos ayudará a entender mejor tu problema con el Asistente. Se almacena durante un máximo de 90 días y el acceso está restringido a los equipos pertinentes de ingeniería y de gestión de comentarios.</translation>
 <translation id="3053013834507634016">Uso de claves de certificado</translation>
+<translation id="3053273573829329829">Habilitar el PIN de usuario</translation>
 <translation id="3058498974290601450">Puedes activar la sincronización en cualquier momento desde la configuración</translation>
 <translation id="3060379269883947824">Habilitar Enunciar Selección</translation>
 <translation id="3061707000357573562">Aplicar parche a servicio</translation>
@@ -1331,6 +1343,7 @@
 <translation id="3084771660770137092">El proceso de la página web puede haber finalizado porque se haya agotado la memoria de Chrome o por algún otro motivo. Para continuar, vuelve a cargar la página o accede a otra.</translation>
 <translation id="3085412380278336437">El sitio web puede usar la cámara</translation>
 <translation id="3085752524577180175">Host SOCKS</translation>
+<translation id="3088052000289932193">El sitio web está usando MIDI</translation>
 <translation id="3088325635286126843">&amp;Cambiar nombre...</translation>
 <translation id="3089137131053189723">Se ha borrado la búsqueda</translation>
 <translation id="3090193911106258841">Accediendo a la entrada de vídeo y audio</translation>
@@ -1468,6 +1481,7 @@
 <translation id="3317459757438853210">Doble cara</translation>
 <translation id="3317678681329786349">Cámara y micrófono bloqueados</translation>
 <translation id="3319048459796106952">Nueva ventana de &amp;incógnito</translation>
+<translation id="3323521181261657960">Extras: ya tienes más tiempo de pantalla</translation>
 <translation id="3325910708063135066">La cámara y el micrófono están desactivados en las Preferencias del Sistema de Mac</translation>
 <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation>
 <translation id="3331974543021145906">Información de la aplicación</translation>
@@ -1763,6 +1777,7 @@
 <translation id="3765246971671567135">No se ha podido leer la política del modo de demostración sin conexión.</translation>
 <translation id="3766223500670287046">Pantalla remota</translation>
 <translation id="3768037234834996183">Sincronizando tus preferencias...</translation>
+<translation id="377050016711188788">Helado</translation>
 <translation id="3771294271822695279">Archivos de vídeo</translation>
 <translation id="3775432569830822555">Certificado de servidor SSL</translation>
 <translation id="3775705724665058594">Enviar a tus dispositivos</translation>
@@ -1841,6 +1856,7 @@
 <translation id="3869917919960562512">Índice incorrecto</translation>
 <translation id="3870931306085184145">No hay contraseñas guardadas de <ph name="DOMAIN" /></translation>
 <translation id="3871092408932389764">El más bajo</translation>
+<translation id="3871350334636688135">Después de 24 horas, tu administrador llevará a cabo una actualización única que eliminará tus datos locales cuando reinicies tu dispositivo. Guarda los datos locales que necesites en el almacenamiento en la nube en un plazo de 24 horas.</translation>
 <translation id="3872220884670338524">Más acciones (cuenta guardada de <ph name="USERNAME" /> en <ph name="DOMAIN" />)</translation>
 <translation id="3872991219937722530">Libera espacio del disco o el dispositivo no responderá.</translation>
 <translation id="3873315167136380065">Para activar esta opción, <ph name="BEGIN_LINK" />restablece la sincronización<ph name="END_LINK" /> para eliminar tu frase de contraseña de sincronización</translation>
@@ -1919,6 +1935,7 @@
 <translation id="3983400541576569538">Es posible que se hayan perdido datos de algunas aplicaciones</translation>
 <translation id="3983586614702900908">dispositivos de un proveedor desconocido</translation>
 <translation id="3984159763196946143">No se ha podido iniciar el modo de demostración</translation>
+<translation id="3984431586879874039">¿Quieres permitir que este sitio web vea tu llave de seguridad?</translation>
 <translation id="3987348946546879621">Se ha reducido el uso de datos</translation>
 <translation id="3987938432087324095">No he entendido nada.</translation>
 <translation id="3988996860813292272">Seleccionar la zona horaria</translation>
@@ -1992,9 +2009,11 @@
 <translation id="409579654357498729">Añadir a Cloud Print</translation>
 <translation id="4096508467498758490">Inhabilitar extensiones en modo de desarrollador</translation>
 <translation id="4096824249111507322">Se está preparando el módulo seguro. Este proceso tardar unos minutos...</translation>
+<translation id="4097560579602855702">Buscar en Google</translation>
 <translation id="4099060993766194518">¿Restaurar el motor de búsqueda predeterminado?</translation>
 <translation id="4099874310852108874">Se ha producido un error de red</translation>
 <translation id="4100733287846229632">Queda muy poco espacio en el dispositivo</translation>
+<translation id="4100853287411968461">Nuevo límite de tiempo de uso</translation>
 <translation id="4103091233824664032">Introduce tu contraseña para configurar el bloqueo de pantalla y el inicio de sesión</translation>
 <translation id="4104163789986725820">E&amp;xportar...</translation>
 <translation id="4107048419833779140">Identificar y expulsar dispositivos de almacenamiento</translation>
@@ -2056,7 +2075,6 @@
 <translation id="42126664696688958">Exportar</translation>
 <translation id="42137655013211669">El servidor ha prohibido el acceso a este recurso.</translation>
 <translation id="4215350869199060536">¡Vaya! El nombre incluye símbolos que no están permitidos</translation>
-<translation id="4222932583846282852">Cancelando...</translation>
 <translation id="4225397296022057997">En todos los sitios web</translation>
 <translation id="4235200303672858594">Toda la pantalla</translation>
 <translation id="4235965441080806197">Cancelar inicio de sesión</translation>
@@ -2114,6 +2132,7 @@
 <translation id="4324577459193912240">Archivo incompleto</translation>
 <translation id="4325237902968425115">Desinstalando <ph name="LINUX_APP_NAME" />...</translation>
 <translation id="4328203388435897516">Cuando hayas configurado el Chromebook, pulsa el botón del Asistente o di "Ok Google" para recibir ayuda en cualquier momento. Si quieres realizar cambios, accede a los ajustes del Asistente.</translation>
+<translation id="4330191372652740264">Agua helada</translation>
 <translation id="4330387663455830245">No traducir nunca del <ph name="LANGUAGE" /></translation>
 <translation id="4333854382783149454">PKCS #1 SHA-1 con cifrado RSA</translation>
 <translation id="4336979451636460645">Puedes consultar los registros de red en la página <ph name="DEVICE_LOG_LINK" /></translation>
@@ -2149,6 +2168,7 @@
 <translation id="438503109373656455">Rocinante</translation>
 <translation id="4387004326333427325">Certificado de autenticación rechazado de forma remota</translation>
 <translation id="4389091756366370506">Usuario <ph name="VALUE" /></translation>
+<translation id="4390000551125140321">{0,plural, =1{Incógnito}other{# ventanas de incógnito abiertas}}</translation>
 <translation id="439266289085815679">El usuario <ph name="USER_EMAIL" /> controla la configuración del Bluetooth.</translation>
 <translation id="4394049700291259645">Inhabilitar</translation>
 <translation id="4400367121200150367">Los sitios web de los que nunca se guarda la contraseña aparecerán aquí</translation>
@@ -2297,6 +2317,7 @@
 <translation id="4648499713050786492">Desbloquea tu perfil antes de añadir a un usuario.</translation>
 <translation id="4651484272688821107">No se ha podido cargar el componente online con los recursos del modo de demostración.</translation>
 <translation id="465878909996028221">Las redirecciones de navegador solo son compatibles con los protocolos HTTP, HTTPS y de archivo.</translation>
+<translation id="4659077111144409915">Cuenta principal</translation>
 <translation id="4660476621274971848">Se esperaba la versión "<ph name="EXPECTED_VERSION" />", pero se ha detectado la versión "<ph name="NEW_ID" />"</translation>
 <translation id="4662788913887017617">Compartir este marcador con tu iPhone</translation>
 <translation id="4663373278480897665">Cámara permitida</translation>
@@ -2342,6 +2363,7 @@
 <translation id="4724450788351008910">Afiliación modificada</translation>
 <translation id="4725511304875193254">Corgi</translation>
 <translation id="4726710629007580002">Se han recibido advertencias al intentar instalar esta extensión:</translation>
+<translation id="4727847987444062305">Sesión de invitado administrada</translation>
 <translation id="4728558894243024398">Plataforma</translation>
 <translation id="4733082559415072992"><ph name="URL" /> quiere utilizar la ubicación de tu dispositivo</translation>
 <translation id="4733793249294335256">Ubicación</translation>
@@ -2451,6 +2473,7 @@
 <translation id="488785315393301722">Mostrar detalles</translation>
 <translation id="4890773143211625964">Mostrar opciones avanzadas de la impresora</translation>
 <translation id="4891089016822695758">Foro beta</translation>
+<translation id="4892229439761351791">El sitio web puede usar el Bluetooth</translation>
 <translation id="4893336867552636863">Se eliminarán de forma permanente los datos de navegación del dispositivo.</translation>
 <translation id="4893522937062257019">En la pantalla de bloqueo</translation>
 <translation id="4898011734382862273">El certificado "<ph name="CERTIFICATE_NAME" />" representa a una entidad emisora de certificados</translation>
@@ -2626,6 +2649,8 @@
 <translation id="5187295959347858724">Has iniciado sesión en <ph name="SHORT_PRODUCT_NAME" />. Tus marcadores, tu historial y otros ajustes se están sincronizando con tu cuenta de Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> quiere descargar varios archivos</translation>
+<translation id="5192316339598592690">Cambia de cuenta rápidamente e inicia sesión en aplicaciones y sitios web al mismo tiempo.
+    Las aplicaciones y los sitios web pueden pedirte permiso para usar parte de la información de tu cuenta de Google. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Realiza un powerwash e inténtalo de nuevo.</translation>
 <translation id="5204967432542742771">Escribe tu contraseña</translation>
 <translation id="5206215183583316675">¿Quieres eliminar el certificado <ph name="CERTIFICATE_NAME" />?</translation>
@@ -3510,6 +3535,7 @@
 <translation id="6547354035488017500">Libera al menos 512 MB de espacio o el dispositivo no responderá. Para ello, elimina archivos del almacenamiento del dispositivo.</translation>
 <translation id="6550675742724504774">Configuración</translation>
 <translation id="6551508934388063976">El comando no está disponible. Pulsa Ctrl+N para abrir una ventana nueva.</translation>
+<translation id="6551612971599078809">El sitio web está usando un dispositivo USB</translation>
 <translation id="655384502888039633"><ph name="USER_COUNT" /> usuarios</translation>
 <translation id="655483977608336153">Reintentar</translation>
 <translation id="6555432686520421228">Elimina todas las cuentas de usuario y restablece tu dispositivo <ph name="IDS_SHORT_PRODUCT_NAME" /> como si lo acabaras de comprar.</translation>
@@ -3733,6 +3759,7 @@
 <translation id="692114467174262153">No se ha podido abrir <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
 <translation id="6921709132208495314">Detener el consumo de datos en esta página</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="6922745772873733498">Introduce un PIN para imprimir</translation>
 <translation id="6923132443355966645">Desplazarse/Hacer clic</translation>
 <translation id="6923633482430812883">Se ha producido un error al activar el sistema compartido. Comprueba que el servidor de archivos con el que estés conectando sea compatible con SMBv2 o versiones posteriores.</translation>
 <translation id="6930036377490597025">Llave de seguridad externa o sensor integrado</translation>
@@ -3787,6 +3814,7 @@
 <translation id="7003339318920871147">Bases de datos web</translation>
 <translation id="7003723821785740825">Configura una forma más rápida de desbloquear el dispositivo</translation>
 <translation id="7003844668372540529">Producto <ph name="PRODUCT_ID" /> de <ph name="VENDOR_NAME" /> desconocido</translation>
+<translation id="7004402701596653846">El sitio web puede utilizar MIDI</translation>
 <translation id="7004499039102548441">Pestañas recientes</translation>
 <translation id="7005848115657603926">Intervalo de páginas no válido, utilizar <ph name="EXAMPLE_PAGE_RANGE" /></translation>
 <translation id="7006634003215061422">Margen inferior</translation>
@@ -3802,6 +3830,7 @@
 <translation id="7022562585984256452">Se ha establecido tu página de inicio.</translation>
 <translation id="7025190659207909717">Administración de servicio de datos para móviles</translation>
 <translation id="7029809446516969842">Contraseñas</translation>
+<translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Puerto serie conectado</translation>
 <translation id="7031962166228839643">El módulo TPM se está preparando (este proceso puede tardar unos minutos). Por favor, espera...</translation>
 <translation id="7037509989619051237">Texto de vista previa</translation>
 <translation id="7039326228527141150">Acceder a dispositivos USB desde <ph name="VENDOR_NAME" /></translation>
@@ -3826,6 +3855,7 @@
 <translation id="706626672220389329">No se ha podido activar el recurso compartido. El recurso especificado ya está activado.</translation>
 <translation id="7066944511817949584">Error al conectar con "<ph name="DEVICE_NAME" />"</translation>
 <translation id="7067725467529581407">No volver a mostrar.</translation>
+<translation id="7069811530847688087">Puede que <ph name="WEBSITE" /> requiera una llave de seguridad de otro tipo o más reciente</translation>
 <translation id="7070484045139057854">Puede leer y cambiar datos de sitios web</translation>
 <translation id="7072010813301522126">Nombre del acceso directo</translation>
 <translation id="707392107419594760">Selecciona el teclado:</translation>
@@ -3906,6 +3936,7 @@
 <translation id="7189234443051076392">Deja suficiente espacio en tu dispositivo</translation>
 <translation id="7189965711416741966">Huella digital añadida.</translation>
 <translation id="7191159667348037">Impresora desconocida (USB)</translation>
+<translation id="7193051357671784796">Tu organización ha añadido esta aplicación. Reinicia la aplicación para terminar de instalarla.</translation>
 <translation id="7193374945610105795">No hay contraseñas guardadas de <ph name="ORIGIN" /></translation>
 <translation id="7196913789568937443">Crear copia de seguridad en Google Drive. Cambia de dispositivo o restaura tus datos fácilmente en cualquier momento. La copia de seguridad incluye datos de las aplicaciones. Tus copias de seguridad se suben a Google y se cifran con la contraseña de tu cuenta de Google. <ph name="BEGIN_LINK1" />Más información<ph name="END_LINK1" /></translation>
 <translation id="7197190419934240522">Disfruta de la Búsqueda de Google y las funciones inteligentes de Google siempre que navegues</translation>
@@ -4328,6 +4359,7 @@
     <ph name="BR" />
     <ph name="BEGIN_BOLD" />Nota:<ph name="END_BOLD" /> El sistema se reiniciará durante el proceso.</translation>
 <translation id="7829298379596169484">Accediendo a la entrada de audio</translation>
+<translation id="7830594666202422257">Conectar a Linux</translation>
 <translation id="7831491651892296503">No se ha podido configurar la red</translation>
 <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation>
 <translation id="7832084384634357321">Hora de finalización</translation>
@@ -4357,6 +4389,7 @@
 <translation id="7877451762676714207">Se ha producido un error desconocido en el servidor. Vuelve a intentarlo o ponte en contacto con el administrador del servidor.</translation>
 <translation id="7877680364634660272">Recorrido</translation>
 <translation id="7878562273885520351">Es posible que tu contraseña se haya vulnerado</translation>
+<translation id="7880823633812189969">Los datos locales se eliminarán cuando reinicies</translation>
 <translation id="7881483672146086348">Ver cuenta</translation>
 <translation id="7882358943899516840">Tipo de proveedor</translation>
 <translation id="7885253890047913815">Destinos recientes</translation>
@@ -4696,6 +4729,7 @@
 <translation id="8426713856918551002">Habilitando</translation>
 <translation id="8427292751741042100">insertado en otro host</translation>
 <translation id="8428213095426709021">Configuración</translation>
+<translation id="8428628598981198790">No puedes utilizar tu llave de seguridad en este sitio web</translation>
 <translation id="84297032718407999">Tu sesión se cerrará en <ph name="LOGOUT_TIME_LEFT" /></translation>
 <translation id="8431190899827883166">Mostrar toques</translation>
 <translation id="8431909052837336408">Cambiar PIN de la tarjeta SIM</translation>
@@ -4900,6 +4934,7 @@
 <translation id="8732212173949624846">Leer y modificar tu historial de navegación en todos los dispositivos en los que has iniciado sesión</translation>
 <translation id="8732844209475700754">Más ajustes relacionados con la privacidad, la seguridad y la recogida de datos</translation>
 <translation id="8734073480934656039">Al habilitar esta opción, las aplicaciones de kiosk se pueden iniciar automáticamente al iniciarse el navegador.</translation>
+<translation id="8734671092194994316">Se guardará un registro de tu visita a <ph name="WEBSITE" /> en tu llave de seguridad.</translation>
 <translation id="873545264931343897">Cuando el complemento <ph name="PLUGIN_NAME" /> se haya actualizado, vuelve a cargar la página para activarlo</translation>
 <translation id="8736288397686080465">Este sitio se ha actualizado en segundo plano.</translation>
 <translation id="8737685506611670901">Abrir enlaces de <ph name="PROTOCOL" /> en lugar de <ph name="REPLACED_HANDLER_TITLE" /></translation>
@@ -4998,6 +5033,7 @@
 <translation id="8877448029301136595">[directorio principal]</translation>
 <translation id="8879284080359814990">&amp;Mostrar como pestaña</translation>
 <translation id="8883847527783433352">Sincronizar con otra cuenta</translation>
+<translation id="8884570509232205463">A partir de ahora, el dispositivo se bloqueará a las <ph name="UNLOCK_TIME" />.</translation>
 <translation id="8885197664446363138">Smart Lock no está disponible</translation>
 <translation id="8888253246822647887">La aplicación se abrirá cuando la actualización se haya completado. Las actualizaciones pueden tardar varios minutos.</translation>
 <translation id="8888432776533519951">Color:</translation>
@@ -5090,6 +5126,7 @@
 <translation id="9026852570893462412">Descargando la máquina virtual. Este proceso puede tardar unos minutos.</translation>
 <translation id="9027459031423301635">Abrir enlace en una &amp;pestaña nueva</translation>
 <translation id="9030515284705930323">Tu organización no ha habilitado Google Play Store en tu cuenta. Ponte en contacto con el administrador para obtener más información.</translation>
+<translation id="9030785788945687215">Gmail</translation>
 <translation id="9033857511263905942">&amp;Pegar</translation>
 <translation id="9037965129289936994">Mostrar original</translation>
 <translation id="9038649477754266430">Utilizar un servicio de predicciones para que las páginas se carguen más rápido</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb
index f3e16d5..71d66c57 100644
--- a/chrome/app/resources/generated_resources_et.xtb
+++ b/chrome/app/resources/generated_resources_et.xtb
@@ -2077,7 +2077,6 @@
 <translation id="42126664696688958">Eksportimine</translation>
 <translation id="42137655013211669">Server keelas juurdepääsu ressursile.</translation>
 <translation id="4215350869199060536">Kahjuks on nimes valed märgid.</translation>
-<translation id="4222932583846282852">Tühistamine …</translation>
 <translation id="4225397296022057997">Kõikidel saitidel</translation>
 <translation id="4235200303672858594">Kogu ekraan</translation>
 <translation id="4235965441080806197">Tühista sisselogimine</translation>
@@ -3830,7 +3829,6 @@
 <translation id="7017480957358237747">lubada või keelata teatud veebisaite,</translation>
 <translation id="7018275672629230621">Sirvimisajaloo lugemine ja muutmine</translation>
 <translation id="7019805045859631636">Kiire</translation>
-<translation id="702252130983202758">Teie rakendused</translation>
 <translation id="7022562585984256452">Teie avaleht on määratud.</translation>
 <translation id="7025190659207909717">Mobiilse andmesideteenuse haldus</translation>
 <translation id="7029809446516969842">Paroolid</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb
index 83d1146..907e5d2b 100644
--- a/chrome/app/resources/generated_resources_fa.xtb
+++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -2073,7 +2073,6 @@
 <translation id="42126664696688958">صادر کردن</translation>
 <translation id="42137655013211669">سرور، دسترسی به این منبع را ممنوع کرد.</translation>
 <translation id="4215350869199060536">اوووه، نماد‌های غیرقانونی در نام!</translation>
-<translation id="4222932583846282852">درحال لغو کردن…</translation>
 <translation id="4225397296022057997">در همه سایت‌ها</translation>
 <translation id="4235200303672858594">کل صفحه</translation>
 <translation id="4235965441080806197">لغو ورود به سیستم</translation>
@@ -3826,7 +3825,6 @@
 <translation id="7017480957358237747">وب‌سایت‌های خاصی را مجاز یا ممنوع کنید،</translation>
 <translation id="7018275672629230621">خواندن و تغییر سابقه مرورگرتان</translation>
 <translation id="7019805045859631636">سریع</translation>
-<translation id="702252130983202758">برنامه‌های شما</translation>
 <translation id="7022562585984256452">صفحه اصلی شما تنظیم شد.</translation>
 <translation id="7025190659207909717">مدیریت خدمات داده‌های تلفن همراه</translation>
 <translation id="7029809446516969842">گذرواژه‌ها</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb
index b07eed6a..c45d09a 100644
--- a/chrome/app/resources/generated_resources_fi.xtb
+++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -2075,7 +2075,6 @@
 <translation id="42126664696688958">Vie</translation>
 <translation id="42137655013211669">Palvelin kielsi tämän resurssin käytön.</translation>
 <translation id="4215350869199060536">Hups, nimessä on luvattomia merkkejä!</translation>
-<translation id="4222932583846282852">Peruutetaan…</translation>
 <translation id="4225397296022057997">Kaikilla sivustoilla</translation>
 <translation id="4235200303672858594">Koko ruutu</translation>
 <translation id="4235965441080806197">Peruuta sisäänkirjautuminen</translation>
@@ -3830,7 +3829,6 @@
 <translation id="7017480957358237747">sallia tai estää tietyt verkkosivustot,</translation>
 <translation id="7018275672629230621">Lukea ja muokata selaushistoriaasi</translation>
 <translation id="7019805045859631636">Nopea</translation>
-<translation id="702252130983202758">Omat sovellukset</translation>
 <translation id="7022562585984256452">Etusivusi on asetettu.</translation>
 <translation id="7025190659207909717">Mobiilitiedonsiirtopalvelun hallinta</translation>
 <translation id="7029809446516969842">Salasanat</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb
index 9536dee..7713270 100644
--- a/chrome/app/resources/generated_resources_fil.xtb
+++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -8,6 +8,7 @@
 <translation id="1007408791287232274">Hindi ma-load ang mga device.</translation>
 <translation id="1008186147501209563">I-export ang mga bookmark</translation>
 <translation id="1008557486741366299">Hindi Ngayon</translation>
+<translation id="1010498023906173788">Nakakonekta ang tab na ito sa isang serial port.</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Hindi Tumutugon ang Page}one{Hindi Tumutugon ang Mga Page}other{Hindi Tumutugon ang Mga Page}}</translation>
 <translation id="1012794136286421601">Sini-sync ang iyong mga file ng Docs, Mga Sheet, Slide at Guhit. Buksan ang Google Drive app upang i-access ang mga ito online o offline.</translation>
 <translation id="1012876632442809908">USB-C device (port sa harap)</translation>
@@ -30,6 +31,7 @@
 <translation id="1036982837258183574">Pindutin ang |<ph name="ACCELERATOR" />| upang lumabas sa full screen</translation>
 <translation id="1038168778161626396">Encipher Lamang</translation>
 <translation id="1039337018183941703">Di-wasto o sira ang file</translation>
+<translation id="1041175011127912238">Hindi tumutugon ang page na ito</translation>
 <translation id="1042174272890264476">Ang iyong computer ay may naka-built in din na RLZ library ng <ph name="SHORT_PRODUCT_NAME" />. Nagtatalaga ang RLZ ng hindi natatangi at hindi personal na nakakapagpakilalang tag upang sukatin ang mga paghahanap at paggamit ng <ph name="SHORT_PRODUCT_NAME" /> na nahimok ng isang partikular na kampanya sa pag-promote. Lumalabas minsan ang mga label na ito sa mga query sa Paghahanap sa Google sa <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1046059554679513793">Naku, ginagamit na ang pangalang ito!</translation>
 <translation id="1046635659603195359">Mukhang na-set up mo na ang Voice Match sa iyong Google Assistant sa isa pang device. Magagamit ang mga nakaraang recording na ito para gumawa ng voice model sa device na ito. Hindi dapat ito abutin nang mahigit isang minuto.</translation>
@@ -148,6 +150,7 @@
 <translation id="1211364473545090084">Gamitin ang web nang hindi nase-save ang iyong history ng pag-browse gamit ang isang incognito window</translation>
 <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> ang naka-set up na fingerprint</translation>
 <translation id="1215411991991485844">Nadagdag ang bagong background na app</translation>
+<translation id="1217483152325416304">Malapit nang i-delete ang iyong lokal na data</translation>
 <translation id="1217668622537098248">I-revert sa pag-left click pagkatapos ng pagkilos</translation>
 <translation id="121783623783282548">Hindi magkatugma ang mga password.</translation>
 <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />Gumagamit ang serbisyo ng lokasyon ng Google ng mga source tulad ng mga Wi-Fi at mobile network para makatulong na matantya ang lokasyon ng device na ito.<ph name="END_PARAGRAPH1" />
@@ -308,6 +311,7 @@
 <translation id="1478340334823509079">Mga detalye: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Hindi naka-enable ang pag-install</translation>
 <translation id="1483493594462132177">Ipadala</translation>
+<translation id="1484979925941077974">Gumagamit ng Bluetooth ang site</translation>
 <translation id="1485015260175968628">Maaari na itong:</translation>
 <translation id="1485141095922496924">Bersyon <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation>
 <translation id="1486096554574027028">Maghanap ng mga password</translation>
@@ -457,6 +461,7 @@
 <translation id="1708338024780164500">(Hindi aktibo)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (Native)</translation>
+<translation id="1711401317189798723">Kasalukuyang isinasagawa ang pag-back up para sa <ph name="CONTAINER_ID" /></translation>
 <translation id="1712349894969001173">Kunin ang password na ito sa iyong iPhone</translation>
 <translation id="1712552549805331520">Gusto ng <ph name="URL" /> na permanenteng mag-store ng data sa iyong lokal na computer</translation>
 <translation id="1718835860248848330">Huling oras</translation>
@@ -606,6 +611,7 @@
 <translation id="1932026958134051332">Mga opsyon sa switch access</translation>
 <translation id="1932098463447129402">Hindi Bago</translation>
 <translation id="1933809209549026293">Mangyaring magkonekta ng isang mouse o keyboard. Kung gumagamit ka ng Bluetooth device, tiyakin na ito ay handa na upang ipares.</translation>
+<translation id="1937774647013465102">Hindi puwedeng mag-import ng uri ng architecture ng container na <ph name="ARCHITECTURE_CONTAINER" /> sa device na ito na <ph name="ARCHITECTURE_DEVICE" />. Maaari mong subukang i-restore ang container na ito sa ibang device, o puwede mong i-access ang mga file sa loob ng ganitong larawan ng container sa pamamagitan ng pagbukas sa app na Mga File.</translation>
 <translation id="1938351510777341717">External na Command</translation>
 <translation id="1940546824932169984">Mga nakakonektang device</translation>
 <translation id="1944921356641260203">May nahanap na update</translation>
@@ -890,9 +896,11 @@
 <translation id="2392369802118427583">I-activate</translation>
 <translation id="2394566832561516196">Maki-clear ang mga setting sa susunod na pag-reload.</translation>
 <translation id="2395616325548404795">Matagumpay na na-enroll ang iyong <ph name="DEVICE_TYPE" /> para sa pamamahala ng enterprise, ngunit hindi naipadala ang impormasyon ng asset at lokasyon nito. Pakilagay nang manual ang impormasyong ito na mula sa iyong Admin console para sa device na ito.</translation>
+<translation id="2396783860772170191">Ilagay ang 4 na digit na pin (0000-9999)</translation>
 <translation id="2408955596600435184">Ilagay ang iyong PIN</translation>
 <translation id="241082044617551207">Hindi kilalang plugin</translation>
 <translation id="2413749388954403953">Baguhin ang user interface ng mga bookmark</translation>
+<translation id="241639282915300771">Kasalukuyang isinasagawa ang pag-restore para sa <ph name="CONTAINER_ID" /></translation>
 <translation id="241727068219398187">Na-encrypt ang data gamit ang iyong password sa Google simula noong
           <ph name="TIME" />. Hindi kasama rito ang mga paraan ng pagbabayad at address mula sa Google Pay.</translation>
 <translation id="2419706071571366386">Para sa seguridad, mag-sign out kapag hindi ginagamit ang iyong computer.</translation>
@@ -985,6 +993,7 @@
 <translation id="2538361623464451692">Naka-disable ang pag-sync</translation>
 <translation id="2540449034743108469">Pindutin ang "Simulan" para makinig sa mga aktibidad ng extension</translation>
 <translation id="2541002089857695151">I-optimize ang fullscreen na pag-cast?</translation>
+<translation id="2541706104884128042">Naitakda ang bagong oras ng pagtulog</translation>
 <translation id="2544853746127077729">Tinanggihan ng network ang certificate sa pagpapatunay</translation>
 <translation id="2549985041256363841">Simulang mag-record</translation>
 <translation id="2550212893339833758">Na-swap na memory</translation>
@@ -1076,6 +1085,7 @@
 <translation id="2677748264148917807">Umalis</translation>
 <translation id="2678063897982469759">Muling paganahin</translation>
 <translation id="268053382412112343">Ka&amp;saysayan</translation>
+<translation id="2682498795777673382">Update mula sa iyong magulang</translation>
 <translation id="2683638487103917598">Pinagbukod-bukod ang folder</translation>
 <translation id="2684004000387153598">Upang magpatuloy, i-click ang OK, tapos i-click ang Magdagdag ng Tao upang gumawa ng bagong profile para sa iyong email address.</translation>
 <translation id="2688196195245426394">Error kapag inirerehistro ang device sa server: <ph name="CLIENT_ERROR" />.</translation>
@@ -1109,6 +1119,7 @@
 <translation id="2731392572903530958">M&amp;uling Buksan ang Nakasarang Window</translation>
 <translation id="2731700343119398978">Mangyaring maghintay...</translation>
 <translation id="2731710757838467317">Ginagawa ang iyong pinangangasiwaang user. Maaari itong tumagal ng ilang sandali.</translation>
+<translation id="2731971182069536520">Sa susunod na i-restart mo ang iyong device, magsasagawa ang administrator mo ng isang beses na pag-update na magde-delete sa iyong lokal na data.</translation>
 <translation id="2734760316755174687">Mare-reset din ang mga site sa ilalim ng <ph name="SITE_GROUP_NAME" />.</translation>
 <translation id="2735438478659026460">Awtomatikong i-click kapag huminto ang cursor ng mouse</translation>
 <translation id="2735712963799620190">Iskedyul</translation>
@@ -1312,6 +1323,7 @@
 <translation id="304747341537320566">Mga Engine sa Pagsasalita</translation>
 <translation id="3047644958362961983">Makakatulong sa amin ang impormasyong ito na maunawaan nang mas mabuti ang iyong isyu sa Assistant. Iso-store ito sa loob ng hanggang 90 araw at paghihigpitan ang access sa mga naaangkop na team ng engineering at feedback.</translation>
 <translation id="3053013834507634016">Paggamit ng Certificate Key </translation>
+<translation id="3053273573829329829">I-enable ang pin ng user</translation>
 <translation id="3058498974290601450">Maaari mong i-on ang pag-sync anumang oras sa mga setting.</translation>
 <translation id="3060379269883947824">I-enable ang Select to Speak</translation>
 <translation id="3061707000357573562">Serbisyo sa Pag-patch</translation>
@@ -1331,6 +1343,7 @@
 <translation id="3084771660770137092">Naubusan ng memorya ang Chrome o winakasan ang proseso para sa webpage dahil sa ilang kadahilanan. Upang magpatuloy, mag-reload o pumunta sa isa pang pahina.</translation>
 <translation id="3085412380278336437">Maaaring gamitin ng site ang iyong camera</translation>
 <translation id="3085752524577180175">SOCKS Host</translation>
+<translation id="3088052000289932193">Gumagamit ng MIDI ang site</translation>
 <translation id="3088325635286126843">&amp;Palitan ang pangalan...</translation>
 <translation id="3089137131053189723">Na-clear ang paghahanap</translation>
 <translation id="3090193911106258841">Ina-access ang input ng audio at video</translation>
@@ -1470,6 +1483,7 @@
 <translation id="3317459757438853210">Magkabilaan</translation>
 <translation id="3317678681329786349">Naka-block ang camera at mikropono</translation>
 <translation id="3319048459796106952">Bagong &amp;incognito window</translation>
+<translation id="3323521181261657960">Bonus! Nadagdagan ang tagal ng paggamit mo</translation>
 <translation id="3325910708063135066">Naka-off ang camera at mikropono sa System Preferences ng Mac</translation>
 <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation>
 <translation id="3331974543021145906">Impormasyon ng app</translation>
@@ -1765,6 +1779,7 @@
 <translation id="3765246971671567135">Hindi ma-read ang patakaran ng offline na demo mode.</translation>
 <translation id="3766223500670287046">Malayong screen</translation>
 <translation id="3768037234834996183">Nagsi-sync ng iyong mga kagustuhan...</translation>
+<translation id="377050016711188788">Icecream</translation>
 <translation id="3771294271822695279">Mga Video File</translation>
 <translation id="3775432569830822555">SSL Server Certificate</translation>
 <translation id="3775705724665058594">Ipadala sa iyong mga device</translation>
@@ -1843,6 +1858,7 @@
 <translation id="3869917919960562512">Maling index.</translation>
 <translation id="3870931306085184145">Walang naka-save na password para sa <ph name="DOMAIN" /></translation>
 <translation id="3871092408932389764">Pinakamababa</translation>
+<translation id="3871350334636688135">Pagkalipas ng 24 na oras, magsasagawa ang administrator mo ng isang beses na pag-update na magde-delete sa iyong lokal na data kapag na-restart mo ang device mo. I-save ang anumang lokal na data na kailangan mo sa cloud storage sa loob ng 24 na oras.</translation>
 <translation id="3872220884670338524">Higit pang pagkilos, naka-save na account para sa <ph name="USERNAME" /> sa <ph name="DOMAIN" /></translation>
 <translation id="3872991219937722530">Magbakante ng espasyo sa disk o hindi gagana nang maayos ang iyong device.</translation>
 <translation id="3873315167136380065">Para i-on ito, <ph name="BEGIN_LINK" />i-reset ang pag-sync<ph name="END_LINK" /> para alisin ang iyong passphrase sa pag-sync</translation>
@@ -1922,6 +1938,7 @@
 <translation id="3983400541576569538">Maaaring mawala ang data mula sa ilang app</translation>
 <translation id="3983586614702900908">mga device mula sa isang hindi kilalang vendor</translation>
 <translation id="3984159763196946143">Hindi masimulan ang demo mode</translation>
+<translation id="3984431586879874039">Payagan ang site na ito na makita ang iyong security key?</translation>
 <translation id="3987348946546879621">Nakatipid ng data</translation>
 <translation id="3987938432087324095">Paumanhin, hindi ko naunawaan iyon.</translation>
 <translation id="3988996860813292272">Pumili ng timezone</translation>
@@ -1995,9 +2012,11 @@
 <translation id="409579654357498729">Idagdag sa Cloud Print</translation>
 <translation id="4096508467498758490">I-disable ang mga extension ng developer mode</translation>
 <translation id="4096824249111507322">Inihahanda ang secure na module, pakihintay (maaari itong abutin nang ilang minuto)...</translation>
+<translation id="4097560579602855702">Maghanap sa Google</translation>
 <translation id="4099060993766194518">I-restore ang default na search engine?</translation>
 <translation id="4099874310852108874">Nagkaroon ng error sa network.</translation>
 <translation id="4100733287846229632">Sobrang kaunti na lang ang espasyo ng device</translation>
+<translation id="4100853287411968461">Bagong limitasyon sa tagal ng paggamit</translation>
 <translation id="4103091233824664032">Ilagay ang iyong password para i-configure ang lock ng screen at pag-sign in</translation>
 <translation id="4104163789986725820">I-e&amp;xport...</translation>
 <translation id="4107048419833779140">Kumilala at mag-eject ng mga storage device</translation>
@@ -2059,7 +2078,6 @@
 <translation id="42126664696688958">I-export</translation>
 <translation id="42137655013211669">Ipinagbabawal ng server ang access sa mapagkukunang ito.</translation>
 <translation id="4215350869199060536">Oops, mayroong mga ilegal na simbolo sa pangalan!</translation>
-<translation id="4222932583846282852">Kinakansela...</translation>
 <translation id="4225397296022057997">Sa lahat ng site</translation>
 <translation id="4235200303672858594">Buong screen</translation>
 <translation id="4235965441080806197">Kanselahin ang pag-sign in</translation>
@@ -2117,6 +2135,7 @@
 <translation id="4324577459193912240">Hindi kumpleto ang file</translation>
 <translation id="4325237902968425115">Ina-uninstall ang <ph name="LINUX_APP_NAME" />...</translation>
 <translation id="4328203388435897516">Kapag na-set up na ang iyong Chromebook, pindutin ang button ng Assistant o sabihin ang "Ok Google" para humingi ng tulong anumang oras. Pumunta sa mga setting ng Assistant para gumawa ng mga pagbabago.</translation>
+<translation id="4330191372652740264">Icewater</translation>
 <translation id="4330387663455830245">Huwag Isalin Ang <ph name="LANGUAGE" /></translation>
 <translation id="4333854382783149454">PKCS #1 SHA-1 na May RSA Encryption</translation>
 <translation id="4336979451636460645">Para sa mga log ng network, tingnan ang: <ph name="DEVICE_LOG_LINK" /></translation>
@@ -2152,6 +2171,7 @@
 <translation id="438503109373656455">Petra</translation>
 <translation id="4387004326333427325">Remote na tinanggihan ang certificate sa pagpapatunay</translation>
 <translation id="4389091756366370506">User <ph name="VALUE" /></translation>
+<translation id="4390000551125140321">{0,plural, =1{Incognito}one{# bukas na incognito window}other{# na bukas na incognito window}}</translation>
 <translation id="439266289085815679">Ang configuration ng bluetooth ay kinokontrol ni <ph name="USER_EMAIL" />.</translation>
 <translation id="4394049700291259645">Huwag paganahin</translation>
 <translation id="4400367121200150367">Lalabas dito ang mga site na hindi kailanman nagse-save ng mga password</translation>
@@ -2300,6 +2320,7 @@
 <translation id="4648499713050786492">Paki-unlock ang iyong profile bago magdagdag ng tao.</translation>
 <translation id="4651484272688821107">Hindi ma-load ang online na bahagi gamit ang mga resource ng demo mode.</translation>
 <translation id="465878909996028221">Tanging http, https at file protocol ang sinusuportahan para sa mga pag-redirect ng browser.</translation>
+<translation id="4659077111144409915">Pangunahing account</translation>
 <translation id="4660476621274971848">"<ph name="EXPECTED_VERSION" />" ang inaasahang bersyon, ngunit "<ph name="NEW_ID" />" ang bersyon</translation>
 <translation id="4662788913887017617">Ibahagi ang bookmark na ito sa iyong iPhone</translation>
 <translation id="4663373278480897665">Pinapayagan ang camera</translation>
@@ -2345,6 +2366,7 @@
 <translation id="4724450788351008910">Binago ang Kaugnayan</translation>
 <translation id="4725511304875193254">Corgi</translation>
 <translation id="4726710629007580002">Nagkaroon ng mga babala noong sinusubukang i-install ang extension na ito:</translation>
+<translation id="4727847987444062305">Pinapamahalaang session ng bisita</translation>
 <translation id="4728558894243024398">Platform</translation>
 <translation id="4733082559415072992">Gustong gamitin ng <ph name="URL" /> ang lokasyon ng iyong device</translation>
 <translation id="4733793249294335256">Lokasyon</translation>
@@ -2454,6 +2476,7 @@
 <translation id="488785315393301722">Ipakita ang Mga Detalye</translation>
 <translation id="4890773143211625964">Ipakita ang mga advanced na opsyon sa printer</translation>
 <translation id="4891089016822695758">Forum sa Beta</translation>
+<translation id="4892229439761351791">Puwedeng gumamit ng Bluetooth ang site</translation>
 <translation id="4893336867552636863">Permanente nitong ide-delete ang iyong data sa pag-browse sa device na ito.</translation>
 <translation id="4893522937062257019">Sa lock screen</translation>
 <translation id="4898011734382862273">Kinakatawan ng certificate na "<ph name="CERTIFICATE_NAME" />" ang isang Certification Authority</translation>
@@ -2629,6 +2652,8 @@
 <translation id="5187295959347858724">Naka-sign in ka na ngayon sa <ph name="SHORT_PRODUCT_NAME" />. Ang iyong mga bookmark, kasaysayan, at ibang mga setting ay sini-sync sa iyong Google Account.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422">Gustong mag-download ng <ph name="ORIGIN" /> ng maraming file</translation>
+<translation id="5192316339598592690">Mabilis na lumipat ng account at mag-sign sa mga app at website nang sabay-sabay.
+    Puwedeng humiling sa iyo ang mga app at site ng pahintulot na gamitin ang ilan sa impormasyon ng Google Account mo. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Paki-powerwash ang device at subukang muli.</translation>
 <translation id="5204967432542742771">Ipasok ang password</translation>
 <translation id="5206215183583316675">I-delete ang "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3513,6 +3538,7 @@
 <translation id="6547354035488017500">Magbakante ng hindi bababa sa 512 MB ng espasyo ng iyong device, kung hindi ay hindi gagana nang maayos ang iyong device. Upang magbakante ng espasyo, mag-delete ng mga file mula sa storage ng device.</translation>
 <translation id="6550675742724504774">Mga Pagpipilian</translation>
 <translation id="6551508934388063976">Hindi available ang command. Pindutin ang control-N upang magbukas ng bagong window.</translation>
+<translation id="6551612971599078809">Gumagamit ng USB ang site</translation>
 <translation id="655384502888039633"><ph name="USER_COUNT" /> )(na) user</translation>
 <translation id="655483977608336153">Subukang muli</translation>
 <translation id="6555432686520421228">Alisin ang lahat ng account ng user at i-reset ang iyong <ph name="IDS_SHORT_PRODUCT_NAME" /> na device upang maging parang bago.</translation>
@@ -3736,6 +3762,7 @@
 <translation id="692114467174262153">Hindi mabuksan ang <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
 <translation id="6921709132208495314">Ihinto ang paggamit ng data sa page na ito</translation>
 <translation id="6922128026973287222">Mag-save ng data at mag-browse nang mas mabilis gamit ang Data Saver ng Google. I-click upang matuto pa.</translation>
+<translation id="6922745772873733498">Maglagay ng pin para mag-print</translation>
 <translation id="6923132443355966645">Mag-scroll / Mag-click</translation>
 <translation id="6923633482430812883">Nagkaroon ng error sa pag-mount ng pagbabahagi. Pakitingnan kung sumusuporta sa SMBv2 o mas bago ang file server kung saan ka kumokonekta.</translation>
 <translation id="6930036377490597025">External na security key o built-in na sensor</translation>
@@ -3790,6 +3817,7 @@
 <translation id="7003339318920871147">Mga database ng web</translation>
 <translation id="7003723821785740825">Mag-set up ng mas mabilis na paraan upang i-unlock ang iyong device</translation>
 <translation id="7003844668372540529">Hindi kilalang produkto na <ph name="PRODUCT_ID" /> mula sa <ph name="VENDOR_NAME" /></translation>
+<translation id="7004402701596653846">Puwedeng gumamit ang site ng MIDI</translation>
 <translation id="7004499039102548441">Mga Kamakailang Tab</translation>
 <translation id="7005848115657603926">Di-wastong saklaw ng pahina, gamitin ang <ph name="EXAMPLE_PAGE_RANGE" /></translation>
 <translation id="7006634003215061422">Margin sa ibaba</translation>
@@ -3805,6 +3833,7 @@
 <translation id="7022562585984256452">Naitakda na ang iyong home page.</translation>
 <translation id="7025190659207909717">Pamamahala sa serbisyo ng data ng mobile</translation>
 <translation id="7029809446516969842">Mga Password</translation>
+<translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Nakakonekta ang serial port</translation>
 <translation id="7031962166228839643">Ang TPM ay ihinahanda, mangyaring maghintay (maaaring tumagal ito nang ilang minuto)...</translation>
 <translation id="7037509989619051237">Text na ipi-preview</translation>
 <translation id="7039326228527141150">Mag-access ng mga USB device mula sa <ph name="VENDOR_NAME" /></translation>
@@ -3829,6 +3858,7 @@
 <translation id="706626672220389329">Nagka-error sa pag-mount ng share. Naka-mount na ang isinaad na share.</translation>
 <translation id="7066944511817949584">Nabigong kumonekta sa "<ph name="DEVICE_NAME" />".</translation>
 <translation id="7067725467529581407">Huwag na itong ipakitang muli.</translation>
+<translation id="7069811530847688087">Puwedeng mangailangan ang <ph name="WEBSITE" /> ng mas bago o ibang uri ng security key</translation>
 <translation id="7070484045139057854">Mari-read at Mababago Nito ang Data ng Site</translation>
 <translation id="7072010813301522126">Pangalan ng shortcut</translation>
 <translation id="707392107419594760">Piliin ang iyong keyboard:</translation>
@@ -3909,6 +3939,7 @@
 <translation id="7189234443051076392">Tiyaking may sapat na espasyo sa iyong device</translation>
 <translation id="7189965711416741966">Naidagdag ang fingerprint.</translation>
 <translation id="7191159667348037">Hindi Alam na Printer (USB)</translation>
+<translation id="7193051357671784796">Idinagdag ng iyong organisasyon ang app na ito. I-restart ang app para tapusin ang pag-install nito.</translation>
 <translation id="7193374945610105795">Walang naka-save na password para sa <ph name="ORIGIN" /></translation>
 <translation id="7196913789568937443">Mag-back up sa Google Drive. Madaling i-restore ang iyong data o magpalit ng device anumang oras. Kabilang sa iyong backup ang data ng app. Ina-upload sa Google ang iyong mga backup at ine-encrypt gamit ang password ng Google Account mo. <ph name="BEGIN_LINK1" />Matuto Pa<ph name="END_LINK1" /></translation>
 <translation id="7197190419934240522">Makakuha ng Google Search at Google smarts sa tuwing magba-browse ka</translation>
@@ -4331,6 +4362,7 @@
     <ph name="BR" />
     <ph name="BEGIN_BOLD" />Tandaan:<ph name="END_BOLD" />  Mare-reboot ang system sa panahon ng proseso.</translation>
 <translation id="7829298379596169484">Ina-access ang input ng audio</translation>
+<translation id="7830594666202422257">Kumonekta sa Linux</translation>
 <translation id="7831491651892296503">Nagkaroon ng error sa pag-configure sa network</translation>
 <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation>
 <translation id="7832084384634357321">Oras ng pagtatapos</translation>
@@ -4360,6 +4392,7 @@
 <translation id="7877451762676714207">Hindi alam na error sa server. Pakisubukang muli, o makipag-ugnay sa administrator ng server.</translation>
 <translation id="7877680364634660272">Paglilibot</translation>
 <translation id="7878562273885520351">Maaaring makompromismo ang iyong password</translation>
+<translation id="7880823633812189969">Ide-delete ang lokal na data kapag nag-restart ka</translation>
 <translation id="7881483672146086348">Tingnan ang Account</translation>
 <translation id="7882358943899516840">Uri ng provider</translation>
 <translation id="7885253890047913815">Mga Kamakailang Patutunguhan</translation>
@@ -4699,6 +4732,7 @@
 <translation id="8426713856918551002">Ine-enable</translation>
 <translation id="8427292751741042100">naka-embed sa anumang host</translation>
 <translation id="8428213095426709021">Mga Setting</translation>
+<translation id="8428628598981198790">Hindi puwedeng gamitin ang iyong security key sa site na ito</translation>
 <translation id="84297032718407999">Masa-sign out ka sa loob ng <ph name="LOGOUT_TIME_LEFT" /></translation>
 <translation id="8431190899827883166">Ipakita ang mga pag-tap</translation>
 <translation id="8431909052837336408">Palitan ang PIN ng SIM</translation>
@@ -4904,6 +4938,7 @@
 <translation id="8732212173949624846">Basahin at baguhin ang iyong history ng pag-browse sa lahat ng iyong naka-sign in na device</translation>
 <translation id="8732844209475700754">Higit pang setting na may kaugnayan sa privacy, seguridad, at pangongolekta ng data</translation>
 <translation id="8734073480934656039">Pinapayagan ng pag-enable sa setting na ito na awtomatikong ilunsad ang mga kiosk application sa startup.</translation>
+<translation id="8734671092194994316">Mag-iiwan ito ng tala ng iyong pagbisita sa <ph name="WEBSITE" /> sa security key mo.</translation>
 <translation id="873545264931343897">Kapag natapos nang ma-update ang <ph name="PLUGIN_NAME" />, i-reload ang page upang i-activate ito</translation>
 <translation id="8736288397686080465">Na-update ang site na ito sa background.</translation>
 <translation id="8737685506611670901">Buksan ang mga link ng <ph name="PROTOCOL" /> sa halip na ang <ph name="REPLACED_HANDLER_TITLE" /></translation>
@@ -5003,6 +5038,7 @@
 <translation id="8877448029301136595">[parent directory]</translation>
 <translation id="8879284080359814990">&amp;Ipakita Bilang Tab</translation>
 <translation id="8883847527783433352">I-sync sa Isa pang Account</translation>
+<translation id="8884570509232205463">Nagla-lock na ngayon ang iyong device sa ganap na <ph name="UNLOCK_TIME" />.</translation>
 <translation id="8885197664446363138">Hindi available ang Smart Lock</translation>
 <translation id="8888253246822647887">Bubukas ang iyong app kapag tapos na ang pag-upgrade. Maaaring tumagal nang ilang minuto ang mga pag-upgrade.</translation>
 <translation id="8888432776533519951">Kulay</translation>
@@ -5095,6 +5131,7 @@
 <translation id="9026852570893462412">Maaaring abutin nang ilang minuto ang prosesong ito. Dina-download ang virtual machine.</translation>
 <translation id="9027459031423301635">Buksan ang Link sa Bagong &amp;Tab</translation>
 <translation id="9030515284705930323">Hindi na-enable ng iyong organisasyon ang Google Play Store para sa iyong account. Makipag-ugnayan sa iyong administrator para sa higit pang impormasyon.</translation>
+<translation id="9030785788945687215">Gmail</translation>
 <translation id="9033857511263905942">I-&amp;paste</translation>
 <translation id="9037965129289936994">Ipakita Ang Orihinal</translation>
 <translation id="9038649477754266430">Gumamit ng serbisyo sa paghula upang ma-load ang mga page nang mas mabilis</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb
index f7f5564..cd1846e 100644
--- a/chrome/app/resources/generated_resources_fr.xtb
+++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -2077,7 +2077,6 @@
 <translation id="42126664696688958">Exporter</translation>
 <translation id="42137655013211669">L'accès à cette ressource est interdit sur ce serveur.</translation>
 <translation id="4215350869199060536">Petit problème… Le nom contient des symboles non autorisés.</translation>
-<translation id="4222932583846282852">Annulation…</translation>
 <translation id="4225397296022057997">Sur tous les sites</translation>
 <translation id="4235200303672858594">Plein écran</translation>
 <translation id="4235965441080806197">Annuler la connexion</translation>
@@ -3831,7 +3830,6 @@
 <translation id="7017480957358237747">autoriser ou interdire certains sites Web ;</translation>
 <translation id="7018275672629230621">Accéder à votre historique de navigation et le modifier</translation>
 <translation id="7019805045859631636">Rapide</translation>
-<translation id="702252130983202758">Vos applications</translation>
 <translation id="7022562585984256452">Votre page d'accueil a été définie.</translation>
 <translation id="7025190659207909717">Gestion des services Internet mobiles</translation>
 <translation id="7029809446516969842">Mots de passe</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb
index fb90d4cf..6031b8c3 100644
--- a/chrome/app/resources/generated_resources_gu.xtb
+++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -2073,7 +2073,6 @@
 <translation id="42126664696688958">નિકાસ કરો</translation>
 <translation id="42137655013211669">સર્વર દ્વારા આ સંસાધનની અ‍ૅક્સેસ નિષિદ્ધ હતી.</translation>
 <translation id="4215350869199060536">ઉફ્ફ, નામમાં ગેરકાનૂની પ્રતીકો!</translation>
-<translation id="4222932583846282852">રદ કરી રહ્યાં છીએ…</translation>
 <translation id="4225397296022057997">બધી સાઇટ પર</translation>
 <translation id="4235200303672858594">સમગ્ર સ્ક્રીન</translation>
 <translation id="4235965441080806197">સાઇન ઇન રદ કરો</translation>
@@ -3828,7 +3827,6 @@
 <translation id="7017480957358237747">અમુક વેબસાઇટ્સને મંજૂરી આપો અથવા પ્રતિબંધિત કરો,</translation>
 <translation id="7018275672629230621">તમારો બ્રાઉઝિંગ ઇતિહાસ વાંચો અને બદલો</translation>
 <translation id="7019805045859631636">ઝડપી</translation>
-<translation id="702252130983202758">તમારી ઍપ</translation>
 <translation id="7022562585984256452">તમારું હોમ પેજ સેટ કરવામાં આવ્યું છે.</translation>
 <translation id="7025190659207909717">મોબાઇલ ડેટા સેવા મેનેજમેન્ટ</translation>
 <translation id="7029809446516969842">પાસવર્ડ્સ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb
index af01d23..bb69477 100644
--- a/chrome/app/resources/generated_resources_hi.xtb
+++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -651,7 +651,7 @@
 <translation id="2007404777272201486">किसी समस्या की रिपोर्ट करें...</translation>
 <translation id="2016430552235416146">परंपरागत</translation>
 <translation id="2017334798163366053">'परफ़ॉर्मेंस डेटा' इकट्ठा करना बंद करें</translation>
-<translation id="2017836877785168846">इतिहास साफ़ करता है और पता बार में स्वत: पूर्णता को साफ़ करता है.</translation>
+<translation id="2017836877785168846">इतिहास साफ़ करता है और पता बार मेंअपने-आपपूर्णता को साफ़ करता है.</translation>
 <translation id="2018352199541442911">क्षमा करें, आपका बाह्य मेमोरी डिवाइस इस समय समर्थित नहीं है.</translation>
 <translation id="2019718679933488176">ऑडियो नए टैब में &amp;खोलें</translation>
 <translation id="2020183425253392403">नेटवर्क पता सेटिंग दिखाएं</translation>
@@ -1160,7 +1160,7 @@
 <translation id="2787354132612937472">—</translation>
 <translation id="2788135150614412178">+</translation>
 <translation id="2789486458103222910">ठीक है</translation>
-<translation id="2791952154587244007">एक गड़बड़ी हुई. किओस्क ऐप्लिकेशन इस डिवाइस पर स्वत: लॉन्च नहीं हो सकेंगे.</translation>
+<translation id="2791952154587244007">एक गड़बड़ी हुई. किओस्क ऐप्लिकेशन इस डिवाइस परअपने-आपलॉन्च नहीं हो सकेंगे.</translation>
 <translation id="2792290659606763004">क्या Android ऐप्लिकेशन निकालना है?</translation>
 <translation id="2796424461616874739">"<ph name="DEVICE_NAME" />" से कनेक्ट करते समय प्रमाणीकरण समयबाह्य हो गया.</translation>
 <translation id="2796740370559399562">कुकी को अनुमति देना जारी रखें</translation>
@@ -2076,7 +2076,6 @@
 <translation id="42126664696688958">निर्यात करें</translation>
 <translation id="42137655013211669">इस संसाधन के लिए सर्वर ने ऐक्सेस नहीं दिया था.</translation>
 <translation id="4215350869199060536">ओह, नाम में अवैध प्रतीक हैं!</translation>
-<translation id="4222932583846282852">रद्द किया जा रहा है...</translation>
 <translation id="4225397296022057997">सभी साइट पर</translation>
 <translation id="4235200303672858594">संपूर्ण स्क्रीन</translation>
 <translation id="4235965441080806197">साइन इन रद्द करें</translation>
@@ -2264,7 +2263,7 @@
 <translation id="4554591392113183336">बाहरी एक्‍सटेंशन मौजूदा की तुलना में समान या निम्नतर संस्‍करण पर है.</translation>
 <translation id="4555769855065597957">परछाई</translation>
 <translation id="4556110439722119938">आपके बुकमार्क, इतिहास, पासवर्ड और अन्य सेटिंग को आपके Google खाते में समन्वयित किया जाएगा ताकि आप उनका उपयोग अपने सभी डिवाइस पर कर सकें</translation>
-<translation id="4558426062282641716">स्वत: लॉन्च अनुमति का अनुरोध किया गया</translation>
+<translation id="4558426062282641716">अपने-आपलॉन्च अनुमति का अनुरोध किया गया</translation>
 <translation id="4558491878126948419"><ph name="DEVICE_TYPE" /> इस्तेमाल करने से जुड़ी सलाह और Google के उत्पादों से जुड़े अपडेट पाएं. साथ ही, अपने सुझाव शेयर करें. जब चाहें सूचनाएं पाना बंद करें.</translation>
 <translation id="4559617833001311418">यह साइट आपके डिवाइस के गति या रोशनी के सेंसर एक्सेस कर रही है.</translation>
 <translation id="4562155214028662640">फ़िंगरप्रिंट जोड़ें</translation>
@@ -2348,7 +2347,7 @@
 <translation id="4694604912444486114">बंदर</translation>
 <translation id="4697551882387947560">ब्राउज़िंग सत्र के खत्म होने पर</translation>
 <translation id="4699172675775169585">कैश इमेज और फ़ाइलें</translation>
-<translation id="4699357559218762027">(स्वत:-लॉन्च किया गया)</translation>
+<translation id="4699357559218762027">(अपने-आप-लॉन्च किया गया)</translation>
 <translation id="4707302005824653064">प्रबंधक (<ph name="CUSTODIAN_EMAIL" />) द्वारा chrome.com पर उपयोग और इतिहास की समीक्षा की जा सकती है.</translation>
 <translation id="4707579418881001319">L2TP/IPsec + उपयोगकर्ता प्रमाणपत्र</translation>
 <translation id="4707934200082538898">आगे के निर्देशों के लिए कृपया <ph name="BEGIN_BOLD" /><ph name="MANAGER_EMAIL" /><ph name="END_BOLD" /> पर अपना ईमेल देखें.</translation>
@@ -3468,12 +3467,12 @@
 <translation id="6438992844451964465"><ph name="WINDOW_TITLE" /> - ऑडियो चलाया जा रहा है</translation>
 <translation id="6442187272350399447">अद्भुत</translation>
 <translation id="6444070574980481588">तारीख और समय सेट करें</translation>
-<translation id="6445450263907939268">यदि आप इन बदलावों को नहीं चाहते हैं, तो आप अपनी पिछली सेटिंग को फिर से स्थापित कर सकते हैं.</translation>
+<translation id="6445450263907939268">अगर आप इन बदलावों को नहीं चाहते हैं, तो आप अपनी पिछली सेटिंग को फिर से स्थापित कर सकते हैं.</translation>
 <translation id="6447842834002726250">कुकी</translation>
 <translation id="6449285849137521213">"<ph name="EXTENSION_NAME" />" ऐप्स  जोड़ा गया.</translation>
 <translation id="6450876761651513209">अपनी निजता-संबंधी सेटिंग बदलें</translation>
 <translation id="6451180435462401570">'क्लाउड प्रिंट डिवाइस' प्रबंधित करें</translation>
-<translation id="6451689256222386810">यदि आप अपना 'पासफ़्रेज़' भूल गए हैं या यह सेटिंग बदलना चाहते हैं, तो <ph name="BEGIN_LINK" />सिंक रीसेट करें<ph name="END_LINK" />.</translation>
+<translation id="6451689256222386810">अगर आप अपना 'पासफ़्रेज़' भूल गए हैं या यह सेटिंग बदलना चाहते हैं, तो <ph name="BEGIN_LINK" />सिंक रीसेट करें<ph name="END_LINK" />.</translation>
 <translation id="6452181791372256707">अस्‍वीकार करें</translation>
 <translation id="6455264371803474013">कुछ खास साइटों पर</translation>
 <translation id="6455894534188563617">&amp;नया फ़ोल्डर</translation>
@@ -3741,7 +3740,7 @@
 <translation id="6892812721183419409">लिंक को <ph name="USER" /> के रूप में खोलें</translation>
 <translation id="6895032998810961280">नुकसान पहुंचाने वाले सॉफ़्टवेयर, सिस्टम की सेटिंग, और उन प्रक्रियाओं की पूरी रिपोर्ट Google को भेजें, जो हटाए जाने की इस प्रक्रिया में आपके कंप्यूटर पर मिली थीं</translation>
 <translation id="6896758677409633944">कॉपी बनाएं</translation>
-<translation id="6898440773573063262">किओस्क ऐप्लिकेशन अब इस डिवाइस पर स्वत: लॉन्च होने के लिए कॉन्फ़िगर किए जा सकते हैं.</translation>
+<translation id="6898440773573063262">किओस्क ऐप्लिकेशन अब इस डिवाइस परअपने-आपलॉन्च होने के लिए कॉन्फ़िगर किए जा सकते हैं.</translation>
 <translation id="6898699227549475383">संगठन (O)</translation>
 <translation id="6900284862687837908">बैकग्राउंड ऐप्लिकेशन: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6902066522699286937">वह आवाज़ जिसकी झलक सुननी है</translation>
@@ -3829,7 +3828,6 @@
 <translation id="7017480957358237747">कुछ वेबसाइटों को अनुमति दें या प्रतिबंधित करें,</translation>
 <translation id="7018275672629230621">अपना ब्राउज़र इतिहास पढ़ें और बदलें</translation>
 <translation id="7019805045859631636">तेज़</translation>
-<translation id="702252130983202758">आपके ऐप्लिकेशन</translation>
 <translation id="7022562585984256452">आपका होम पेज सेट कर दिया गया है.</translation>
 <translation id="7025190659207909717">मोबाइल डेटा सेवा प्रबंधन</translation>
 <translation id="7029809446516969842">पासवर्ड</translation>
@@ -3847,7 +3845,7 @@
 <translation id="7053983685419859001">ब्लॉक करें</translation>
 <translation id="7055152154916055070">रीडायरेक्ट ब्लॉक किया गया:</translation>
 <translation id="7056526158851679338">&amp;उपकरणों की जाँच करें</translation>
-<translation id="7059858479264779982">स्वत:-लॉन्च पर सेट करें</translation>
+<translation id="7059858479264779982">अपने-आप-लॉन्च पर सेट करें</translation>
 <translation id="7059893117020417984">निजी रूप से ब्राउज़ करने के लिए, 'डॉट आइकॉन मेन्यू' पर क्लिक करके 'गुप्त विंडो' खोलें</translation>
 <translation id="7062222374113411376">हाल ही में बंद की गई साइट को डेटा भेजने और प्राप्त करने की प्रकिया को पूरा करने की अनुमति दें (अनुशंसित)</translation>
 <translation id="7063129466199351735">शॉर्टकट प्रोसेस हो रहे हैं...</translation>
@@ -3897,7 +3895,7 @@
 <translation id="711840821796638741">प्रबंधित बुकमार्क दिखाएं</translation>
 <translation id="711902386174337313">अपने प्रवेश किए गए डिवाइस की सूची एक्‍सेस करें</translation>
 <translation id="7120865473764644444">सिंक सर्वर से कनेक्ट नहीं किया जा सका. पुनः प्रयास किया जा रहा है...</translation>
-<translation id="7121362699166175603">पता बार में स्वत: पूर्णता और इतिहास को हटाता है. आपके Google खाते में <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर अन्य प्रकार के ब्राउज़िंग इतिहास हो सकतेे हैं.</translation>
+<translation id="7121362699166175603">पता बार मेंअपने-आपपूर्णता और इतिहास को हटाता है. आपके Google खाते में <ph name="BEGIN_LINK" />myactivity.google.com<ph name="END_LINK" /> पर अन्य प्रकार के ब्राउज़िंग इतिहास हो सकतेे हैं.</translation>
 <translation id="7121389946694989825">इस्तेमाल और निदान से जुड़ा डेटा भेजें. यह डिवाइस फ़िलहाल Google को निदान, डिवाइस, और ऐप्लिकेशन के इस्तेमाल से जुड़ा डेटा अपने आप भेज रहा है. इसका इस्तेमाल आपके बच्चे की पहचान करने के लिए नहीं किया जाएगा. यह सिस्टम और ऐप्लिकेशन की स्थिरता और दूसरे सुधारों में मदद करेगा. कुछ एग्रीगेट डेटा Google ऐप्लिकेशन और पार्टनर, जैसे कि Android डेवलपरों की भी मदद करेगा. अगर आपके बच्चे के लिए दूसरी 'वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा उसके Google खाते में सेव किया जा सकता है. <ph name="BEGIN_LINK1" />ज़्यादा जानें<ph name="END_LINK1" /></translation>
 <translation id="7123360114020465152">अब काम नहीं करता है</translation>
 <translation id="7124929488592184705"><ph name="DOCUMENT_NAME" /> को प्रिंट करने में गड़बड़ी</translation>
@@ -4083,7 +4081,7 @@
 <translation id="7407430846095439694">आयात करें और आबद्ध करें</translation>
 <translation id="7409549334477097887">बहुत ज़्यादा</translation>
 <translation id="7409836189476010449">Flash चलाएं</translation>
-<translation id="7410344089573941623">यदि <ph name="HOST" /> आपके कैमरे और माइक्रोफ़ोन को एक्सेस करना चाहे, तो पूछें</translation>
+<translation id="7410344089573941623">अगर <ph name="HOST" /> आपके कैमरे और माइक्रोफ़ोन को एक्सेस करना चाहे, तो पूछें</translation>
 <translation id="741204030948306876">हां मैं सहमत हूं</translation>
 <translation id="7412226954991670867">GPU मेमोरी</translation>
 <translation id="7414464185801331860">18x</translation>
@@ -4177,7 +4175,7 @@
 <translation id="7566118625369982896">Play ऐप्लिकेशन के लिंक संभालें</translation>
 <translation id="756809126120519699">साफ़ किया गया Chrome डेटा</translation>
 <translation id="7568790562536448087">अपडेट कर रहा है</translation>
-<translation id="7571643774869182231">अपडेट करने के लिए पर्याप्त जगह नहीं है</translation>
+<translation id="7571643774869182231">अपडेट करने के लिए काफ़ी जगह नहीं है</translation>
 <translation id="7573172247376861652">बैटरी चार्ज</translation>
 <translation id="7574650250151586813">लिखने की सुविधा के लिए, तिलिस्म कीबोर्ड ऐप्लिकेशन को अपडेट करें</translation>
 <translation id="7576690715254076113">सेट में प्रिंट करें</translation>
@@ -5226,7 +5224,7 @@
 <translation id="9203398526606335860">&amp;प्रोफ़ाइलिंग सक्षम</translation>
 <translation id="9203904171912129171">डिवाइस चुनें</translation>
 <translation id="9203962528777363226">इस डिवाइस के व्यवस्थापक ने नए उपयोगकर्ता जोड़े जाना अक्षम कर दिया है</translation>
-<translation id="9214520840402538427">ओह!  इंस्टॉलेशन-समय विशेषताएं शुरू करने की समय सीमा समाप्त हो गई है. कृपया अपने सहायता प्रतिनिधि से संपर्क करें.</translation>
+<translation id="9214520840402538427">ओह!  इंस्टॉलेशन-समय विशेषताएं शुरू करने की समय सीमा खत्म हो गई है. कृपया अपने सहायता प्रतिनिधि से संपर्क करें.</translation>
 <translation id="9214695392875603905">कपकेक</translation>
 <translation id="9215293857209265904">"<ph name="EXTENSION_NAME" />" जोड़ा गया</translation>
 <translation id="9218430445555521422">डिफ़ॉल्ट के रूप में सेट करें</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb
index 1916375..0cc32f0 100644
--- a/chrome/app/resources/generated_resources_hr.xtb
+++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -2012,6 +2012,7 @@
 <translation id="409579654357498729">Dodaj na Cloud Print</translation>
 <translation id="4096508467498758490">Onemogućivanje proširenja u načinu rada razvojnog programera</translation>
 <translation id="4096824249111507322">Sigurni se modul priprema, pričekajte (to može potrajati nekoliko minuta)...</translation>
+<translation id="4097560579602855702">Pretražite Google</translation>
 <translation id="4099060993766194518">Želite li vratiti zadanu tražilicu?</translation>
 <translation id="4099874310852108874">Pojavila se mrežna pogreška.</translation>
 <translation id="4100733287846229632">Količina prostora na uređaju kritično je mala</translation>
@@ -2077,7 +2078,6 @@
 <translation id="42126664696688958">Izvezi</translation>
 <translation id="42137655013211669">Pristup tom resursu zabranio je poslužitelj.</translation>
 <translation id="4215350869199060536">Ups, nedopušteni simboli u imenu!</translation>
-<translation id="4222932583846282852">Otkazivanje...</translation>
 <translation id="4225397296022057997">Na svim web-lokacijama</translation>
 <translation id="4235200303672858594">Cijeli zaslon</translation>
 <translation id="4235965441080806197">Otkaži prijavu</translation>
@@ -3830,7 +3830,6 @@
 <translation id="7017480957358237747">dopustiti ili zabraniti određene web-lokacije</translation>
 <translation id="7018275672629230621">pročitati i promijeniti povijest pregledavanja</translation>
 <translation id="7019805045859631636">Brzo</translation>
-<translation id="702252130983202758">Vaše aplikacije</translation>
 <translation id="7022562585984256452">Vaša je početna stranica postavljena.</translation>
 <translation id="7025190659207909717">Upravljanje podatkovnom uslugom za mobilne uređaje</translation>
 <translation id="7029809446516969842">Zaporke</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb
index 784e72d..0fe4f269 100644
--- a/chrome/app/resources/generated_resources_hu.xtb
+++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -2077,7 +2077,6 @@
 <translation id="42126664696688958">Exportálás</translation>
 <translation id="42137655013211669">A szerver letiltotta a hozzáférést ehhez az erőforráshoz.</translation>
 <translation id="4215350869199060536">Hoppá! A név helytelen szimbólumokat tartalmaz.</translation>
-<translation id="4222932583846282852">Visszavonás…</translation>
 <translation id="4225397296022057997">Az összes webhelyen</translation>
 <translation id="4235200303672858594">Teljes képernyő</translation>
 <translation id="4235965441080806197">Bejelentkezés megszakítása</translation>
@@ -3832,7 +3831,6 @@
 <translation id="7017480957358237747">bizonyos webhelyek engedélyezése vagy tiltása,</translation>
 <translation id="7018275672629230621">Böngészési előzmények olvasása és módosítása</translation>
 <translation id="7019805045859631636">Gyors</translation>
-<translation id="702252130983202758">Saját alkalmazások</translation>
 <translation id="7022562585984256452">Beállítottuk kezdőoldalát.</translation>
 <translation id="7025190659207909717">Mobil adatátviteli szolgáltatás kezelése</translation>
 <translation id="7029809446516969842">Jelszavak</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb
index b56dc6bb..e18f31e4 100644
--- a/chrome/app/resources/generated_resources_id.xtb
+++ b/chrome/app/resources/generated_resources_id.xtb
@@ -2010,6 +2010,7 @@
 <translation id="409579654357498729">Tambahkan ke Cloud Print</translation>
 <translation id="4096508467498758490">Nonaktifkan ekstensi mode pengembang</translation>
 <translation id="4096824249111507322">Modul aman sedang disiapkan, harap tunggu (proses ini mungkin membutuhkan beberapa menit)...</translation>
+<translation id="4097560579602855702">Telusuri Google</translation>
 <translation id="4099060993766194518">Pulihkan mesin telusur default?</translation>
 <translation id="4099874310852108874">Terjadi error jaringan.</translation>
 <translation id="4100733287846229632">Ruang perangkat hampir habis</translation>
@@ -2075,7 +2076,6 @@
 <translation id="42126664696688958">Ekspor</translation>
 <translation id="42137655013211669">Akses ke sumber daya ini tidak diizinkan oleh server.</translation>
 <translation id="4215350869199060536">Ups! Ada simbol ilegal dalam nama.</translation>
-<translation id="4222932583846282852">Membatalkan...</translation>
 <translation id="4225397296022057997">Di semua situs</translation>
 <translation id="4235200303672858594">Seluruh layar</translation>
 <translation id="4235965441080806197">Batalkan proses masuk</translation>
@@ -3828,7 +3828,6 @@
 <translation id="7017480957358237747">mengizinkan atau melarang situs web tertentu,</translation>
 <translation id="7018275672629230621">Membaca dan mengubah histori penjelajahan Anda</translation>
 <translation id="7019805045859631636">Cepat</translation>
-<translation id="702252130983202758">Aplikasi Anda</translation>
 <translation id="7022562585984256452">Beranda Anda telah disetel.</translation>
 <translation id="7025190659207909717">Pengelolaan layanan data seluler</translation>
 <translation id="7029809446516969842">Sandi</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb
index dcd5f600..e652cd32 100644
--- a/chrome/app/resources/generated_resources_it.xtb
+++ b/chrome/app/resources/generated_resources_it.xtb
@@ -2073,7 +2073,6 @@
 <translation id="42126664696688958">Esporta</translation>
 <translation id="42137655013211669">L'accesso a questa risorsa è vietato dal server.</translation>
 <translation id="4215350869199060536">Spiacenti, simboli non validi nel nome.</translation>
-<translation id="4222932583846282852">Annullamento…</translation>
 <translation id="4225397296022057997">Su tutti i siti</translation>
 <translation id="4235200303672858594">Schermo intero</translation>
 <translation id="4235965441080806197">Annulla accesso</translation>
@@ -3826,7 +3825,6 @@
 <translation id="7017480957358237747">consentire o vietare siti web specifici,</translation>
 <translation id="7018275672629230621">Lettura e modifica della cronologia di navigazione</translation>
 <translation id="7019805045859631636">Veloce</translation>
-<translation id="702252130983202758">Le tue app</translation>
 <translation id="7022562585984256452">La tua pagina iniziale è stata impostata.</translation>
 <translation id="7025190659207909717">Gestione del servizio dati mobile</translation>
 <translation id="7029809446516969842">Password</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index 7fc188e..0c2f877 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -2009,6 +2009,7 @@
 <translation id="409579654357498729">‏הוסף ל-Google Cloud Print</translation>
 <translation id="4096508467498758490">השבתת תוספים של מצב מפתח</translation>
 <translation id="4096824249111507322">המערכת מכינה את המודול המאובטח (פעולה זו עשויה להימשך מספר דקות), אנא המתן...</translation>
+<translation id="4097560579602855702">‏חפש ב-Google</translation>
 <translation id="4099060993766194518">לשחזר את מנוע החיפוש שהוגדר כברירת המחדל?</translation>
 <translation id="4099874310852108874">התרחשה שגיאת רשת.</translation>
 <translation id="4100733287846229632">שטח האחסון במכשיר כמעט נגמר</translation>
@@ -2074,7 +2075,6 @@
 <translation id="42126664696688958">יצא</translation>
 <translation id="42137655013211669">הגישה למשאב זה נאסרה על-ידי השרת.</translation>
 <translation id="4215350869199060536">אופס, יש בשם סמלים לא חוקיים!</translation>
-<translation id="4222932583846282852">מבטל…</translation>
 <translation id="4225397296022057997">בכל האתרים</translation>
 <translation id="4235200303672858594">כל המסך</translation>
 <translation id="4235965441080806197">בטל כניסה</translation>
@@ -3827,7 +3827,6 @@
 <translation id="7017480957358237747">התר או חסום אתרים מסוימים,</translation>
 <translation id="7018275672629230621">לקרוא ולשנות את היסטוריית הגלישה שלך</translation>
 <translation id="7019805045859631636">מהיר</translation>
-<translation id="702252130983202758">האפליקציות שלך</translation>
 <translation id="7022562585984256452">דף הבית שלך הוגדר.</translation>
 <translation id="7025190659207909717">ניהול שירות של נתונים סלולריים</translation>
 <translation id="7029809446516969842">סיסמאות</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb
index 7b26aa6..545162c 100644
--- a/chrome/app/resources/generated_resources_ja.xtb
+++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -2077,7 +2077,6 @@
 <translation id="42126664696688958">エクスポート</translation>
 <translation id="42137655013211669">このリソースへのアクセスはサーバーにより禁止されています。</translation>
 <translation id="4215350869199060536">名前に間違った記号が含まれています。</translation>
-<translation id="4222932583846282852">キャンセルしています...</translation>
 <translation id="4225397296022057997">すべてのサイト</translation>
 <translation id="4235200303672858594">画面全体</translation>
 <translation id="4235965441080806197">ログインをキャンセル</translation>
@@ -3830,7 +3829,6 @@
 <translation id="7017480957358237747">特定のウェブサイトへのアクセスを許可または禁止する</translation>
 <translation id="7018275672629230621">閲覧履歴の読み取りと変更</translation>
 <translation id="7019805045859631636">速い</translation>
-<translation id="702252130983202758">マイアプリ</translation>
 <translation id="7022562585984256452">ホームページが設定されました。</translation>
 <translation id="7025190659207909717">モバイル データ サービスの管理</translation>
 <translation id="7029809446516969842">パスワード</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb
index 7d5248d..d8cca6f 100644
--- a/chrome/app/resources/generated_resources_kn.xtb
+++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -2077,7 +2077,6 @@
 <translation id="42126664696688958">ರಫ್ತು</translation>
 <translation id="42137655013211669">ಈ ಸಂಪನ್ಮೂಲಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಸರ್ವರ್‌ ಮೂಲಕ ನಿಷೇಧಿಸಲಾಗಿದೆ.</translation>
 <translation id="4215350869199060536">ಓಹ್, ಹೆಸರಿನಲ್ಲಿ ಅಕ್ರಮ ಸಂಕೇತಗಳಿವೆ!</translation>
-<translation id="4222932583846282852">ರದ್ದುಗೊಳಿಸಲಾಗುತ್ತಿದೆ...</translation>
 <translation id="4225397296022057997">ಎಲ್ಲಾ ಸೈಟ್‌ಗಳಲ್ಲಿ</translation>
 <translation id="4235200303672858594">ಸಂಪೂರ್ಣ ಪರದೆ</translation>
 <translation id="4235965441080806197">ಸೈನ್‌ ಇನ್ ಮಾಡುವುದನ್ನು ರದ್ದುಮಾಡಿ</translation>
@@ -3833,7 +3832,6 @@
 <translation id="7017480957358237747">ನಿರ್ದಿಷ್ಟ ವೆಬ್‌ಸೈಟ್‌ಗಳನ್ನು ಅನುಮತಿಸಿ ಅಥವಾ ನಿಷೇಧಿಸಿ,</translation>
 <translation id="7018275672629230621">ನಿಮ್ಮ ಬ್ರೌಸಿಂಗ್‌ ಇತಿಹಾಸವನ್ನು ಓದಿ ಮತ್ತು ಬದಲಾಯಿಸಿ</translation>
 <translation id="7019805045859631636">ವೇಗ</translation>
-<translation id="702252130983202758">ನಿಮ್ಮ ಆ್ಯಪ್‌ಗಳು</translation>
 <translation id="7022562585984256452">ನಿಮ್ಮ ಮುಖಪಟವನ್ನು ಹೊಂದಿಸಲಾಗಿದೆ.</translation>
 <translation id="7025190659207909717">ಮೊಬೈಲ್ ಡೇಟಾ ಸೇವೆಯ ನಿರ್ವಹಣೆ
 </translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb
index 98fff24..9f482e4 100644
--- a/chrome/app/resources/generated_resources_ko.xtb
+++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -2075,7 +2075,6 @@
 <translation id="42126664696688958">내보내기</translation>
 <translation id="42137655013211669">서버에서 이 리소스에 대한 액세스를 금지했습니다.</translation>
 <translation id="4215350869199060536">이름에 사용할 수 없는 기호가 포함되어 있습니다.</translation>
-<translation id="4222932583846282852">취소 중...</translation>
 <translation id="4225397296022057997">모든 사이트에서</translation>
 <translation id="4235200303672858594">전체 화면</translation>
 <translation id="4235965441080806197">로그인 취소</translation>
@@ -3828,7 +3827,6 @@
 <translation id="7017480957358237747">특정 웹사이트 허용 또는 금지</translation>
 <translation id="7018275672629230621">인터넷 사용기록 조회 및 변경</translation>
 <translation id="7019805045859631636">빠르게</translation>
-<translation id="702252130983202758">내 앱</translation>
 <translation id="7022562585984256452">홈페이지가 설정되었습니다.</translation>
 <translation id="7025190659207909717">모바일 데이터 서비스 관리</translation>
 <translation id="7029809446516969842">비밀번호</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb
index f3ffdf52..4a34ef3 100644
--- a/chrome/app/resources/generated_resources_lt.xtb
+++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -2077,7 +2077,6 @@
 <translation id="42126664696688958">Eksportuoti</translation>
 <translation id="42137655013211669">Prieigą prie šio ištekliaus uždraudė serveris.</translation>
 <translation id="4215350869199060536">Oi, pavadinime yra netinkamų simbolių.</translation>
-<translation id="4222932583846282852">Atšaukiama...</translation>
 <translation id="4225397296022057997">Visose svetainėse</translation>
 <translation id="4235200303672858594">Visas ekranas</translation>
 <translation id="4235965441080806197">Atšaukti prisijungimą</translation>
@@ -3831,7 +3830,6 @@
 <translation id="7017480957358237747">leisti arba drausti konkrečias svetaines</translation>
 <translation id="7018275672629230621">Skaityti ir keisti naršymo istoriją</translation>
 <translation id="7019805045859631636">Greitas</translation>
-<translation id="702252130983202758">Jūsų programos</translation>
 <translation id="7022562585984256452">Pagrindinis puslapis nustatytas.</translation>
 <translation id="7025190659207909717">Duomenų mobiliesiems paslaugos valdymas</translation>
 <translation id="7029809446516969842">Slaptažodžiai</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb
index 4490a66..381b3a3 100644
--- a/chrome/app/resources/generated_resources_lv.xtb
+++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -2077,7 +2077,6 @@
 <translation id="42126664696688958">Eksportēt</translation>
 <translation id="42137655013211669">Serveris neatļāva piekļūt šim resursam.</translation>
 <translation id="4215350869199060536">Diemžēl nosaukumā ir ietverti neatļauti simboli.</translation>
-<translation id="4222932583846282852">Notiek atcelšana...</translation>
 <translation id="4225397296022057997">Visās vietnēs</translation>
 <translation id="4235200303672858594">Viss ekrāns</translation>
 <translation id="4235965441080806197">Atcelt pierakstīšanos</translation>
@@ -3830,7 +3829,6 @@
 <translation id="7017480957358237747">ļaut vai aizliegt noteiktas vietnes;</translation>
 <translation id="7018275672629230621">Lasīt un mainīt jūsu pārlūkošanas vēsturi</translation>
 <translation id="7019805045859631636">Ātrs</translation>
-<translation id="702252130983202758">Jūsu lietotnes</translation>
 <translation id="7022562585984256452">Jūsu sākumlapa ir iestatīta.</translation>
 <translation id="7025190659207909717">Mobilo datu pakalpojumu pārvaldība</translation>
 <translation id="7029809446516969842">Paroles</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb
index 3a842199..5a7bcb79 100644
--- a/chrome/app/resources/generated_resources_ml.xtb
+++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -8,6 +8,7 @@
 <translation id="1007408791287232274">ഉപകരണങ്ങൾ ലോഡുചെയ്യാനായില്ല.</translation>
 <translation id="1008186147501209563">ബുക്ക്‌മാർക്കുകൾ എക്‌സ്‌പോർട്ട് ചെയ്യുക</translation>
 <translation id="1008557486741366299">ഇപ്പോഴല്ല</translation>
+<translation id="1010498023906173788">ഈ ടാബ് ഒരു സീരിയൽ പോർട്ടുമായി കണക്റ്റ് ചെയ്‌തിരിക്കുന്നു.</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{പേജ് പ്രതികരിക്കുന്നില്ല}other{പേജുകൾ പ്രതികരിക്കുന്നില്ല}}</translation>
 <translation id="1012794136286421601">നിങ്ങളുടെ ഡോക്‌സ്, ഷീറ്റുകൾ, സ്ലൈഡുകൾ, ഡ്രോയിംഗ് ഫയലുകൾ എന്നിവ സമന്വയിപ്പിക്കുന്നു. അവ ഓൺലൈനിലോ ഓഫ്‌ലൈനിലോ ആക്‌സസ് ചെയ്യുന്നതിന് Google ഡ്രൈവ് ആപ്പ് തുറക്കുക.</translation>
 <translation id="1012876632442809908">USB-C ഉപകരണം (മുൻവശത്തെ പോർട്ട്)</translation>
@@ -30,6 +31,7 @@
 <translation id="1036982837258183574">പൂർണ്ണ സ്‌ക്രീനിൽ നിന്ന് പുറത്തുകടക്കാൻ |<ph name="ACCELERATOR" />| അമർത്തുക</translation>
 <translation id="1038168778161626396">എന്‍‌സിഫര്‍‌ മാത്രം</translation>
 <translation id="1039337018183941703">ഫയൽ അസാധുവോ കേടായതോ ആണ്</translation>
+<translation id="1041175011127912238">ഈ പേജ് പ്രതികരിക്കുന്നില്ല</translation>
 <translation id="1042174272890264476">നിങ്ങളുടെ കമ്പ്യൂട്ടറിൽ <ph name="SHORT_PRODUCT_NAME" /> എന്നതിന്റെ RLZ ലൈബ്രറി അന്തർനിർമ്മിതവുമാണ്. RLZ, ഒരു നിർദ്ദിഷ്‌ട പ്രമോഷണൽ കാമ്പെയ്‌നിലൂടെ ലഭിക്കുന്ന തിരയലുകളും <ph name="SHORT_PRODUCT_NAME" /> ഉപയോഗവും കണക്കാക്കുന്നതിന് അദ്വിതീയമല്ലാത്തതും വ്യക്തിപരമായി തിരിച്ചറിയാനാകാത്തതുമായ ഒരു ടാഗ് നിയുക്തമാക്കുന്നു. ഈ ലേബലുകൾ ചിലസമയത്ത് <ph name="PRODUCT_NAME" /> എന്നതിലെ Google തിരയലിൽ ദൃശ്യമാകുന്നു.</translation>
 <translation id="1046059554679513793">കഷ്ടം, ഈ നാമം ഇതിനകം തന്നെ ഉപയോഗത്തിലുണ്ട്!</translation>
 <translation id="1046635659603195359">മറ്റൊരു ഉപകരണത്തിൽ മുമ്പേ നിങ്ങൾ Google അസിസ്റ്റന്‍റിനൊപ്പം Voice Match സജ്ജമാക്കിയിട്ടുള്ളതായി തോന്നുന്നു. ഈ ഉപകരണത്തിൽ ഒരു ശബ്‌ദ മോഡൽ സൃഷ്ടിക്കുന്നതിന് പഴയ റെക്കോർഡിംഗുകൾ ഉപയോഗപ്പെടുത്താം. ഇതിന് ഒരു മിനിറ്റിൽ കുറവ് സമയമേ എടുക്കൂ.</translation>
@@ -148,6 +150,7 @@
 <translation id="1211364473545090084">അദൃശ്യ വിൻഡോ ഉപയോഗിച്ച്, നിങ്ങളുടെ ബ്രൗസിംഗ് ചരിത്രം സംരക്ഷിക്കാതെ, വെബ് ഉപയോഗിക്കുക</translation>
 <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> വിരലടയാളങ്ങൾ സജ്ജമാക്കി</translation>
 <translation id="1215411991991485844">പുതിയ പശ്ചാത്തല ആപ്പ് ചേർത്തു</translation>
+<translation id="1217483152325416304">നിങ്ങളുടെ ലോക്കൽ ഡാറ്റ ഉടൻ ഇല്ലാതാക്കപ്പെടും</translation>
 <translation id="1217668622537098248">പ്രവൃത്തിക്ക് ശേഷം ഇടത് ക്ലിക്ക് പുനഃസ്ഥാപിക്കുക</translation>
 <translation id="121783623783282548">പാസ്‌വേഡുകൾ പൊരുത്തപ്പെടുന്നില്ല.</translation>
 <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />ഈ ഉപകരണം ഏത് ലൊക്കേഷനിലാണെന്ന് അറിയാൻ, Google-ന്‍റെ ലൊക്കേഷൻ സേവനം വൈഫൈയും മൊബൈൽ നെറ്റ്‌വർക്കുകളും സെൻസറുകളും പോലുള്ള ഉറവിടങ്ങൾ ഉപയോഗിക്കുന്നു.<ph name="END_PARAGRAPH1" />
@@ -308,6 +311,7 @@
 <translation id="1478340334823509079">വിശദാംശങ്ങൾ: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">ഇൻസ്റ്റലേഷൻ പ്രവർത്തനക്ഷമമാക്കിയിട്ടില്ല</translation>
 <translation id="1483493594462132177">അയയ്‌ക്കുക</translation>
+<translation id="1484979925941077974">സൈറ്റ് Bluetooth ഉപയോഗിക്കുന്നു</translation>
 <translation id="1485015260175968628">ഇതിന് ഇപ്പോൾ ആക്‌സസ്സുചെയ്യാൻ കഴിയുന്നത്:</translation>
 <translation id="1485141095922496924"><ph name="PRODUCT_VERSION" /> പതിപ്പ് (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation>
 <translation id="1486096554574027028">പാസ്‌വേഡുകള്‍ തിരയുക</translation>
@@ -454,6 +458,7 @@
 <translation id="1708338024780164500">(നിഷ്‌ക്രിയം)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ഐഡി: <ph name="ID_PH" />)</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (പ്രാദേശികം)</translation>
+<translation id="1711401317189798723">നിലവിൽ <ph name="CONTAINER_ID" /> എന്നതിനായുള്ള ബാക്കപ്പ് പുരോഗമിക്കുന്നു</translation>
 <translation id="1712349894969001173">നിങ്ങളുടെ iPhone-ൽ ഈ പാസ്‌വേഡ് ലഭ്യമാക്കുക</translation>
 <translation id="1712552549805331520">നിങ്ങളുടെ ലോക്കൽ കമ്പ്യൂട്ടറില്‍ ശാശ്വതമായി ഡാറ്റ സംഭരിക്കാന്‍ <ph name="URL" /> ആഗ്രഹിക്കുന്നു</translation>
 <translation id="1718835860248848330">കഴിഞ്ഞ മണിക്കൂര്‍‌</translation>
@@ -603,6 +608,7 @@
 <translation id="1932026958134051332">ആക്‌സസ് ഓപ്‌ഷനുകൾ മാറുക</translation>
 <translation id="1932098463447129402">മുമ്പല്ല</translation>
 <translation id="1933809209549026293">ഒരു മൗസോ കീബോർഡോ കണക്റ്റുചെയ്യുക. നിങ്ങൾ ഒരു Bluetooth ഉപകരണം ഉപയോഗിക്കുന്നുവെങ്കിൽ, അത് ജോടിയാക്കാൻ തയ്യാറാണെന്ന് ഉറപ്പുവരുത്തുക.</translation>
+<translation id="1937774647013465102"><ph name="ARCHITECTURE_DEVICE" /> ആയ ഈ ഉപകരണം ഉപയോഗിച്ച് കണ്ടെയ്‌നർ ആർക്കി‌ടെക്‌ചർ തരമായ <ph name="ARCHITECTURE_CONTAINER" /> ഇമ്പോർട്ട് ചെയ്യാനാവില്ല. നിങ്ങൾക്ക് ഈ കണ്ടെയ്‌നർ മറ്റൊരു ഉപരണത്തിലേക്ക് പുനഃസ്ഥാപിക്കാൻ ശ്രമിക്കാം അല്ലെങ്കിൽ ഫയലുകൾ ആപ്പ് തുറന്ന് ഈ കണ്ടെയ്‌നർ ചിത്രത്തിനുള്ളിലെ ഫയലുകൾ ആക്‌സസ് ചെയ്യാം.</translation>
 <translation id="1938351510777341717">എക്‌സ്‌റ്റേണൽ കമാൻഡ്</translation>
 <translation id="1940546824932169984">കണക്‌റ്റുചെയ്ത ഉപകരണം</translation>
 <translation id="1944921356641260203">അപ്‌ഡേറ്റ് കണ്ടെത്തി</translation>
@@ -887,9 +893,11 @@
 <translation id="2392369802118427583">സജീവമാക്കുക</translation>
 <translation id="2394566832561516196">അടുത്ത തവണ വീണ്ടുംലോഡുചെയ്യുമ്പോൾ ക്രമീകരണങ്ങള്‍ മായ്‌ക്കപ്പെടും.</translation>
 <translation id="2395616325548404795">എന്റർപ്രൈസ് മാനേജ്‌മെന്റിന് വേണ്ടി നിങ്ങളുടെ <ph name="DEVICE_TYPE" /> എൻറോൾ ചെയ്‌തെങ്കിലും അതിന്റെ അസറ്റും ലൊക്കേഷൻ വിവരങ്ങളും അയയ്‌ക്കാനായില്ല. ഈ ഉപകരണത്തിനുവേണ്ടി നിങ്ങളുടെ Admin console-ൽ നിന്ന് ഈ വിവരങ്ങൾ നേരിട്ട് നൽകുക.</translation>
+<translation id="2396783860772170191">4 അക്ക പിൻ നൽകുക (0000-9999)</translation>
 <translation id="2408955596600435184">നിങ്ങളുടെ പിൻ നൽകുക</translation>
 <translation id="241082044617551207">അജ്ഞാത പ്ലഗ് ഇൻ</translation>
 <translation id="2413749388954403953">ബുക്ക്മാർക്കുകളുടെ ഉപയോക്തൃ ഇന്റർഫേസ് മാറ്റുക</translation>
+<translation id="241639282915300771">നിലവിൽ <ph name="CONTAINER_ID" /> എന്നതിന്റെ പുനഃസ്ഥാപിക്കൽ പുരോഗമിക്കുന്നു</translation>
 <translation id="241727068219398187"><ph name="TIME" /> മുതലുള്ള ഡാറ്റ നിങ്ങളുടെ Google പാസ്‌വേഡ് ഉപയോഗിച്ച് എൻക്രി‌പ്‌റ്റ് ചെയ്‌തു.
           ഇതിൽ Google Pay-ൽ നിന്നുള്ള പേയ്മെന്‍റ് രീതികളും വിലാസങ്ങളും അടങ്ങുന്നില്ല.</translation>
 <translation id="2419706071571366386">സുരക്ഷയ്ക്കായി, നിങ്ങളുടെ കമ്പ്യൂട്ടർ ഉപയോഗിക്കാത്തപ്പോൾ സൈൻ ഔട്ട് ചെയ്യുക.</translation>
@@ -982,6 +990,7 @@
 <translation id="2538361623464451692">സമന്വയം പ്രവർത്തനരഹിതമാക്കി</translation>
 <translation id="2540449034743108469">വിപുലീകരണ ആക്‌റ്റിവിറ്റികൾ കേൾക്കാൻ "ആരംഭിക്കുക" അമർത്തുക</translation>
 <translation id="2541002089857695151">പൂർണ്ണസ്‌ക്രീൻ കാസ്‌റ്റ് ചെയ്യൽ ഓപ്റ്റിമൈസ് ചെയ്യണോ?</translation>
+<translation id="2541706104884128042">പുതിയ ഉറക്ക സമയം സജ്ജീകരിച്ചു</translation>
 <translation id="2544853746127077729">നെറ്റ്‌വർക്ക്, പ്രാമാണീകരണ സർട്ടിഫിക്കറ്റ് നിരസിച്ചു</translation>
 <translation id="2549985041256363841">റെക്കോർഡിംഗ് ആരംഭിക്കൂ</translation>
 <translation id="2550212893339833758">സ്വാപ്പുചെയ്‌ത മെമ്മറി</translation>
@@ -1073,6 +1082,7 @@
 <translation id="2677748264148917807">ഉപേക്ഷിക്കുക</translation>
 <translation id="2678063897982469759">പുനഃപ്രാപ്‌തമാക്കുക</translation>
 <translation id="268053382412112343">ച&amp;രിത്രം</translation>
+<translation id="2682498795777673382">രക്ഷിതാവിൽ നിന്നുള്ള അപ്‌ഡേറ്റ്</translation>
 <translation id="2683638487103917598">ഫോൾഡർ അടുക്കി</translation>
 <translation id="2684004000387153598">തുടരാൻ, ശരി ക്ലിക്ക് ചെയ്യുക, തുടർന്ന് നിങ്ങളുടെ ഇമെയിൽ വിലാസത്തിനൊരു പുതിയ പ്രൊഫൈൽ സൃഷ്ടിക്കാൻ, 'ഒരു വ്യക്തിയെ ചേർക്കുക' ക്ലിക്ക് ചെയ്യുക.</translation>
 <translation id="2688196195245426394">ഉപകരണം സെർവറിൽ രജിസ്റ്റർ ചെയ്യുന്നതിൽ പിശക്: <ph name="CLIENT_ERROR" />.</translation>
@@ -1106,6 +1116,7 @@
 <translation id="2731392572903530958">അടച്ച വിന്‍ഡോ വീ&amp;ണ്ടും തുറക്കുക</translation>
 <translation id="2731700343119398978">കാത്തിരിക്കുക...</translation>
 <translation id="2731710757838467317">നിങ്ങളുടെ സൂപ്പർവൈസ് ചെയ്‌ത ഉപയോക്താവിനെ സൃഷ്‌ടിക്കുന്നു. ഇതിന് കുറച്ചുസമയമെടുക്കാം.</translation>
+<translation id="2731971182069536520">അടുത്ത തവണ നിങ്ങളുടെ ഉപകരണം റീസ്‌റ്റാർട്ട് ചെയ്യുമ്പോൾ, നിങ്ങളുടെ ലോക്കൽ ഡാറ്റ ഇല്ലാതാക്കുന്ന ഒരു ഒറ്റത്തവണ അപ്ഡേറ്റ് അഡ്‌മിൻ നിർവ്വഹിക്കും.</translation>
 <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> എന്നതിന് കീഴിലുള്ള സൈറ്റുകളും പുനഃസജ്ജീകരിക്കപ്പെടും.</translation>
 <translation id="2735438478659026460">മൗസ് കഴ്‌സർ നിലയ്‌ക്കുമ്പോള്‍ സ്വമേധയാ ക്ലിക്ക് ചെയ്യുക</translation>
 <translation id="2735712963799620190">ഷെഡ്യൂള്‍‌</translation>
@@ -1309,6 +1320,7 @@
 <translation id="304747341537320566">സ്പീച്ച് എഞ്ചിനുകൾ</translation>
 <translation id="3047644958362961983">നിങ്ങളുടെ അസിസ്‌റ്റൻ്റിൻ്റെ പ്രശ്‌നങ്ങളെക്കുറിച്ച് കൂടുതൽ മനസ്സിലാക്കാൻ ഈ വിവരങ്ങൾ ഞങ്ങളെ സഹായിക്കുന്നു. ഇത് 90 ദിവസം വരെ സംഭരിക്കുന്നു, കൂടാതെ ഇതിലേക്കുള്ള ആക്‌സസ് അർഹതയുള്ള എഞ്ചിനീയറിംഗ്, ഫീഡ്‌ബാക്ക് ടീമുകൾക്കായി പരിമിതപ്പെടുത്തിയിരിക്കുന്നു.</translation>
 <translation id="3053013834507634016">സര്‍‌ട്ടിഫിക്കറ്റ് കീ ഉപയോഗം</translation>
+<translation id="3053273573829329829">ഉപയോക്തൃ പിൻ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="3058498974290601450">നിങ്ങൾക്ക് ഏത് സമയത്തും ക്രമീകരണത്തിൽ സമന്വയം ഓണാക്കാവുന്നതാണ്</translation>
 <translation id="3060379269883947824">'വായിച്ചുകേൾക്കാൻ തിരഞ്ഞെടുക്കുക' പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="3061707000357573562">പാച്ച് സേവനം</translation>
@@ -1328,6 +1340,7 @@
 <translation id="3084771660770137092">ഒന്നുകില്‍ Chrome മെമ്മറിയില്ലാതെ പ്രവര്‍ത്തിക്കുന്നു അല്ലെങ്കില്‍ മറ്റ് ചില കാരണങ്ങളാല്‍ വെബ്പേജിനായുള്ള പ്രോസസ്സ് അവസാനിപ്പിച്ചു.  തുടരുന്നതിന്, വീണ്ടും ലോഡുചെയ്യുക അല്ലെങ്കില്‍ മറ്റൊരു പേജിലേക്ക് പോകുക.</translation>
 <translation id="3085412380278336437">സൈറ്റിന് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാനാകും</translation>
 <translation id="3085752524577180175">SOCKS ഹോസ്റ്റ്</translation>
+<translation id="3088052000289932193">സൈറ്റ് MIDI ഉപയോഗിക്കുന്നു</translation>
 <translation id="3088325635286126843">&amp;പേരുമാറ്റുക...</translation>
 <translation id="3089137131053189723">തിരയൽ മായ്ച്ചു</translation>
 <translation id="3090193911106258841">ഓഡിയോ, വീഡിയോ ഇൻപുട്ട് ആക്‌സസ്സുചെയ്യുന്നു</translation>
@@ -1467,6 +1480,7 @@
 <translation id="3317459757438853210">രണ്ട്-വശങ്ങളുള്ള</translation>
 <translation id="3317678681329786349">ക്യാമറയും മൈക്രോഫോണും ബ്ലോക്ക് ചെയ്‌‌തു</translation>
 <translation id="3319048459796106952">പുതിയ &amp;അദൃശ്യ വിന്‍ഡോ</translation>
+<translation id="3323521181261657960">ബോണസ്! നിങ്ങൾക്ക് കൂടുതൽ സ്‌ക്രീൻ സമയം ലഭിച്ചിരിക്കുന്നു</translation>
 <translation id="3325910708063135066">Mac സിസ്‌റ്റം മുൻഗണനകളിൽ ക്യാമറയും മൈക്രോഫോണും ഓഫാക്കി</translation>
 <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation>
 <translation id="3331974543021145906">ആപ്പ് വിവരം</translation>
@@ -1762,6 +1776,7 @@
 <translation id="3765246971671567135">ഓഫ്‌ലൈൻ ഡെമോ മോഡ് നയം വായിക്കാനായില്ല.</translation>
 <translation id="3766223500670287046">റിമോട്ട് സ്ക്രീൻ</translation>
 <translation id="3768037234834996183">നിങ്ങളുടെ മുൻഗണനകൾ സമന്വയിപ്പിക്കുന്നു...</translation>
+<translation id="377050016711188788">ഐസ്‌ക്രീം</translation>
 <translation id="3771294271822695279">വീഡിയോ ഫയലുകള്‍</translation>
 <translation id="3775432569830822555">SSL സെര്‍വര്‍ സര്‍‌ട്ടിഫിക്കറ്റ്</translation>
 <translation id="3775705724665058594">നിങ്ങളുടെ ഉപകരണങ്ങളിലേക്ക് അയയ്‌ക്കുക</translation>
@@ -1840,6 +1855,7 @@
 <translation id="3869917919960562512">തെറ്റായ സൂചിക.</translation>
 <translation id="3870931306085184145"><ph name="DOMAIN" /> ഡൊമെയ്‌നിന് സംരക്ഷിച്ച പാസ്‌വേഡുകൾ ഇല്ല</translation>
 <translation id="3871092408932389764">ഏറ്റവും കുറഞ്ഞത്</translation>
+<translation id="3871350334636688135">24 മണിക്കൂറിന് ശേഷം, നിങ്ങളുടെ ഉപകരണം റീസ്‌റ്റാർട്ട് ചെയ്യുമ്പോൾ ലോക്കൽ ഡാറ്റ ഇല്ലാതാക്കുന്ന ഒരു ഒറ്റത്തവണ അപ്‌ഡേറ്റ് നിങ്ങളുടെ അഡ്‌മിൻ നിർവ്വഹിക്കും. നിങ്ങൾക്ക് cloud storage ചെയ്യേണ്ട എല്ലാ ലോക്കൽ ഡാറ്റയും 24 മണിക്കൂറിനുള്ളിൽ സംരക്ഷിക്കുക.</translation>
 <translation id="3872220884670338524"><ph name="DOMAIN" /> ഡൊമെയ്‌നിലെ <ph name="USERNAME" /> എന്ന ഉപയോക്താവിന്‍റെ സംരക്ഷിച്ച അക്കൗണ്ടിനായി കൂടുതൽ പ്രവർത്തനങ്ങൾ</translation>
 <translation id="3872991219937722530">ഡിസ്‌ക് ഇടം സൃഷ്‌ടിച്ചില്ലെങ്കിൽ ഉപകരണം പ്രതികരിക്കില്ല.</translation>
 <translation id="3873315167136380065">ഇത് ഓണാക്കാൻ, നിങ്ങളുടെ സമന്വയിപ്പിച്ച പാസ്‌ഫ്രെയ്‌സ് നീക്കം ചെയ്യാൻ <ph name="BEGIN_LINK" />സമന്വയം പുനഃസജ്ജമാക്കുക<ph name="END_LINK" /></translation>
@@ -1918,6 +1934,7 @@
 <translation id="3983400541576569538">ചില ആപ്പുകളിൽ നിന്നുള്ള ഡാറ്റ നഷ്‌ടപ്പെട്ടേക്കാം</translation>
 <translation id="3983586614702900908">അജ്ഞാത വെണ്ടറിൽ നിന്നുള്ള ഉപകരണങ്ങൾ</translation>
 <translation id="3984159763196946143">ഡെമോ മോഡ് ആരംഭിക്കാനായില്ല</translation>
+<translation id="3984431586879874039">നിങ്ങളുടെ സുരക്ഷാ കീ കാണാൻ ഈ സൈറ്റിനെ അനുവദിക്കണോ?</translation>
 <translation id="3987348946546879621">ഡാറ്റ ലാഭിച്ചു</translation>
 <translation id="3987938432087324095">ക്ഷമിക്കണം, അത് മനസ്സിലായില്ല.</translation>
 <translation id="3988996860813292272">സമയ മേഖല തിരഞ്ഞെടുക്കുക</translation>
@@ -1994,6 +2011,7 @@
 <translation id="4099060993766194518">ഡിഫോൾട്ട് തിരയൽ എഞ്ചിൻ പുനഃസ്ഥാപിക്കണോ?</translation>
 <translation id="4099874310852108874">നെറ്റ്‌വർക്ക് പിശക് സംഭവിച്ചു.</translation>
 <translation id="4100733287846229632">ഉപകരണത്തിൽ ഇടം വളരെ കുറവാണ്</translation>
+<translation id="4100853287411968461">പുതിയ സ്‌ക്രീൻ സമയ പരിധി</translation>
 <translation id="4103091233824664032">സ്‌ക്രീൻ ലോക്കും സൈൻ-ഇന്നും കോൺഫിഗർ ചെയ്യാൻ നിങ്ങളുടെ പാസ്‌വേഡ് നൽകുക</translation>
 <translation id="4104163789986725820">കയ&amp;റ്റുമതി ചെയ്യുക...</translation>
 <translation id="4107048419833779140">സ്‌റ്റോറേജ് ​​ഉപകരണം തിരിച്ചറിഞ്ഞ് ഒഴിവാക്കുക</translation>
@@ -2055,7 +2073,6 @@
 <translation id="42126664696688958">എക്‌സ്‌പോർട്ടുചെയ്യുക</translation>
 <translation id="42137655013211669">ഈ ഉറവിടത്തിലേക്കുള്ള ആക്‌സസ് സെർവർ തടഞ്ഞു.</translation>
 <translation id="4215350869199060536">ക്ഷമിക്കണം, പേരിൽ നിയമവിരുദ്ധ ചിഹ്നങ്ങളുണ്ട്!</translation>
-<translation id="4222932583846282852">റദ്ദാക്കുന്നു...</translation>
 <translation id="4225397296022057997">എല്ലാ സൈറ്റുകളിലും</translation>
 <translation id="4235200303672858594">പൂർണ്ണ സ്‌ക്രീൻ</translation>
 <translation id="4235965441080806197">സൈൻ ഇൻ റദ്ദാക്കുക</translation>
@@ -2113,6 +2130,7 @@
 <translation id="4324577459193912240">ഫയൽ ‌പൂർണ്ണമല്ല</translation>
 <translation id="4325237902968425115"><ph name="LINUX_APP_NAME" /> അണ്‍‌ ഇന്‍സ്‌റ്റാള്‍ ചെയ്യുന്നു...</translation>
 <translation id="4328203388435897516">നിങ്ങളുടെ Chromebook സജ്ജീകരിക്കുമ്പോൾ, ഏതുസമയത്തും സഹായം ലഭിക്കാൻ, അസിസ്‌റ്റന്‍റ് ബട്ടൺ അമർത്തുകയോ "Ok Google" എന്ന് പറയുകയോ ചെയ്യുക. മാറ്റങ്ങൾ വരുത്താൻ അസിസ്‌റ്റന്‍റ് ക്രമീകരണത്തിലേക്ക് പോവുക.</translation>
+<translation id="4330191372652740264">ഐസ്‌വാട്ടർ</translation>
 <translation id="4330387663455830245"><ph name="LANGUAGE" /> ഒരിക്കലും വിവര്‍‌ത്തനം ചെയ്യരുത്</translation>
 <translation id="4333854382783149454">RSA എന്‍‌ക്രിപ്‌ഷനോടുകൂടിയ PKCS #1 SHA-1</translation>
 <translation id="4336979451636460645">നെറ്റ്‌വർക്ക് ലോഗുകൾക്കായി ഇത് കാണുക: <ph name="DEVICE_LOG_LINK" /></translation>
@@ -2148,6 +2166,7 @@
 <translation id="438503109373656455">സാരറ്റോഗ</translation>
 <translation id="4387004326333427325">പ്രാമാണീകരണ സർട്ടിഫിക്കറ്റ് വിദൂരമായി നിരസിച്ചു</translation>
 <translation id="4389091756366370506">ഉപയോക്താവ്<ph name="VALUE" /></translation>
+<translation id="4390000551125140321">{0,plural, =1{അദൃശ്യ മോഡ്}other{# അദൃശ്യ വിൻഡോകൾ തുറക്കുക}}</translation>
 <translation id="439266289085815679">Bluetooth കോൺഫിഗറേഷൻ നിയന്ത്രിക്കുന്നത് <ph name="USER_EMAIL" /> ആണ്.</translation>
 <translation id="4394049700291259645">അപ്രാപ്‌തമാക്കുക</translation>
 <translation id="4400367121200150367">ഇവിടെ ദൃശ്യമാകുന്ന സൈറ്റുകള്‍ ഒരിക്കലും പാസ്‌വേഡുകള്‍ സംരക്ഷിക്കില്ല</translation>
@@ -2296,6 +2315,7 @@
 <translation id="4648499713050786492">ഒരാളെ ചേർക്കുന്നതിന് മുമ്പ് നിങ്ങളുടെ പ്രൊഫൈൽ അൺലോക്കുചെയ്യുക.</translation>
 <translation id="4651484272688821107">ഡെമോ മോഡ് ഉറവിടങ്ങൾ ഉപയോഗിച്ച് ഓൺലൈൻ ഘടകം ലോഡ് ചെയ്യാനായില്ല.</translation>
 <translation id="465878909996028221">http, https എന്നിവയും ഫയൽ പ്രോട്ടോകോളുകളും മാത്രമേ ബ്രൗസർ റീഡയറക്റ്റുകളിൽ പിന്തുണയ്ക്കൂ.</translation>
+<translation id="4659077111144409915">പ്രാഥമിക അക്കൗണ്ട്</translation>
 <translation id="4660476621274971848">പ്രതീക്ഷിച്ച പതിപ്പ് "<ph name="EXPECTED_VERSION" />" ആണ്, എന്നാൽ ലഭിച്ച പതിപ്പ് "<ph name="NEW_ID" />" ആയിരുന്നു</translation>
 <translation id="4662788913887017617">നിങ്ങളുടെ iPhone ഉപയോഗിച്ച് ഈ ബുക്ക്‌മാർക്ക് പങ്കിടുക</translation>
 <translation id="4663373278480897665">ക്യാമറ അനുവദനീയം</translation>
@@ -2341,6 +2361,7 @@
 <translation id="4724450788351008910">അഫിലിയേഷന്‍‌ മാറ്റി</translation>
 <translation id="4725511304875193254">പട്ടിക്കുട്ടി</translation>
 <translation id="4726710629007580002">ഈ വിപുലീകരണം ഇൻസ്റ്റാൾ ചെയ്യാൻ ശ്രമിക്കുമ്പോൾ മുന്നറിയിപ്പുകൾ ഉണ്ടായിരുന്നു:</translation>
+<translation id="4727847987444062305">മാനേജ് ചെയ്യപ്പെടുന്ന അതിഥി സെഷൻ</translation>
 <translation id="4728558894243024398">പ്ലാറ്റ്ഫോം</translation>
 <translation id="4733082559415072992">നിങ്ങളുടെ ഉപകരണത്തിന്‍റെ ലൊക്കേഷൻ ഉപയോഗിക്കാൻ  <ph name="URL" /> ആഗ്രഹിക്കുന്നു</translation>
 <translation id="4733793249294335256">ലൊക്കേഷൻ</translation>
@@ -2450,6 +2471,7 @@
 <translation id="488785315393301722">വിശദാംശങ്ങൾ‌ കാണിക്കുക</translation>
 <translation id="4890773143211625964">വിപുലമായ പ്രിന്റർ ഓപ്‌ഷനുകൾ കാണിക്കുക</translation>
 <translation id="4891089016822695758">ബീറ്റ ഫോറം</translation>
+<translation id="4892229439761351791">സൈറ്റിന് Bluetooth ഉപയോഗിക്കാനാവും</translation>
 <translation id="4893336867552636863">ഇത് ഈ ഉപകരണത്തിൽ നിന്നും നിങ്ങളുടെ ബ്രൗസിംഗ് ഡാറ്റയെ ശാശ്വതമായി ഇല്ലാതാക്കും.</translation>
 <translation id="4893522937062257019">ലോക്ക് സ്ക്രീനിൽ</translation>
 <translation id="4898011734382862273">"<ph name="CERTIFICATE_NAME" />" സർട്ടിഫിക്കറ്റ് ഒരു സർട്ടിഫിക്കേഷൻ അതോറിറ്റിയെ പ്രതിനിധീകരിക്കുന്നു</translation>
@@ -2625,6 +2647,8 @@
 <translation id="5187295959347858724">നിങ്ങൾ ഇപ്പോൾ <ph name="SHORT_PRODUCT_NAME" />-ൽ പ്രവേശിച്ചു. നിങ്ങളുടെ ബുക്ക്മാർക്കുകൾ, ചരിത്രം, മറ്റ് ക്രമീകരണം എന്നിവയെല്ലാം നിങ്ങളുടെ Google അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കുന്നു.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" />, ഒന്നിലധികം ഫയലുകൾ ഡൗൺലോഡ് ചെയ്യാൻ താൽപ്പര്യപ്പെടുന്നു</translation>
+<translation id="5192316339598592690">അക്കൗണ്ടുകൾ എളുപ്പത്തിൽ മാറുക, ആപ്പുകളിലേക്കും വെബ്‌സൈറ്റുകളിലേക്കും പെട്ടന്ന് സൈൻ ചെയ്യുക.
+    നിങ്ങളുടെ Google അക്കൗണ്ട് വിവരങ്ങളിൽ ചിലത് ഉപയോഗിക്കാനുള്ള അനുമതി ചോദിക്കാൻ ആപ്പുകൾക്കും സൈറ്റുകൾക്കും കഴിയും. <ph name="LINK_BEGIN" />കൂടുതലറിയുക<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">ഉപകരണം Powerwash ചെയ്‌ത ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation>
 <translation id="5204967432542742771">പാസ്‌വേഡ് നല്‍കുക</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />" ഇല്ലാതാക്കണോ?</translation>
@@ -3512,6 +3536,7 @@
 <translation id="6547354035488017500">512 MB ഇടമെങ്കിലും സൃഷ്‌ടിച്ചില്ലെങ്കിൽ നിങ്ങളുടെ ഉപകരണം പ്രതികരിക്കില്ല. ഇടം സൃഷ്‌ടിക്കാൻ, ഉപകരണ സ്‌റ്റോറേജിൽ നിന്ന് ഫയലുകൾ ഇല്ലാതാക്കുക.</translation>
 <translation id="6550675742724504774">ഓപ്ഷനുകൾ</translation>
 <translation id="6551508934388063976">കമാൻഡ് ലഭ്യമല്ല. പുതിയ വിൻഡോ തുറക്കാൻ control-N അമർത്തുക.</translation>
+<translation id="6551612971599078809">സൈറ്റ് USB ഉപയോഗിക്കുന്നു</translation>
 <translation id="655384502888039633"><ph name="USER_COUNT" /> ഉപയോക്താക്കള്‍</translation>
 <translation id="655483977608336153">വീണ്ടും ശ്രമിക്കുക</translation>
 <translation id="6555432686520421228">എല്ലാ ഉപയോക്തൃ അക്കൗണ്ടുകളും നീക്കം ചെയ്‌ത് നിങ്ങളുടെ <ph name="IDS_SHORT_PRODUCT_NAME" /> ഉപകരണം പുതിയതുപോലെ പുനഃസജ്ജമാക്കുക.</translation>
@@ -3735,6 +3760,7 @@
 <translation id="692114467174262153"><ph name="ALTERNATIVE_BROWSER_NAME" /> തുറക്കാനായില്ല</translation>
 <translation id="6921709132208495314">ഈ പേജിൽ ഡാറ്റ ഉപയോഗിക്കുന്നത് നിർത്തുക</translation>
 <translation id="6922128026973287222">Google ഡാറ്റ സേവർ ഉപയോഗിച്ച് വിവരം സംരക്ഷിച്ച് വേഗത്തിൽ ബ്രൗസുചെയ്യുക. കൂടുതലറിയാൻ ക്ലിക്കുചെയ്യുക.</translation>
+<translation id="6922745772873733498">അച്ചടിക്കാൻ ഒരു പിൻ നൽകുക</translation>
 <translation id="6923132443355966645">സ്ക്രോൾ ചെയ്യുക / ക്ലിക്ക് ചെയ്യുക</translation>
 <translation id="6923633482430812883">പങ്കിടൽ മൗണ്ട് ചെയ്യുന്നതിൽ പിശക്. നിങ്ങൾ കണക്‌റ്റ് ചെയ്യുന്ന ഫയൽ സെർവർ SMBv2 അല്ലെങ്കിൽ അതിന് ശേഷമുള്ളത് പിന്തുണയ്‌ക്കുന്നു എന്ന് പരിശോധിക്കുക.</translation>
 <translation id="6930036377490597025">ബാഹ്യ സുരക്ഷാ കീ അല്ലെങ്കിൽ അന്തർനിർ‌മ്മിത സെൻസർ</translation>
@@ -3789,6 +3815,7 @@
 <translation id="7003339318920871147">വെബ് ഡാറ്റാബേസുകള്‍‌</translation>
 <translation id="7003723821785740825">നിങ്ങളുടെ ഉപകരണം അൺലോക്ക് ചെയ്യാൻ ഒരു വേഗതയേറിയ മാർഗ്ഗം സജ്ജമാക്കുക</translation>
 <translation id="7003844668372540529"><ph name="VENDOR_NAME" /> എന്നതിൽ നിന്നുള്ള അജ്ഞാത ഉൽപ്പന്നം <ph name="PRODUCT_ID" /></translation>
+<translation id="7004402701596653846">സൈറ്റിന് MIDI ഉപയോഗിക്കാനാകും</translation>
 <translation id="7004499039102548441">സമീപകാല ടാബുകൾ</translation>
 <translation id="7005848115657603926">അസാധുവായ പേജ് റേഞ്ച്, <ph name="EXAMPLE_PAGE_RANGE" /> എന്നത് ഉപയോഗിക്കുക</translation>
 <translation id="7006634003215061422">ചുവടെയുള്ള മാർജിൻ</translation>
@@ -3804,6 +3831,7 @@
 <translation id="7022562585984256452">നിങ്ങളുടെ ഹോം പേജ് സജ്ജമാക്കി.</translation>
 <translation id="7025190659207909717">മൊബൈല്‍ ഡാറ്റ സേവന മാനേജുമെന്‍റ്</translation>
 <translation id="7029809446516969842">പാസ്‌വേഡുകള്‍</translation>
+<translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - സീരിയൽ പോർട്ട് കണക്റ്റ് ചെയ്‌തിരിക്കുന്നു</translation>
 <translation id="7031962166228839643">TPM തയ്യാറാക്കുന്നു, ദയവായി കാത്തിരിക്കുക (ഇതിന് കുറച്ച് മിനിറ്റെടുത്തേക്കാം)...</translation>
 <translation id="7037509989619051237">പ്രിവ്യൂ ചെയ്യുന്നതിനുള്ള ടെക്‌സ്റ്റ്</translation>
 <translation id="7039326228527141150"><ph name="VENDOR_NAME" /> എന്നതിൽ നിന്നും USB ഉപകരണങ്ങൾ ആക്‌സസ് ചെയ്യുക</translation>
@@ -3828,6 +3856,7 @@
 <translation id="706626672220389329">പങ്കിടൽ മൗണ്ട് ചെയ്യുന്നതിൽ പിശക്. നിർദ്ദിഷ്‌ട പങ്കിടൽ മുമ്പേ മൗണ്ട് ചെയ്‌തിട്ടുണ്ട്.</translation>
 <translation id="7066944511817949584">"<ph name="DEVICE_NAME" />" എന്നതിലേക്ക് കണക്റ്റുചെയ്യുന്നതിൽ പരാജയപ്പെട്ടു.</translation>
 <translation id="7067725467529581407">ഇത് വീണ്ടും കണിക്കരുത്.</translation>
+<translation id="7069811530847688087"><ph name="WEBSITE" />-ന് പുതിയതോ വ്യത്യസ്‌ത തരത്തിലുള്ളതോ ആയ സുരക്ഷാ കീ ആവശ്യമായേക്കാം</translation>
 <translation id="7070484045139057854">ഇതിന് സൈറ്റ് ഡാറ്റ വായിക്കാനും മാറ്റാനുമാവും</translation>
 <translation id="7072010813301522126">കുറുക്കുവഴിയുടെ പേര്</translation>
 <translation id="707392107419594760">നിങ്ങളുടെ കീബോര്‍ഡ് തിരഞ്ഞെടുക്കുക :</translation>
@@ -3908,6 +3937,7 @@
 <translation id="7189234443051076392">നിങ്ങളുടെ ഉപകരണത്തിൽ ആവശ്യമായ ഇടം ഉണ്ടെന്ന് ഉറപ്പാക്കുക</translation>
 <translation id="7189965711416741966">ഫിംഗർപ്രിന്റ് ചേർത്തു.</translation>
 <translation id="7191159667348037">അജ്ഞാത പ്രിന്‍റർ (USB)</translation>
+<translation id="7193051357671784796">നിങ്ങളുടെ സ്ഥാപനമാണ് ഈ ആപ്പ് ചേർത്തത്. ആപ്പ് ഇൻസ്‌റ്റാൾ ചെയ്യുന്നത് പൂർത്തിയാക്കാൻ ഇത് റീസ്‌റ്റാർട്ട് ചെയ്യുക.</translation>
 <translation id="7193374945610105795"><ph name="ORIGIN" />-നായി പാസ്‌വേഡുകളൊന്നും സംരക്ഷിച്ചിട്ടില്ല</translation>
 <translation id="7196913789568937443">Google ഡ്രൈവിലേക്ക് ബാക്കപ്പ് ചെയ്യുക. എളുപ്പത്തിൽ നിങ്ങളുടെ ഡാറ്റ പുന:സ്ഥാപിക്കുകയോ ഏതുസമയത്തും ഉപകരണം മാറുകയോ ചെയ്യുക. ബാക്കപ്പിൽ ആപ്പ് ഡാറ്റയും ഉൾപ്പെടുന്നു. നിങ്ങളുടെ ബാക്കപ്പുകൾ Google-ലേക്ക് അപ്‌ലോഡ് ചെയ്‌ത്, Google അക്കൗണ്ട് പാസ്‌വേഡ് ഉപയോഗിച്ച് എൻക്രിപ്റ്റ് ചെയ്യും. <ph name="BEGIN_LINK1" />കൂടുതലറിയുക<ph name="END_LINK1" /></translation>
 <translation id="7197190419934240522">നിങ്ങൾ ബ്രൗസ് ചെയ്യുന്ന എല്ലാ സമയത്തും Google തിരയൽ, Google സ്‌മാർട്‌സ് എന്നിവ നേടുക</translation>
@@ -4330,6 +4360,7 @@
     <ph name="BR" />
     <ph name="BEGIN_BOLD" />കുറിപ്പ്:<ph name="END_BOLD" />  പ്രോസസ്സ് വേളയിൽ സിസ്റ്റം റീബൂട്ട് ചെയ്യും.</translation>
 <translation id="7829298379596169484">ഓഡിയോ ഇൻപുട്ട് ആക്‌സസ്സുചെയ്യുന്നു</translation>
+<translation id="7830594666202422257">Linux-ലേക്ക് കണക്‌റ്റ് ചെയ്യുക</translation>
 <translation id="7831491651892296503">നെറ്റ്‍വര്‍ക്ക് കോണ്‍ഫിഗര്‍ ചെയ്യുന്നതിൽ പിശക്</translation>
 <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation>
 <translation id="7832084384634357321">അവസാനിക്കുന്ന സമയം</translation>
@@ -4359,6 +4390,7 @@
 <translation id="7877451762676714207">അജ്ഞാതമായ സെർവർ പിശക്. വീണ്ടും ശ്രമിക്കുകയോ സെർവർ അഡ്‌മിനിസ്‌ട്രേറ്ററെ ബന്ധപ്പെടുകയോ ചെയ്യുക.</translation>
 <translation id="7877680364634660272">ടൂർ</translation>
 <translation id="7878562273885520351">നിങ്ങളുടെ പാസ്‍വേഡ് അപഹരിക്കപ്പെട്ടേക്കാം</translation>
+<translation id="7880823633812189969">നിങ്ങൾ റീസ്‌റ്റാർട്ട് ചെയ്യുമ്പോൾ ലോക്കൽ ഡാറ്റ ഇല്ലാതാക്കപ്പെടും</translation>
 <translation id="7881483672146086348">അക്കൗണ്ട് കാണുക</translation>
 <translation id="7882358943899516840">പ്രൊവൈഡര്‍ തരം:</translation>
 <translation id="7885253890047913815">സമീപകാല ലക്ഷ്യസ്ഥാനങ്ങൾ</translation>
@@ -4698,6 +4730,7 @@
 <translation id="8426713856918551002">പ്രവർത്തനസജ്ജമാക്കുന്നു</translation>
 <translation id="8427292751741042100">എല്ലാ ഹോസ്‌റ്റിലും ഉൾപ്പെടുത്തി</translation>
 <translation id="8428213095426709021">ക്രമീകരണങ്ങള്‍</translation>
+<translation id="8428628598981198790">നിങ്ങളുടെ സുരക്ഷാ കീ ഈ സൈറ്റിൽ ഉപയോഗിക്കാനാവില്ല</translation>
 <translation id="84297032718407999"><ph name="LOGOUT_TIME_LEFT" />-നുള്ളിൽ നിങ്ങൾ സൈൻ ഔട്ട് ചെയ്യപ്പെടും</translation>
 <translation id="8431190899827883166">ഷോ ടാപ്‌സ്</translation>
 <translation id="8431909052837336408">സിം പിൻ മാറ്റുക</translation>
@@ -4902,6 +4935,7 @@
 <translation id="8732212173949624846">നിങ്ങളുടെ സൈൻ ഇൻ ചെയ്ത എല്ലാ ഉപകരണങ്ങളിലെയും ബ്രൗസിംഗ് ചരിത്രം റീഡുചെയ്യുക, മാറ്റുക</translation>
 <translation id="8732844209475700754">സ്വകാര്യത, സുരക്ഷ, ഡാറ്റാ ശേഖരണം എന്നിവയുമായി ബന്ധപ്പെട്ട കൂടുതൽ ക്രമീകരണം</translation>
 <translation id="8734073480934656039">ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുന്നത് സ്റ്റാർട്ടപ്പിൽ കിയോ‌ക് അപ്ലിക്കേഷനുകൾ സ്വയമേവ സമാരംഭിക്കുന്നതിന് അനുവദിക്കുന്നു.</translation>
+<translation id="8734671092194994316">നിങ്ങൾ <ph name="WEBSITE" /> എന്ന വെബ്‌സൈറ്റ് സന്ദർശിച്ചതിന്റെ റെക്കോർഡ് ഇത് സുരക്ഷാ കീയിൽ സൂക്ഷിക്കും.</translation>
 <translation id="873545264931343897"><ph name="PLUGIN_NAME" /> അപ്‌ഡേറ്റ് ചെയ്‌തുകഴിയുമ്പോൾ, അത് സജീവമാക്കുന്നതിന് പേജ് റീലോഡുചെയ്യുക</translation>
 <translation id="8736288397686080465">ഈ സൈറ്റ് പശ്‌ചാത്തലത്തിൽ അപ്‌ഡേറ്റുചെയ്‌തു.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" /> എന്നതിന് പകരം <ph name="PROTOCOL" /> ലിങ്കുകൾ തുറക്കുക</translation>
@@ -4999,6 +5033,7 @@
 <translation id="8877448029301136595">[രക്ഷാകര്‍തൃ ഡയറക്ടറി]</translation>
 <translation id="8879284080359814990">&amp;ടാബായി കാണിക്കുക</translation>
 <translation id="8883847527783433352">മറ്റൊരു അക്കൗണ്ടിലേക്ക് സമന്വയിപ്പിക്കുക</translation>
+<translation id="8884570509232205463">നിങ്ങളുടെ ഉപകരണം ഇപ്പോൾ <ph name="UNLOCK_TIME" />-ന് ലോക്ക് ആകുന്നു.</translation>
 <translation id="8885197664446363138">Smart Lock ലഭ്യമല്ല</translation>
 <translation id="8888253246822647887">അപ്‌ഗ്രേഡ് ചെയ്യൽ പൂർത്തിയാകുമ്പോൾ ആപ്പ് തുറക്കും. അപ്‌ഗ്രേഡ് ചെയ്യുന്നതിന് കുറച്ചുസമയമെടുത്തേക്കാം.</translation>
 <translation id="8888432776533519951">വർണ്ണം:</translation>
@@ -5091,6 +5126,7 @@
 <translation id="9026852570893462412">ഈ പ്രക്രിയയ്ക്ക് കുറച്ച് സമയമെടുത്തേക്കാം. വെർച്വൽ മെഷീൻ ഡൗൺലോഡ് ചെയ്യുന്നു.</translation>
 <translation id="9027459031423301635">ലിങ്ക് പുതിയ &amp;ടാബില്‍ തുറക്കുക</translation>
 <translation id="9030515284705930323">നിങ്ങളുടെ അക്കൗണ്ടിന് വേണ്ടി ഓർഗനൈസേഷൻ, Google Play സ്റ്റോർ പ്രവർത്തനക്ഷമമാക്കിയിട്ടില്ല. കൂടുതൽ വിവരങ്ങൾക്ക്, അഡ്‌മിനിസ്‌ട്രേറ്ററെ ബന്ധപ്പെടുക.</translation>
+<translation id="9030785788945687215">Gmail</translation>
 <translation id="9033857511263905942">&amp;ഒട്ടിക്കുക</translation>
 <translation id="9037965129289936994">യഥാര്‍ത്ഥമായത് കാണിക്കുക</translation>
 <translation id="9038649477754266430">പേജുകൾ കൂടുതൽ വേഗത്തിൽ ലോഡുചെയ്യാൻ ഒരു പ്രവചന സേവനം ഉപയോഗിക്കുക</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb
index 6b638324..07b7ab7 100644
--- a/chrome/app/resources/generated_resources_mr.xtb
+++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -150,7 +150,7 @@
 <translation id="1211364473545090084">गुप्त विंडोसह तुमचा ब्राउझ करण्याचा इतिहास सेव्ह न करता वेब वापरा</translation>
 <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> फिंगरप्रिंट सेट केले</translation>
 <translation id="1215411991991485844">नवीन पार्श्वभूमी ॲप्लिकेशन जोडला</translation>
-<translation id="1217483152325416304">आपला स्थानिक डेटा लवकरच हटवला जाईल</translation>
+<translation id="1217483152325416304">तुमचा स्थानिक डेटा लवकरच हटवला जाईल</translation>
 <translation id="1217668622537098248">क्रिया केल्यानंतर डाव्या क्लिकवर परत जा</translation>
 <translation id="121783623783282548">पासवर्ड जुळत नाहीत.</translation>
 <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />या डिव्हाइसच्या स्थानाचा अंदाज लावण्यात मदत करण्यासाठी, Google ची स्थान सेवा वाय-फाय, मोबाइल नेटवर्क आणि सेंसरसारख्या स्रोतांचा वापर करते.<ph name="END_PARAGRAPH1" />
@@ -1118,7 +1118,7 @@
 <translation id="2731392572903530958">बंद केलेली विंडो पु&amp;न्हा उघडा</translation>
 <translation id="2731700343119398978">कृपया प्रतीक्षा करा...</translation>
 <translation id="2731710757838467317">तुमचा पर्यवेक्षी वापरकर्ता तयार करत आहे. यास काही क्षण लागू शकतात.</translation>
-<translation id="2731971182069536520">पुढील वेळी तुम्ही तुमचे डिव्हाइस रीस्टार्ट कराल तेव्हा तुमचा अ‍ॅडमिनिस्ट्रेटर एक-वेळ अपडेट करेल जो तुमचा स्थानिक डेटा हटवेल.</translation>
+<translation id="2731971182069536520">पुढील वेळी तुम्ही तुमचे डिव्हाइस रीस्टार्ट कराल तेव्हा तुमचा अ‍ॅडमिनिस्ट्रेटर एक वेळ अपडेट करेल जो तुमचा स्थानिक डेटा हटवेल.</translation>
 <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" /> अंतर्गत साइट देखील रीसेट केल्या जातील.</translation>
 <translation id="2735438478659026460">माउसचा कर्सर थांबल्यावर आपोआप क्लिक करा</translation>
 <translation id="2735712963799620190">शेड्यूल</translation>
@@ -1858,7 +1858,7 @@
 <translation id="3869917919960562512">चुकीची अनुक्रमणिका</translation>
 <translation id="3870931306085184145"><ph name="DOMAIN" /> साठी सेव्ह केलेले पासवर्ड नाहीत</translation>
 <translation id="3871092408932389764">सर्वात कमी</translation>
-<translation id="3871350334636688135">२४ तासानंतर, तुमचा अ‍ॅडमिनिस्ट्रेटर एक-वेळ अपडेट करेल जो तुम्ही तुमचे डिव्हाइस रीस्टार्ट कराल तेव्हा तुमचा स्थानिक डेटा हटवेल. तुम्हाला क्लाउड स्टोरेजसाठी आवश्यक असलेला कोणताही स्थानिक डेटा २४ तासांच्या आत सेव्ह करा.</translation>
+<translation id="3871350334636688135">२४ तासानंतर, तुमचा अ‍ॅडमिनिस्ट्रेटर एक वेळ अपडेट करेल जो तुम्ही तुमचे डिव्हाइस रीस्टार्ट कराल तेव्हा तुमचा स्थानिक डेटा हटवेल. तुम्हाला क्लाउड स्टोरेजसाठी आवश्यक असलेला कोणताही स्थानिक डेटा २४ तासांच्या आत सेव्ह करा.</translation>
 <translation id="3872220884670338524">आणखी कृती, <ph name="USERNAME" /> साठीचे खाते <ph name="DOMAIN" /> वर सेव्ह केले</translation>
 <translation id="3872991219937722530">डिस्क स्थान मोकळे करा अन्यथा डिव्हाइस अप्रतिसादात्मक बनेल.</translation>
 <translation id="3873315167136380065">हे सुरू करण्यासाठी, तुमची सिंक पासफ्रेझ काढून टाकण्यासाठी <ph name="BEGIN_LINK" />सिंक रीसेट करा<ph name="END_LINK" /></translation>
@@ -2076,7 +2076,6 @@
 <translation id="42126664696688958">एक्सपोर्ट</translation>
 <translation id="42137655013211669">सर्व्हरद्वारे या स्त्रोतामधील प्रवेश निषिद्ध केला होता.</translation>
 <translation id="4215350869199060536">अरेरे, नावात बेकायदेशीर चिन्हे आहेत!</translation>
-<translation id="4222932583846282852">रद्द करत आहे...</translation>
 <translation id="4225397296022057997">सर्व साइटवर</translation>
 <translation id="4235200303672858594">संपूर्ण स्क्रीन</translation>
 <translation id="4235965441080806197">साइन इन रद्द करा</translation>
@@ -3830,7 +3829,6 @@
 <translation id="7017480957358237747">विशिष्ट वेबसाइटला अनुमती द्या किंवा प्रतिबंध करा,</translation>
 <translation id="7018275672629230621">तुमचा ब्राउझिंग इतिहास वाचा आणि बदला</translation>
 <translation id="7019805045859631636">जलद</translation>
-<translation id="702252130983202758">तुमची अ‍ॅप्‍स</translation>
 <translation id="7022562585984256452">तुमचे मुख्यपृष्‍ठ सेट केले गेले आहे.</translation>
 <translation id="7025190659207909717">मोबाइल डेटा सेवा व्यवस्थापन</translation>
 <translation id="7029809446516969842">पासवर्ड</translation>
@@ -3940,7 +3938,7 @@
 <translation id="7189234443051076392">तुमच्या डिव्हाइसवर पुरेशी जागा असल्याची खात्री करा</translation>
 <translation id="7189965711416741966">फिंगरप्रिंट जोडले.</translation>
 <translation id="7191159667348037">अज्ञात मुद्रक (USB)</translation>
-<translation id="7193051357671784796">हे अॅप तुमच्या संस्थेमध्ये जोडले गेले आहे. इंस्टॉल करणे पुर्ण करण्यासाठी अॅप रीस्टार्ट करा.</translation>
+<translation id="7193051357671784796">हे अॅप तुमच्या संस्थेमध्ये जोडले गेले आहे. इंस्टॉल करणे पूर्ण करण्यासाठी अॅप रीस्टार्ट करा.</translation>
 <translation id="7193374945610105795"><ph name="ORIGIN" /> चे कोणतेही पासवर्ड सेव्ह केलेले नाहीत</translation>
 <translation id="7196913789568937443">Google ड्राइव्ह मध्ये बॅकअप घ्या. तुमचा डेटा कधीही सहजपणे रिस्टोअर करा किंवा डिव्हाइस बदला. तुमच्या बॅकअपमध्ये ॲप डेटाचा समावेश असतो. तुमचे बॅकअप Google वर अपलोड केले आहेत आणि ते तुमचा Google खाते पासवर्ड वापरून एंक्रिप्ट केले आहेत. <ph name="BEGIN_LINK1" />अधिक जाणून घ्या<ph name="END_LINK1" /></translation>
 <translation id="7197190419934240522">प्रत्येक वेळी ब्राउझ करताना Google शोध आणि Google स्मार्ट मिळवा</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb
index f5d32eb..86bb99b 100644
--- a/chrome/app/resources/generated_resources_ms.xtb
+++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -2013,6 +2013,7 @@
 <translation id="409579654357498729">Tambahkan pada Cetakan Awan</translation>
 <translation id="4096508467498758490">Lumpuhkan sambungan mod pembangun</translation>
 <translation id="4096824249111507322">Modul selamat sedang disediakan, sila tunggu (proses ini mungkin mengambil masa beberapa minit)...</translation>
+<translation id="4097560579602855702">Cari di Google</translation>
 <translation id="4099060993766194518">Pulihkan enjin carian lalai?</translation>
 <translation id="4099874310852108874">Ralat rangkaian telah berlaku.</translation>
 <translation id="4100733287846229632">Ruang peranti terlalu rendah</translation>
@@ -2078,7 +2079,6 @@
 <translation id="42126664696688958">Eksport</translation>
 <translation id="42137655013211669">Akses kepada sumber ini dilarang oleh pelayan.</translation>
 <translation id="4215350869199060536">Alamak, simbol tidak sah terdapat dalam nama!</translation>
-<translation id="4222932583846282852">Membatalkan…</translation>
 <translation id="4225397296022057997">Di semua tapak</translation>
 <translation id="4235200303672858594">Keseluruhan skrin</translation>
 <translation id="4235965441080806197">Batalkan log masuk</translation>
@@ -3831,7 +3831,6 @@
 <translation id="7017480957358237747">benarkan atau larang tapak web tertentu,</translation>
 <translation id="7018275672629230621">Baca dan ubah sejarah penyemakan imbas anda</translation>
 <translation id="7019805045859631636">Cepat</translation>
-<translation id="702252130983202758">Apl anda</translation>
 <translation id="7022562585984256452">Halaman utama anda telah ditetapkan.</translation>
 <translation id="7025190659207909717">Pengurusan perkhidmatan data mudah alih</translation>
 <translation id="7029809446516969842">Kata laluan</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb
index ff9bf82..a5e05a3 100644
--- a/chrome/app/resources/generated_resources_nl.xtb
+++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -2012,6 +2012,7 @@
 <translation id="409579654357498729">Toevoegen aan Cloudprinter</translation>
 <translation id="4096508467498758490">Extensies van ontwikkelaarsmodus uitschakelen</translation>
 <translation id="4096824249111507322">Beveiligde module wordt voorbereid, even geduld (dit kan enkele minuten duren)...</translation>
+<translation id="4097560579602855702">Zoeken op Google</translation>
 <translation id="4099060993766194518">Standaardzoekmachine herstellen?</translation>
 <translation id="4099874310852108874">Er is een netwerkfout opgetreden.</translation>
 <translation id="4100733287846229632">Er is zeer weinig ruimte beschikbaar op het apparaat</translation>
@@ -2077,7 +2078,6 @@
 <translation id="42126664696688958">Exporteren</translation>
 <translation id="42137655013211669">De toegang tot deze bron is verboden door de server.</translation>
 <translation id="4215350869199060536">Er staan niet-toegestane gegevens in de naam.</translation>
-<translation id="4222932583846282852">Annuleren…</translation>
 <translation id="4225397296022057997">Op alle sites</translation>
 <translation id="4235200303672858594">Volledig scherm</translation>
 <translation id="4235965441080806197">Inloggen annuleren</translation>
@@ -3830,7 +3830,6 @@
 <translation id="7017480957358237747">bepaalde websites toestaan of verbieden,</translation>
 <translation id="7018275672629230621">Je browsegeschiedenis lezen en wijzigen</translation>
 <translation id="7019805045859631636">Snel</translation>
-<translation id="702252130983202758">Je apps</translation>
 <translation id="7022562585984256452">Je homepage is ingesteld.</translation>
 <translation id="7025190659207909717">Beheer van mobiele netwerken</translation>
 <translation id="7029809446516969842">Wachtwoorden</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb
index 1dd3688..9661362 100644
--- a/chrome/app/resources/generated_resources_no.xtb
+++ b/chrome/app/resources/generated_resources_no.xtb
@@ -8,6 +8,7 @@
 <translation id="1007408791287232274">Kunne ikke laste inn enhetene.</translation>
 <translation id="1008186147501209563">Eksportér bokmerker</translation>
 <translation id="1008557486741366299">Ikke nå</translation>
+<translation id="1010498023906173788">Denne fanen er koblet til en seriell port.</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Siden svarer ikke}other{Sidene svarer ikke}}</translation>
 <translation id="1012794136286421601">Dokumenter-, Regneark-, Presentasjoner- og Tegninger-filene dine synkroniseres. Åpne Google Disk-appen for å få tilgang til dem med eller uten nett.</translation>
 <translation id="1012876632442809908">USB-C-enhet (porten foran)</translation>
@@ -30,6 +31,7 @@
 <translation id="1036982837258183574">Trykk på |<ph name="ACCELERATOR" />| for å avslutte fullskjerm</translation>
 <translation id="1038168778161626396">Kun chiffrering</translation>
 <translation id="1039337018183941703">Ugyldig eller skadet fil.</translation>
+<translation id="1041175011127912238">Denne siden svarer ikke.</translation>
 <translation id="1042174272890264476">Datamaskinen din har <ph name="SHORT_PRODUCT_NAME" />s RLZ-bibliotek innebygget. RLZ tildeler en ikke-unik, ikke-personlig tagg for å måle søk og <ph name="SHORT_PRODUCT_NAME" />-bruk drevet av en bestemt markedsføringskampanje. Disse etikettene vises noen ganger i Google-søk i <ph name="PRODUCT_NAME" />.</translation>
 <translation id="1046059554679513793">Dette navnet er allerede i bruk!</translation>
 <translation id="1046635659603195359">Det ser ut til at du allerede har konfigurert Voice Match med Google-assistenten din på en annen enhet. Disse tidligere opptakene kan brukes til å lage en stemmemodell på denne enheten. Dette burde ta mindre enn ett minutt.</translation>
@@ -148,6 +150,7 @@
 <translation id="1211364473545090084">Med et inkognitovindu kan du bruke nettet uten at nettlesingsloggen lagres</translation>
 <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> fingeravtrykk er registrert</translation>
 <translation id="1215411991991485844">Nytt bakgrunnsprogram er lagt til</translation>
+<translation id="1217483152325416304">De lokale dataene dine slettes snart</translation>
 <translation id="1217668622537098248">Gå tilbake til venstreklikk etter handling</translation>
 <translation id="121783623783282548">Passordene stemmer ikke overens.</translation>
 <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />Googles posisjonstjeneste bruker kilder som Wi-Fi, mobilnettverk og sensorer til å beregne enhetens posisjon.<ph name="END_PARAGRAPH1" />
@@ -308,6 +311,7 @@
 <translation id="1478340334823509079">Detaljer: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Installasjon er ikke aktivert</translation>
 <translation id="1483493594462132177">Send</translation>
+<translation id="1484979925941077974">Nettstedet bruker Bluetooth</translation>
 <translation id="1485015260175968628">Den har allerede følgende tilgang:</translation>
 <translation id="1485141095922496924">Versjon <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation>
 <translation id="1486096554574027028">Søk i passord</translation>
@@ -454,6 +458,7 @@
 <translation id="1708338024780164500">(Inaktiv)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (innebygd)</translation>
+<translation id="1711401317189798723">Sikkerhetskopiering pågår for øyeblikket for <ph name="CONTAINER_ID" /></translation>
 <translation id="1712349894969001173">Få dette passordet på iPhonen din</translation>
 <translation id="1712552549805331520"><ph name="URL" /> ber om å lagre data permanent på datamaskinen din</translation>
 <translation id="1718835860248848330">Siste time</translation>
@@ -603,6 +608,7 @@
 <translation id="1932026958134051332">Bytt tilgangsalternativer</translation>
 <translation id="1932098463447129402">Ikke før</translation>
 <translation id="1933809209549026293">Du må koble til en mus eller et tastatur. Hvis du bruker en Bluetooth-enhet, må du sjekke at den er klar til å kobles til.</translation>
+<translation id="1937774647013465102">Kan ikke importere beholderarkitekturtypen <ph name="ARCHITECTURE_CONTAINER" /> med denne enheten (<ph name="ARCHITECTURE_DEVICE" />). Du kan prøve å gjenopprette denne beholderen på en annen enhet, eller du kan få tilgang til filene i beholderavbildningen ved å åpne den i Filer-appen.</translation>
 <translation id="1938351510777341717">Ekstern kommando</translation>
 <translation id="1940546824932169984">Tilkoblede enheter</translation>
 <translation id="1944921356641260203">En oppdatering ble funnet</translation>
@@ -887,9 +893,11 @@
 <translation id="2392369802118427583">Aktiver</translation>
 <translation id="2394566832561516196">Innstillingene slettes neste gang siden lastes inn på nytt</translation>
 <translation id="2395616325548404795"><ph name="DEVICE_TYPE" />-enheten din er nå registrert for bedriftsadministrering. Den sendte imidlertid ikke ressurs- og plasseringsinformasjon. Denne informasjonen må legges inn manuelt i administrasjonskonsollen for denne enheten.</translation>
+<translation id="2396783860772170191">Skriv inn firesifret PIN-kode (0000–9999)</translation>
 <translation id="2408955596600435184">Skriv inn PIN-koden din</translation>
 <translation id="241082044617551207">Ukjent programtillegg</translation>
 <translation id="2413749388954403953">endre brukergrensesnittet for bokmerker</translation>
+<translation id="241639282915300771">Gjenoppretting pågår for øyeblikket for <ph name="CONTAINER_ID" /></translation>
 <translation id="241727068219398187">Data ble kryptert med Google-passordet ditt
           <ph name="TIME" />. Dette inkluderer ikke betalingsmåter og adresser fra Google Pay.</translation>
 <translation id="2419706071571366386">Av sikkerhetsårsaker bør du logge av når datamaskinen ikke er i bruk.</translation>
@@ -982,6 +990,7 @@
 <translation id="2538361623464451692">Synkronisering deaktivert</translation>
 <translation id="2540449034743108469">Trykk på «Start» for å lytte etter aktivitet fra utvidelser</translation>
 <translation id="2541002089857695151">Vil du optimalisere fullskjem-casting?</translation>
+<translation id="2541706104884128042">Ny sengetid er angitt</translation>
 <translation id="2544853746127077729">Autentiseringssertifikatet ble avvist av nettverket</translation>
 <translation id="2549985041256363841">Start opptak</translation>
 <translation id="2550212893339833758">Virtuelt minne</translation>
@@ -1072,6 +1081,7 @@
 <translation id="2677748264148917807">Gå ut</translation>
 <translation id="2678063897982469759">Aktiver på nytt</translation>
 <translation id="268053382412112343">Lo&amp;gg</translation>
+<translation id="2682498795777673382">Oppdatering fra forelderen din</translation>
 <translation id="2683638487103917598">Mappen er sortert</translation>
 <translation id="2684004000387153598">For å fortsette, klikk på OK. Klikk deretter på Legg til person for å opprette en ny profil for e-postadressen din.</translation>
 <translation id="2688196195245426394">Feil under registreringen av enheten hos tjeneren: <ph name="CLIENT_ERROR" />.</translation>
@@ -1105,6 +1115,7 @@
 <translation id="2731392572903530958">Å&amp;pne det lukkede vinduet igjen</translation>
 <translation id="2731700343119398978">Vent litt …</translation>
 <translation id="2731710757838467317">Oppretter den administrerte brukeren din. Dette kan ta litt tid.</translation>
+<translation id="2731971182069536520">Neste gang du starter enheten på nytt, utfører administrator en engangsoppdatering som sletter de lokale dataene dine.</translation>
 <translation id="2734760316755174687">Nettsteder under <ph name="SITE_GROUP_NAME" /> blir også tilbakestilt.</translation>
 <translation id="2735438478659026460">Klikk automatisk når musepekeren stopper</translation>
 <translation id="2735712963799620190">Tidsplan</translation>
@@ -1308,6 +1319,7 @@
 <translation id="304747341537320566">Talemotorer</translation>
 <translation id="3047644958362961983">Denne informasjonen gir oss bedre forståelse av Assistent-problemet. Den lagres i opptil 90 dager, og bare relevante tekniske team og tilbakemeldingsteam får tilgang.</translation>
 <translation id="3053013834507634016">Bruk av sertifikatnøkkel</translation>
+<translation id="3053273573829329829">Slå på bruker-PIN-kode</translation>
 <translation id="3058498974290601450">Du kan når som helst slå på synkronisering i innstillingene</translation>
 <translation id="3060379269883947824">Slå på Tekstopplesing</translation>
 <translation id="3061707000357573562">Feilrettingstjeneste</translation>
@@ -1327,6 +1339,7 @@
 <translation id="3084771660770137092">Chrome gikk tom for minne, eller prosessen for nettsiden ble avsluttet av andre årsaker. Hvis du vil fortsette, laster du inn siden på nytt, eller går til en annen side.</translation>
 <translation id="3085412380278336437">Nettstedet kan bruke kameraet ditt</translation>
 <translation id="3085752524577180175">SOCKS-vert</translation>
+<translation id="3088052000289932193">Nettstedet bruker MIDI</translation>
 <translation id="3088325635286126843">&amp;Gi nytt navn</translation>
 <translation id="3089137131053189723">Søket er slettet</translation>
 <translation id="3090193911106258841">Åpner lyd- og videoinngang</translation>
@@ -1465,6 +1478,7 @@
 <translation id="3317459757438853210">Tosidig</translation>
 <translation id="3317678681329786349">Kameraet og mikrofonen er blokkert</translation>
 <translation id="3319048459796106952">Nytt &amp;inkognitovindu</translation>
+<translation id="3323521181261657960">Bonus! Du har fått mer skjermtid</translation>
 <translation id="3325910708063135066">Kameraet og mikrofonen er slått av i Mac-systemvalgene</translation>
 <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation>
 <translation id="3331974543021145906">Appinformasjon</translation>
@@ -1760,6 +1774,7 @@
 <translation id="3765246971671567135">Kunne ikke lese regelen for demomodus uten nett.</translation>
 <translation id="3766223500670287046">Ekstern skjerm</translation>
 <translation id="3768037234834996183">Synkroniserer innstillingene dine ...</translation>
+<translation id="377050016711188788">Iskrem</translation>
 <translation id="3771294271822695279">Videofiler</translation>
 <translation id="3775432569830822555">SSL-tjenersertifikat</translation>
 <translation id="3775705724665058594">Send til enhetene dine</translation>
@@ -1838,6 +1853,7 @@
 <translation id="3869917919960562512">Feil indeks.</translation>
 <translation id="3870931306085184145">Ingen lagrede passord for <ph name="DOMAIN" /></translation>
 <translation id="3871092408932389764">Lavest</translation>
+<translation id="3871350334636688135">Etter 24 timer utfører administrator en engangsoppdatering som sletter de lokale dataene dine når du starter enheten på nytt. Lagre eventuelle lokale data du trenger, i nettskyen innen 24 timer.</translation>
 <translation id="3872220884670338524">Flere handlinger, lagret konto for <ph name="USERNAME" /> på <ph name="DOMAIN" /></translation>
 <translation id="3872991219937722530">Frigjør lagringsplass for å unngå at enheten slutter å reagere.</translation>
 <translation id="3873315167136380065">For å slå dette på, <ph name="BEGIN_LINK" />tilbakestill synkroniseringen<ph name="END_LINK" /> for å fjerne passordfrasen din for synkronisering</translation>
@@ -1915,6 +1931,7 @@
 <translation id="3983400541576569538">Data fra noen apper kan gå tapt</translation>
 <translation id="3983586614702900908">enheter fra en ukjent leverandør</translation>
 <translation id="3984159763196946143">Kan ikke starte demomodus</translation>
+<translation id="3984431586879874039">Vil du la dette nettstedet se sikkerhetsnøkkelen din?</translation>
 <translation id="3987348946546879621">Dataforbruk redusert</translation>
 <translation id="3987938432087324095">Det fikk jeg ikke med meg.</translation>
 <translation id="3988996860813292272">Velg tidssone</translation>
@@ -1991,6 +2008,7 @@
 <translation id="4099060993766194518">Vil du gjenopprette standardsøkemotoren?</translation>
 <translation id="4099874310852108874">Det oppsto en nettverksfeil.</translation>
 <translation id="4100733287846229632">Det er kritisk lite plass på enheten</translation>
+<translation id="4100853287411968461">Ny grense for skjermtid</translation>
 <translation id="4103091233824664032">Skriv inn passordet ditt for å konfigurere skjermlåsen og påloggingen</translation>
 <translation id="4104163789986725820">E&amp;ksportér</translation>
 <translation id="4107048419833779140">Identifiser og løs ut lagringsenheter</translation>
@@ -2052,7 +2070,6 @@
 <translation id="42126664696688958">Eksportér</translation>
 <translation id="42137655013211669">Tilgangen til denne ressursen ble avvist av tjeneren.</translation>
 <translation id="4215350869199060536">Ojsann – det er ulovlige symboler i navnet!</translation>
-<translation id="4222932583846282852">Avbryter …</translation>
 <translation id="4225397296022057997">På alle nettsteder</translation>
 <translation id="4235200303672858594">Hele skjermen</translation>
 <translation id="4235965441080806197">Avbryt påloggingen</translation>
@@ -2110,6 +2127,7 @@
 <translation id="4324577459193912240">Filen er ufullstendig</translation>
 <translation id="4325237902968425115">Avinstallerer <ph name="LINUX_APP_NAME" /> …</translation>
 <translation id="4328203388435897516">Når Chromebooken din er konfigurert, kan du når som helst få hjelp ved å trykke på Assistent-knappen eller si «Ok Google». Gå til Assistent-innstillingene for å gjøre endringer.</translation>
+<translation id="4330191372652740264">Isvann</translation>
 <translation id="4330387663455830245">Oversett aldri <ph name="LANGUAGE" /></translation>
 <translation id="4333854382783149454">PKCS #1 SHA-1 med RSA-kryptering</translation>
 <translation id="4336979451636460645">For nettverkslogger, se: <ph name="DEVICE_LOG_LINK" /></translation>
@@ -2145,6 +2163,7 @@
 <translation id="438503109373656455">Jockey</translation>
 <translation id="4387004326333427325">Autentiseringssertifikatet ble avvist eksternt</translation>
 <translation id="4389091756366370506">Bruker <ph name="VALUE" /></translation>
+<translation id="4390000551125140321">{0,plural, =1{Inkognito}other{# åpne inkognitovinduer}}</translation>
 <translation id="439266289085815679">Bluetooth-konfigurasjonen kontrolleres av <ph name="USER_EMAIL" />.</translation>
 <translation id="4394049700291259645">Slå av</translation>
 <translation id="4400367121200150367">Nettsteder som aldri lagrer passord, vises her</translation>
@@ -2293,6 +2312,7 @@
 <translation id="4648499713050786492">Du må låse opp profilen din før du kan legge til en person.</translation>
 <translation id="4651484272688821107">Kunne ikke laste inn nettbasert komponent med ressurser for demomodus.</translation>
 <translation id="465878909996028221">Bare protokollene http, https og file støttes for viderekobling av nettleseren.</translation>
+<translation id="4659077111144409915">Primærkonto</translation>
 <translation id="4660476621274971848">Den forventede versjonen var «<ph name="EXPECTED_VERSION" />», men den faktiske versjonen var «<ph name="NEW_ID" />»</translation>
 <translation id="4662788913887017617">Del dette bokmerket med iPhone</translation>
 <translation id="4663373278480897665">Kameraet er tillatt</translation>
@@ -2338,6 +2358,7 @@
 <translation id="4724450788351008910">Tilknytning endret</translation>
 <translation id="4725511304875193254">Corgi</translation>
 <translation id="4726710629007580002">Det kom advarsler under forsøket på å installere denne utvidelsen:</translation>
+<translation id="4727847987444062305">Administrert gjesteøkt</translation>
 <translation id="4728558894243024398">Plattform</translation>
 <translation id="4733082559415072992"><ph name="URL" /> ber om å bruke posisjonen til enheten din</translation>
 <translation id="4733793249294335256">Sted</translation>
@@ -2447,6 +2468,7 @@
 <translation id="488785315393301722">Vis detaljer</translation>
 <translation id="4890773143211625964">Vis avanserte skriveralternativer</translation>
 <translation id="4891089016822695758">Forumet for betaversjoner</translation>
+<translation id="4892229439761351791">Nettstedet kan bruke Bluetooth</translation>
 <translation id="4893336867552636863">Dette sletter nettlesingsdataene dine permanent fra denne enheten.</translation>
 <translation id="4893522937062257019">På låseskjermen</translation>
 <translation id="4898011734382862273">Sertifikatet «<ph name="CERTIFICATE_NAME" />» representerer en sertifiseringsinstans</translation>
@@ -2622,6 +2644,8 @@
 <translation id="5187295959347858724">Du er nå pålogget <ph name="SHORT_PRODUCT_NAME" />. Bokmerkene, loggen og de andre innstillingene dine blir synkronisert med Google-kontoen din.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> ber om å laste ned flere filer</translation>
+<translation id="5192316339598592690">Bytt konto raskt, og logg på både apper og nettsteder samtidig.
+    Apper og nettsteder kan be om tillatelse til å bruke noe av informasjonen fra Google-kontoen din. <ph name="LINK_BEGIN" />Finn ut mer<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Utfør Powerwash på enheten, og prøv på nytt.</translation>
 <translation id="5204967432542742771">Skriv inn passordet</translation>
 <translation id="5206215183583316675">Vil du slette «<ph name="CERTIFICATE_NAME" />»?</translation>
@@ -3506,6 +3530,7 @@
 <translation id="6547354035488017500">Frigjør minst 512 MB lagringsplass for å unngå at enheten slutter å reagere. For å frigjøre plass, slett filer fra enhetslagringen.</translation>
 <translation id="6550675742724504774">Alternativer</translation>
 <translation id="6551508934388063976">Kommandoen er utilgjengelig. Trykk på control-N for å åpne et nytt vindu.</translation>
+<translation id="6551612971599078809">Nettstedet bruker USB</translation>
 <translation id="655384502888039633"><ph name="USER_COUNT" /> brukere</translation>
 <translation id="655483977608336153">Prøv igjen</translation>
 <translation id="6555432686520421228">Fjern alle brukerkontoer og tilbakestill <ph name="IDS_SHORT_PRODUCT_NAME" />-enheten din til fabrikkstandard.</translation>
@@ -3729,6 +3754,7 @@
 <translation id="692114467174262153">Kunne ikke åpne <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
 <translation id="6921709132208495314">Ikke bruk data på denne siden</translation>
 <translation id="6922128026973287222">Lagre data og bla gjennom dem raskere ved hjelp av Google Datasparing. Klikk for å lese mer.</translation>
+<translation id="6922745772873733498">Skriv inn en PIN-kode for å skrive ut</translation>
 <translation id="6923132443355966645">Rull/klikk</translation>
 <translation id="6923633482430812883">Feil ved aktivering av deling. Sjekk at filtjeneren du er koblet til, støtter SMBv2 eller nyere.</translation>
 <translation id="6930036377490597025">Ekstern sikkerhetsnøkkel eller innebygd sensor</translation>
@@ -3783,6 +3809,7 @@
 <translation id="7003339318920871147">Nettdatabaser</translation>
 <translation id="7003723821785740825">Konfigurer en raskere måte å låse opp enheten din på</translation>
 <translation id="7003844668372540529">Ukjent produkt, <ph name="PRODUCT_ID" />, fra <ph name="VENDOR_NAME" /></translation>
+<translation id="7004402701596653846">Nettstedet kan bruke MIDI</translation>
 <translation id="7004499039102548441">Nylige faner</translation>
 <translation id="7005848115657603926">Ugyldig sideområde. Bruk <ph name="EXAMPLE_PAGE_RANGE" /></translation>
 <translation id="7006634003215061422">Bunnmarg</translation>
@@ -3798,6 +3825,7 @@
 <translation id="7022562585984256452">Startsiden din er angitt.</translation>
 <translation id="7025190659207909717">Administrering av tjenester for mobildata</translation>
 <translation id="7029809446516969842">Passord</translation>
+<translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – seriell port er tilkoblet</translation>
 <translation id="7031962166228839643">TMP blir klargjort. Vent litt (dette kan ta noen minutter).</translation>
 <translation id="7037509989619051237">Tekst til forhåndsvisning</translation>
 <translation id="7039326228527141150">Les USB-enheter fra <ph name="VENDOR_NAME" /></translation>
@@ -3822,6 +3850,7 @@
 <translation id="706626672220389329">Feil ved aktivering av deling. Den spesifiserte delingen er allerede aktivert.</translation>
 <translation id="7066944511817949584">Kunne ikke tilknytte «<ph name="DEVICE_NAME" />».</translation>
 <translation id="7067725467529581407">Ikke vis dette igjen.</translation>
+<translation id="7069811530847688087"><ph name="WEBSITE" /> krever kanskje en nyere eller en annen type sikkerhetsnøkkel</translation>
 <translation id="7070484045139057854">Dette innebærer lesing og endring av nettstedsdata</translation>
 <translation id="7072010813301522126">Snarveisnavn</translation>
 <translation id="707392107419594760">Velg tastatur:</translation>
@@ -3902,6 +3931,7 @@
 <translation id="7189234443051076392">Sørg for at det er nok plass på enheten</translation>
 <translation id="7189965711416741966">Fingeravtrykket er lagt til.</translation>
 <translation id="7191159667348037">Ukjent skriver (USB)</translation>
+<translation id="7193051357671784796">Denne appen er lagt til av organisasjonen din. Start appen på nytt for å fullføre installasjonen.</translation>
 <translation id="7193374945610105795">Ingen passord er lagret for <ph name="ORIGIN" /></translation>
 <translation id="7196913789568937443">Sikkerhetskopiér til Google Disk. Gjenopprett data eller bytt enhet når som helst – helt enkelt. Sikkerhetskopiene dine lastes opp til Google og krypteres med passordet for Google-kontoen din. <ph name="BEGIN_LINK1" />Finn ut mer<ph name="END_LINK1" /></translation>
 <translation id="7197190419934240522">Få Google Søk og smarte funksjoner fra Google hver gang du surfer på nettet</translation>
@@ -4322,6 +4352,7 @@
     <ph name="BR" />
     <ph name="BEGIN_BOLD" />Merk:<ph name="END_BOLD" /> Systemet startes på nytt i løpet av prosessen.</translation>
 <translation id="7829298379596169484">Åpner lydinngang</translation>
+<translation id="7830594666202422257">Koble til Linux</translation>
 <translation id="7831491651892296503">En feil oppsto under konfigureringen av nettverket</translation>
 <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation>
 <translation id="7832084384634357321">Sluttid</translation>
@@ -4351,6 +4382,7 @@
 <translation id="7877451762676714207">Ukjent tjenerfeil. Prøv på nytt eller kontakt tjeneradministratoren.</translation>
 <translation id="7877680364634660272">Innføring</translation>
 <translation id="7878562273885520351">Passordet ditt kan være kompromittert</translation>
+<translation id="7880823633812189969">Lokale data slettes når du starter på nytt</translation>
 <translation id="7881483672146086348">Se konto</translation>
 <translation id="7882358943899516840">Leverandørtype</translation>
 <translation id="7885253890047913815">Nylige destinasjoner</translation>
@@ -4690,6 +4722,7 @@
 <translation id="8426713856918551002">Aktiverer</translation>
 <translation id="8427292751741042100">innebygd på et hvilket som helst nettsted</translation>
 <translation id="8428213095426709021">Innstillinger</translation>
+<translation id="8428628598981198790">Sikkerhetsnøkkelen din kan ikke brukes på dette nettstedet</translation>
 <translation id="84297032718407999">Du logges av om <ph name="LOGOUT_TIME_LEFT" /></translation>
 <translation id="8431190899827883166">Vis trykk</translation>
 <translation id="8431909052837336408">Endre PIN-koden for SIM-kortet</translation>
@@ -4894,6 +4927,7 @@
 <translation id="8732212173949624846">lese og endre nettleserloggen på alle enhetene du er pålogget</translation>
 <translation id="8732844209475700754">Flere innstillinger knyttet til personvern, sikkerhet og datainnsamling.</translation>
 <translation id="8734073480934656039">Aktivering av denne innstillingen gjør at kioskapper starter automatisk ved oppstart.</translation>
+<translation id="8734671092194994316">Dette medfører at besøket ditt på <ph name="WEBSITE" /> registreres på sikkerhetsnøkkelen.</translation>
 <translation id="873545264931343897">Når <ph name="PLUGIN_NAME" /> er ferdig oppdatert, må du laste inn siden på nytt for å aktivere den</translation>
 <translation id="8736288397686080465">Dette nettstedet har blitt oppdatert i bakgrunnen.</translation>
 <translation id="8737685506611670901">åpne linker til <ph name="PROTOCOL" /> i stedet for <ph name="REPLACED_HANDLER_TITLE" /></translation>
@@ -4992,6 +5026,7 @@
 <translation id="8877448029301136595">[overordnet katalog]</translation>
 <translation id="8879284080359814990">Vi&amp;s som fane</translation>
 <translation id="8883847527783433352">Synkroniser til en annen konto</translation>
+<translation id="8884570509232205463">Enheten blir nå låst klokken <ph name="UNLOCK_TIME" />.</translation>
 <translation id="8885197664446363138">Smart Lock er utilgjengelig</translation>
 <translation id="8888253246822647887">Appen åpnes når oppgraderingen er ferdig. Oppgraderinger kan ta noen minutter.</translation>
 <translation id="8888432776533519951">Farge:</translation>
@@ -5084,6 +5119,7 @@
 <translation id="9026852570893462412">Denne prosessen kan ta noen minutter. Laster ned den virtuelle maskinen.</translation>
 <translation id="9027459031423301635">Åpne link i ny &amp;fane</translation>
 <translation id="9030515284705930323">Organisasjonen din har ikke slått på Google Play-butikken for kontoen din. Kontakt administratoren din for å få mer informasjon.</translation>
+<translation id="9030785788945687215">Gmail</translation>
 <translation id="9033857511263905942">&amp;Lim inn</translation>
 <translation id="9037965129289936994">Vis original</translation>
 <translation id="9038649477754266430">Bruk en prediksjonstjeneste for å laste inn sider raskere</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb
index 5ddc32b7..794e278 100644
--- a/chrome/app/resources/generated_resources_pl.xtb
+++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -2012,6 +2012,7 @@
 <translation id="409579654357498729">Dodaj do Cloud Print</translation>
 <translation id="4096508467498758490">Wyłącz rozszerzenia trybu dewelopera</translation>
 <translation id="4096824249111507322">Czekaj, moduł zabezpieczeń jest przygotowywany (może to potrwać kilka minut)…</translation>
+<translation id="4097560579602855702">Szukaj w Google</translation>
 <translation id="4099060993766194518">Przywrócić domyślną wyszukiwarkę?</translation>
 <translation id="4099874310852108874">Wystąpił błąd sieci.</translation>
 <translation id="4100733287846229632">Na urządzeniu już prawie nie ma miejsca</translation>
@@ -2077,7 +2078,6 @@
 <translation id="42126664696688958">Eksportuj</translation>
 <translation id="42137655013211669">Serwer zabronił dostępu do tego zasobu.</translation>
 <translation id="4215350869199060536">Ups! W nazwie są niedozwolone znaki.</translation>
-<translation id="4222932583846282852">Anuluję...</translation>
 <translation id="4225397296022057997">We wszystkich witrynach</translation>
 <translation id="4235200303672858594">Cały ekran</translation>
 <translation id="4235965441080806197">Anuluj logowanie</translation>
@@ -2683,7 +2683,7 @@
 <translation id="5241128660650683457">Odczyt wszystkich Twoich danych na odwiedzanych stronach internetowych</translation>
 <translation id="5242724311594467048">Włączyć rozszerzenie „<ph name="EXTENSION_NAME" />”?</translation>
 <translation id="5243522832766285132">Spróbuj ponownie za kilka chwil</translation>
-<translation id="5244474230056479698">Synchronizowanie z <ph name="EMAIL" /></translation>
+<translation id="5244474230056479698">Synchronizacja z <ph name="EMAIL" /></translation>
 <translation id="5246282308050205996">Aplikacja <ph name="APP_NAME" /> uległa awarii. Kliknij ten dymek, aby uruchomić ją ponownie.</translation>
 <translation id="5247051749037287028">Wyświetlana nazwa (opcjonalnie)</translation>
 <translation id="5249624017678798539">Przeglądarka uległa awarii przed zakończeniem pobierania.</translation>
@@ -2991,7 +2991,7 @@
 <translation id="5701080607174488915">Podczas pobierania zasad z serwera wystąpił błąd.</translation>
 <translation id="5701381305118179107">Wyśrodkuj</translation>
 <translation id="5702898740348134351">&amp;Edytuj wyszukiwarki...</translation>
-<translation id="5704875434923668958">Synchronizowanie z</translation>
+<translation id="5704875434923668958">Synchronizacja z</translation>
 <translation id="5707185214361380026">Nie udało się wczytać rozszerzenia z:</translation>
 <translation id="5708171344853220004">Nazwa główna firmy Microsoft</translation>
 <translation id="5709557627224531708">Ustaw Chrome jako domyślną przeglądarkę</translation>
@@ -3830,7 +3830,6 @@
 <translation id="7017480957358237747">zezwalać na dostęp do określonych witryn lub blokować go,</translation>
 <translation id="7018275672629230621">Odczyt i zmiana historii przeglądania</translation>
 <translation id="7019805045859631636">Szybko</translation>
-<translation id="702252130983202758">Twoje aplikacje</translation>
 <translation id="7022562585984256452">Strona główna została ustawiona.</translation>
 <translation id="7025190659207909717">Zarządzanie komórkową usługą transmisji danych</translation>
 <translation id="7029809446516969842">Hasła</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb
index b33fcab..37eec7e 100644
--- a/chrome/app/resources/generated_resources_pt-BR.xtb
+++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -2012,6 +2012,7 @@
 <translation id="409579654357498729">Adicionar ao Google Cloud Print</translation>
 <translation id="4096508467498758490">Desativar extensões no modo de desenvolvedor</translation>
 <translation id="4096824249111507322">O módulo de segurança está sendo preparado. Aguarde. Esse processo pode demorar alguns minutos…</translation>
+<translation id="4097560579602855702">Pesquisar no Google</translation>
 <translation id="4099060993766194518">Restaurar mecanismo de pesquisa padrão?</translation>
 <translation id="4099874310852108874">Ocorreu um erro de rede.</translation>
 <translation id="4100733287846229632">Espaço em disco do dispositivo criticamente baixo</translation>
@@ -2077,7 +2078,6 @@
 <translation id="42126664696688958">Exportar</translation>
 <translation id="42137655013211669">O acesso a este recurso foi proibido pelo servidor.</translation>
 <translation id="4215350869199060536">Ops, o nome contém símbolos inválidos.</translation>
-<translation id="4222932583846282852">Cancelando…</translation>
 <translation id="4225397296022057997">Em todos os sites</translation>
 <translation id="4235200303672858594">Tela cheia</translation>
 <translation id="4235965441080806197">Cancelar login</translation>
@@ -3832,7 +3832,6 @@
 <translation id="7017480957358237747">permitir ou proibir determinados websites,</translation>
 <translation id="7018275672629230621">Ler e alterar seu histórico de navegação</translation>
 <translation id="7019805045859631636">Rápido</translation>
-<translation id="702252130983202758">Seus apps</translation>
 <translation id="7022562585984256452">Sua página inicial foi definida.</translation>
 <translation id="7025190659207909717">Gerenciamento dos serviços de dados móveis</translation>
 <translation id="7029809446516969842">Senhas</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb
index 3a27316e..001aecc 100644
--- a/chrome/app/resources/generated_resources_pt-PT.xtb
+++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -2012,6 +2012,7 @@
 <translation id="409579654357498729">Adicionar ao Google Cloud Print</translation>
 <translation id="4096508467498758490">Desativar extensões de modo de programador</translation>
 <translation id="4096824249111507322">O módulo seguro está a ser preparado. Aguarde (esta operação pode demorar alguns minutos)...</translation>
+<translation id="4097560579602855702">Pesquise no Google</translation>
 <translation id="4099060993766194518">Pretende restaurar o motor de pesquisa predefinido?</translation>
 <translation id="4099874310852108874">Ocorreu um erro de rede.</translation>
 <translation id="4100733287846229632">Espaço do dispositivo criticamente baixo</translation>
@@ -2077,7 +2078,6 @@
 <translation id="42126664696688958">Exportar</translation>
 <translation id="42137655013211669">O acesso a este recurso foi proibido pelo servidor.</translation>
 <translation id="4215350869199060536">Existem símbolos ilegais no nome.</translation>
-<translation id="4222932583846282852">A cancelar…</translation>
 <translation id="4225397296022057997">Em todos os sites</translation>
 <translation id="4235200303672858594">Ecrã inteiro</translation>
 <translation id="4235965441080806197">Cancelar início de sessão</translation>
@@ -3831,7 +3831,6 @@
 <translation id="7017480957358237747">permitir ou proibir determinados Sites,</translation>
 <translation id="7018275672629230621">Ler e alterar o histórico de navegação</translation>
 <translation id="7019805045859631636">Rápido</translation>
-<translation id="702252130983202758">As suas aplicações</translation>
 <translation id="7022562585984256452">A sua página inicial foi definida.</translation>
 <translation id="7025190659207909717">Gestão de serviços de dados móveis</translation>
 <translation id="7029809446516969842">Palavras-passe</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb
index ba54278..7d76144 100644
--- a/chrome/app/resources/generated_resources_ro.xtb
+++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -2077,7 +2077,6 @@
 <translation id="42126664696688958">Exportă</translation>
 <translation id="42137655013211669">Accesul la această resursă a fost interzis de server.</translation>
 <translation id="4215350869199060536">Hopa, în nume apar simboluri nepermise!</translation>
-<translation id="4222932583846282852">Se anulează…</translation>
 <translation id="4225397296022057997">Pe toate site-urile</translation>
 <translation id="4235200303672858594">Întregul ecran</translation>
 <translation id="4235965441080806197">Anulează conectarea</translation>
@@ -3830,7 +3829,6 @@
 <translation id="7017480957358237747">permiteți sau interziceți anumite site-uri web,</translation>
 <translation id="7018275672629230621">Citește și modifică istoricul de navigare</translation>
 <translation id="7019805045859631636">Rapid</translation>
-<translation id="702252130983202758">Aplicațiile tale</translation>
 <translation id="7022562585984256452">Pagina de pornire a fost setată.</translation>
 <translation id="7025190659207909717">Gestionarea serviciului de date mobile</translation>
 <translation id="7029809446516969842">Parole</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb
index 0f19957..ef3898b6 100644
--- a/chrome/app/resources/generated_resources_ru.xtb
+++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -8,6 +8,7 @@
 <translation id="1007408791287232274">Не удалось загрузить список устройств.</translation>
 <translation id="1008186147501209563">Экспорт закладок</translation>
 <translation id="1008557486741366299">Не сейчас</translation>
+<translation id="1010498023906173788">Эта вкладка подключена к последовательному порту.</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Страница не отвечает}one{Страницы не отвечают}few{Страницы не отвечают}many{Страницы не отвечают}other{Страницы не отвечают}}</translation>
 <translation id="1012794136286421601">Ваши документы, таблицы, презентации и рисунки синхронизируются. Запустите приложение "Google Диск", чтобы получить к ним доступ в режиме онлайн или офлайн.</translation>
 <translation id="1012876632442809908">Устройство USB-C (порт спереди)</translation>
@@ -30,6 +31,7 @@
 <translation id="1036982837258183574">Чтобы выйти из полноэкранного режима, нажмите |<ph name="ACCELERATOR" />|</translation>
 <translation id="1038168778161626396">Только расшифровка</translation>
 <translation id="1039337018183941703">Файл поврежден или недействителен</translation>
+<translation id="1041175011127912238">Страница не отвечает</translation>
 <translation id="1042174272890264476">В ваш компьютер встроена библиотека RLZ <ph name="SHORT_PRODUCT_NAME" />. RLZ присваивает компьютеру неуникальную и не позволяющую идентифицировать пользователя метку, с помощью которой мы можем оценить количество запросов и статистику использования этого продукта (<ph name="SHORT_PRODUCT_NAME" />) по результатам рекламных кампаний. Иногда метки могут включаться в поисковые запросы, сделанные в этом продукте (<ph name="PRODUCT_NAME" />).</translation>
 <translation id="1046059554679513793">Ошибка! Это название уже используется.</translation>
 <translation id="1046635659603195359">Вы уже настроили Voice Match в Google Ассистенте на другом устройстве. Предыдущие записи вашего голоса можно использовать для создания образца на этом устройстве. Настройка займет не больше минуты.</translation>
@@ -148,6 +150,7 @@
 <translation id="1211364473545090084">Не хотите, чтобы сохранялась история просмотров? Используйте режим инкогнито.</translation>
 <translation id="1213037489357051291">Отпечатков добавлено: <ph name="NUM_FINGERPRINTS" /></translation>
 <translation id="1215411991991485844">Добавлено фоновое приложение</translation>
+<translation id="1217483152325416304">Локальные данные скоро будут удалены</translation>
 <translation id="1217668622537098248">Переключаться обратно на нажатие левой кнопки мыши после завершения действия</translation>
 <translation id="121783623783282548">Пароли не совпадают.</translation>
 <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />Когда геолокация Google включена, местоположение устройства определяется с помощью датчиков, Wi‑Fi и мобильных сетей.<ph name="END_PARAGRAPH1" />
@@ -308,6 +311,7 @@
 <translation id="1478340334823509079">Подробные сведения: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">Установка не разрешена</translation>
 <translation id="1483493594462132177">Отправить</translation>
+<translation id="1484979925941077974">Сайт использует устройство Bluetooth</translation>
 <translation id="1485015260175968628">Разрешения:</translation>
 <translation id="1485141095922496924">Версия <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />), <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation>
 <translation id="1486096554574027028">Поиск паролей</translation>
@@ -456,6 +460,7 @@
 <translation id="1708338024780164500">(неактивно)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (идентификатор: <ph name="ID_PH" />)</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (оригинальное)</translation>
+<translation id="1711401317189798723">Выполняется резервное копирование для <ph name="CONTAINER_ID" /></translation>
 <translation id="1712349894969001173">Получите этот пароль на iPhone</translation>
 <translation id="1712552549805331520">Сайт <ph name="URL" /> запрашивает разрешение на постоянное хранение данных на вашем компьютере.</translation>
 <translation id="1718835860248848330">Последний час</translation>
@@ -605,6 +610,7 @@
 <translation id="1932026958134051332">Параметры Switch Access</translation>
 <translation id="1932098463447129402">Не ранее</translation>
 <translation id="1933809209549026293">Подключите мышь или клавиатуру. Если вы используете Bluetooth-устройство, убедитесь, что оно готово к установке соединения.</translation>
+<translation id="1937774647013465102">Не удалось импортировать тип архитектуры контейнера <ph name="ARCHITECTURE_CONTAINER" /> на это устройство (<ph name="ARCHITECTURE_DEVICE" />). Вы можете попробовать восстановить этот контейнер на другом устройстве или получить доступ к файлам, открыв образ контейнера в приложении "Файлы".</translation>
 <translation id="1938351510777341717">Внешняя клавиша Command</translation>
 <translation id="1940546824932169984">Подключенные устройства</translation>
 <translation id="1944921356641260203">Найдено обновление</translation>
@@ -889,9 +895,11 @@
 <translation id="2392369802118427583">Активировать</translation>
 <translation id="2394566832561516196">Настройки будут сброшены при следующей перезагрузке.</translation>
 <translation id="2395616325548404795">Устройство <ph name="DEVICE_TYPE" /> зарегистрировано в организации, но при передаче данных об объекте и местоположении произошла ошибка. Введите эту информацию вручную в консоли администратора.</translation>
+<translation id="2396783860772170191">Введите четырехзначный PIN-код (0000–9999)</translation>
 <translation id="2408955596600435184">Введите PIN-код</translation>
 <translation id="241082044617551207">Неизвестный плагин</translation>
 <translation id="2413749388954403953">Изменение пользовательского интерфейса закладок</translation>
+<translation id="241639282915300771">Выполняется восстановление для <ph name="CONTAINER_ID" /></translation>
 <translation id="241727068219398187">Данные зашифрованы с помощью пароля вашего аккаунта Google от <ph name="TIME" />. Шифрование не применяется к способам оплаты и адресам из Google Pay.</translation>
 <translation id="2419706071571366386">Если вы закончили работу на компьютере, рекомендуем выйти из аккаунта.</translation>
 <translation id="2423578206845792524">Со&amp;хранить картинку как...</translation>
@@ -983,6 +991,7 @@
 <translation id="2538361623464451692">Синхронизация отключена</translation>
 <translation id="2540449034743108469">Чтобы включить прослушиватель событий для расширений, нажмите "Запустить".</translation>
 <translation id="2541002089857695151">Оптимизировать трансляцию в полноэкранном режиме?</translation>
+<translation id="2541706104884128042">Время сна изменено.</translation>
 <translation id="2544853746127077729">Сертификат аутентификации отклонен сетью</translation>
 <translation id="2549985041256363841">Начать запись</translation>
 <translation id="2550212893339833758">Память подкачки</translation>
@@ -1076,6 +1085,7 @@
 <translation id="2677748264148917807">Закрыть</translation>
 <translation id="2678063897982469759">Включить снова</translation>
 <translation id="268053382412112343">&amp;История</translation>
+<translation id="2682498795777673382">Ваш родитель изменил настройки</translation>
 <translation id="2683638487103917598">Содержимое папки отсортировано</translation>
 <translation id="2684004000387153598">Чтобы продолжить, нажмите "OK". Затем создайте другой профиль для своего адреса электронной почты, выбрав "Добавить пользователя".</translation>
 <translation id="2688196195245426394">Ошибка при регистрации устройства на сервере: <ph name="CLIENT_ERROR" />.</translation>
@@ -1109,6 +1119,7 @@
 <translation id="2731392572903530958">Открыть закрытое окно</translation>
 <translation id="2731700343119398978">Подождите…</translation>
 <translation id="2731710757838467317">Создание контролируемого пользователя. Операция может занять несколько минут.</translation>
+<translation id="2731971182069536520">Когда вы перезапустите устройство, администратор выполнит разовое обновление, которое удалит ваши локальные файлы.</translation>
 <translation id="2734760316755174687">Разрешения будут также сброшены на всех сайтах <ph name="SITE_GROUP_NAME" />.</translation>
 <translation id="2735438478659026460">Автоматически регистрировать нажатие кнопки мыши, когда указатель останавливается</translation>
 <translation id="2735712963799620190">Расписание</translation>
@@ -1312,6 +1323,7 @@
 <translation id="304747341537320566">Синтезаторы речи</translation>
 <translation id="3047644958362961983">Эта информация поможет нам понять, в чем причина возникшей неполадки в работе Ассистента. Данные хранятся до 90 дней. Доступ к ним есть только у разработчиков и специалистов по работе с отзывами.</translation>
 <translation id="3053013834507634016">Использование ключа сертификата</translation>
+<translation id="3053273573829329829">Включить PIN-код пользователя</translation>
 <translation id="3058498974290601450">Ее можно включить в настройках в любой момент.</translation>
 <translation id="3060379269883947824">Включить озвучивание при нажатии</translation>
 <translation id="3061707000357573562">Исправление сервиса</translation>
@@ -1331,6 +1343,7 @@
 <translation id="3084771660770137092">Выполнение процесса этой веб-страницы было прекращено. Это может быть вызвано тем, что Chrome не хватает памяти, или иными причинами. Чтобы продолжить, обновите страницу или перейдите на другой URL.</translation>
 <translation id="3085412380278336437">Сайт может использовать камеру</translation>
 <translation id="3085752524577180175">SOCKS-прокси</translation>
+<translation id="3088052000289932193">Сайт использует устройство MIDI</translation>
 <translation id="3088325635286126843">&amp;Переименовать</translation>
 <translation id="3089137131053189723">История поиска удалена</translation>
 <translation id="3090193911106258841">Доступ к аудио- и видеовходу</translation>
@@ -1470,6 +1483,7 @@
 <translation id="3317459757438853210">Двусторонняя печать</translation>
 <translation id="3317678681329786349">Доступ к камере и микрофону запрещен</translation>
 <translation id="3319048459796106952">Новое окно в режиме &amp;инкогнито</translation>
+<translation id="3323521181261657960">Время использования устройства продлено</translation>
 <translation id="3325910708063135066">Камера и микрофон отключены в системных настройках macOS</translation>
 <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation>
 <translation id="3331974543021145906">О приложении</translation>
@@ -1765,6 +1779,7 @@
 <translation id="3765246971671567135">Не удалось прочитать политику работы офлайн в демонстрационном режиме.</translation>
 <translation id="3766223500670287046">На другом устройстве</translation>
 <translation id="3768037234834996183">Синхронизация настроек...</translation>
+<translation id="377050016711188788">Мороженое</translation>
 <translation id="3771294271822695279">Видеофайлы</translation>
 <translation id="3775432569830822555">Сертификат сервера SSL</translation>
 <translation id="3775705724665058594">Отправка на свои устройства</translation>
@@ -1843,6 +1858,7 @@
 <translation id="3869917919960562512">Неверный индекс.</translation>
 <translation id="3870931306085184145">Для домена <ph name="DOMAIN" /> нет сохраненных паролей.</translation>
 <translation id="3871092408932389764">Самый низкий</translation>
+<translation id="3871350334636688135">Через 24 часа ваш администратор выполнит разовое обновление. Когда оно вступит в силу, после перезапуска устройства ваши локальные данные будут удалены. У вас есть 24 часа, чтобы сохранить необходимые локальные данные в облачном хранилище.</translation>
 <translation id="3872220884670338524">Сохраненный аккаунт <ph name="USERNAME" /> на сайте <ph name="DOMAIN" /></translation>
 <translation id="3872991219937722530">Если вы не освободите пространство, устройство перестанет отвечать.</translation>
 <translation id="3873315167136380065">Чтобы включить эту настройку, <ph name="BEGIN_LINK" />сбросьте настройки синхронизации<ph name="END_LINK" /> и удалите кодовую фразу.</translation>
@@ -1922,6 +1938,7 @@
 <translation id="3983400541576569538">Возможно, данные некоторых приложений были потеряны.</translation>
 <translation id="3983586614702900908">устройства от неизвестного поставщика</translation>
 <translation id="3984159763196946143">Не удалось запустить демонстрационный режим</translation>
+<translation id="3984431586879874039">Разрешить этому сайту просматривать данные вашего электронного ключа?</translation>
 <translation id="3987348946546879621">Версия для предпросмотра</translation>
 <translation id="3987938432087324095">Извините, не слышно.</translation>
 <translation id="3988996860813292272">Выбор часового пояса</translation>
@@ -1998,6 +2015,7 @@
 <translation id="4099060993766194518">Восстановить поисковую систему по умолчанию?</translation>
 <translation id="4099874310852108874">Ошибка подключения.</translation>
 <translation id="4100733287846229632">На устройстве почти нет свободного места</translation>
+<translation id="4100853287411968461">Время использования изменено.</translation>
 <translation id="4103091233824664032">Чтобы настроить блокировку экрана и параметры входа, введите пароль.</translation>
 <translation id="4104163789986725820">Э&amp;кспорт...</translation>
 <translation id="4107048419833779140">Идентификация и извлечение запоминающих устройств</translation>
@@ -2059,7 +2077,6 @@
 <translation id="42126664696688958">Экспортировать</translation>
 <translation id="42137655013211669">Доступ к этому ресурсу запрещен сервером.</translation>
 <translation id="4215350869199060536">Имя содержит недопустимые символы!</translation>
-<translation id="4222932583846282852">Отмена…</translation>
 <translation id="4225397296022057997">На всех сайтах</translation>
 <translation id="4235200303672858594">Полноэкранный режим</translation>
 <translation id="4235965441080806197">Отменить вход</translation>
@@ -2117,6 +2134,7 @@
 <translation id="4324577459193912240">Файл скачан не полностью</translation>
 <translation id="4325237902968425115">Удаление приложения "<ph name="LINUX_APP_NAME" />"…</translation>
 <translation id="4328203388435897516">Завершив настройку Chromebook, вы сможете обращаться к Ассистенту в любое время. Для этого нажмите соответствующую кнопку или скажите "Окей, Google". Изменить эти параметры можно в настройках Ассистента.</translation>
+<translation id="4330191372652740264">Вода со льдом</translation>
 <translation id="4330387663455830245">Никогда не переводить <ph name="LANGUAGE" /></translation>
 <translation id="4333854382783149454">PKCS #1 SHA-1 с шифрованием RSA</translation>
 <translation id="4336979451636460645">Просмотреть сетевые журналы можно на странице <ph name="DEVICE_LOG_LINK" /></translation>
@@ -2152,6 +2170,7 @@
 <translation id="438503109373656455">Скачки</translation>
 <translation id="4387004326333427325">Сертификат аутентификации отклонен удаленно</translation>
 <translation id="4389091756366370506">Пользователь <ph name="VALUE" /></translation>
+<translation id="4390000551125140321">{0,plural, =1{1 окно в режиме инкогнито}one{# окно в режиме инкогнито}few{# окна в режиме инкогнито}many{# окон в режиме инкогнито}other{# окна в режиме инкогнито}}</translation>
 <translation id="439266289085815679">Конфигурацию Bluetooth контролирует пользователь <ph name="USER_EMAIL" />.</translation>
 <translation id="4394049700291259645">Отключить</translation>
 <translation id="4400367121200150367">Здесь появятся сайты, которые никогда не сохраняют пароли</translation>
@@ -2300,6 +2319,7 @@
 <translation id="4648499713050786492">Разблокируйте свой профиль, прежде чем добавлять ещё один.</translation>
 <translation id="4651484272688821107">Не удалось загрузить онлайн-компонент с ресурсами демонстрационного режима.</translation>
 <translation id="465878909996028221">Для переадресации в браузере поддерживаются только протоколы HTTP, HTTPS и файловые протоколы.</translation>
+<translation id="4659077111144409915">Основной аккаунт</translation>
 <translation id="4660476621274971848">Ожидаемая версия: <ph name="EXPECTED_VERSION" />, полученная версия: <ph name="NEW_ID" /></translation>
 <translation id="4662788913887017617">Поделитесь закладкой с iPhone</translation>
 <translation id="4663373278480897665">Доступ к камере разрешен</translation>
@@ -2345,6 +2365,7 @@
 <translation id="4724450788351008910">Изменение принадлежности</translation>
 <translation id="4725511304875193254">Корги</translation>
 <translation id="4726710629007580002">При установке расширения возникли предупреждения:</translation>
+<translation id="4727847987444062305">Управляемый гостевой сеанс</translation>
 <translation id="4728558894243024398">Платформа</translation>
 <translation id="4733082559415072992">Сайт <ph name="URL" /> запрашивает данные о местоположении вашего устройства.</translation>
 <translation id="4733793249294335256">Папка</translation>
@@ -2454,6 +2475,7 @@
 <translation id="488785315393301722">Показать сведения</translation>
 <translation id="4890773143211625964">Показать дополнительные настройки принтера</translation>
 <translation id="4891089016822695758">Форум бета-версии</translation>
+<translation id="4892229439761351791">Сайт может использовать устройство Bluetooth</translation>
 <translation id="4893336867552636863">Все данные о работе в браузере будут удалены с устройства.</translation>
 <translation id="4893522937062257019">Экран блокировки</translation>
 <translation id="4898011734382862273">Сертификат "<ph name="CERTIFICATE_NAME" />" представляет центр сертификации</translation>
@@ -2629,6 +2651,8 @@
 <translation id="5187295959347858724">Вы вошли в <ph name="SHORT_PRODUCT_NAME" />. Ваши закладки, история и другие настройки синхронизируются с аккаунтом Google.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> хочет скачать несколько файлов</translation>
+<translation id="5192316339598592690">Быстро переключайтесь между аккаунтами и выполняйте вход сразу на нескольких сайтах и в разных приложениях.
+    Приложения и сайты могут запрашивать разрешение на использование некоторых ваших данных из аккаунта Google. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">Сбросьте настройки устройства и повторите попытку.</translation>
 <translation id="5204967432542742771">Введите пароль</translation>
 <translation id="5206215183583316675">Удалить "<ph name="CERTIFICATE_NAME" />"?</translation>
@@ -3513,6 +3537,7 @@
 <translation id="6547354035488017500">Чтобы устройство работало, требуется как минимум 512 МБ свободного пространства. Рекомендуем удалить файлы, хранящиеся на устройстве.</translation>
 <translation id="6550675742724504774">Параметры</translation>
 <translation id="6551508934388063976">Команда недоступна. Нажмите Ctrl + N, чтобы открыть новое окно.</translation>
+<translation id="6551612971599078809">Сайт использует USB-устройство</translation>
 <translation id="655384502888039633">Пользователей: <ph name="USER_COUNT" /></translation>
 <translation id="655483977608336153">Повторить</translation>
 <translation id="6555432686520421228">Удалить все пользовательские аккаунты и восстановить заводские настройки на устройстве <ph name="IDS_SHORT_PRODUCT_NAME" />.</translation>
@@ -3736,6 +3761,7 @@
 <translation id="692114467174262153">Не удалось открыть <ph name="ALTERNATIVE_BROWSER_NAME" /></translation>
 <translation id="6921709132208495314">Остановить загрузку страницы</translation>
 <translation id="6922128026973287222">Расширение "Экономия трафика" от Google помогает быстрее просматривать веб-страницы и расходовать меньше трафика. Нажмите здесь, чтобы узнать подробности.</translation>
+<translation id="6922745772873733498">Чтобы запустить печать, введите PIN-код</translation>
 <translation id="6923132443355966645">Прокрутить/нажать</translation>
 <translation id="6923633482430812883">Ошибка. Убедитесь, что файловый сервер, к которому вы пытаетесь подключиться, поддерживает протокол SMB версии 2 или выше.</translation>
 <translation id="6930036377490597025">Внешний электронный ключ или встроенный датчик</translation>
@@ -3790,6 +3816,7 @@
 <translation id="7003339318920871147">Базы данных в Интернете</translation>
 <translation id="7003723821785740825">Настроить разблокировку с помощью отпечатка</translation>
 <translation id="7003844668372540529">Неизвестный продукт <ph name="PRODUCT_ID" /> от <ph name="VENDOR_NAME" /></translation>
+<translation id="7004402701596653846">Сайт может использовать устройство MIDI</translation>
 <translation id="7004499039102548441">Недавние вкладки</translation>
 <translation id="7005848115657603926">Недопустимый диапазон страниц. Используйте <ph name="EXAMPLE_PAGE_RANGE" /></translation>
 <translation id="7006634003215061422">Нижнее поле</translation>
@@ -3805,6 +3832,7 @@
 <translation id="7022562585984256452">Главная страница настроена.</translation>
 <translation id="7025190659207909717">Управление передачей данных в мобильных сетях</translation>
 <translation id="7029809446516969842">Пароли</translation>
+<translation id="7031608529463141342">К вкладке <ph name="WINDOW_TITLE" /> подключен последовательный порт</translation>
 <translation id="7031962166228839643">Выполняется подготовка доверенного платформенного модуля (может занять несколько минут)...</translation>
 <translation id="7037509989619051237">Образец голоса</translation>
 <translation id="7039326228527141150">Доступ к USB-устройствам от <ph name="VENDOR_NAME" /></translation>
@@ -3829,6 +3857,7 @@
 <translation id="706626672220389329">Ошибка. Указанный ресурс уже подключен.</translation>
 <translation id="7066944511817949584">Не удалось подключиться к устройству "<ph name="DEVICE_NAME" />".</translation>
 <translation id="7067725467529581407">Больше не показывать</translation>
+<translation id="7069811530847688087">Сайту <ph name="WEBSITE" /> может потребоваться более новая модель или другой тип электронного ключа.</translation>
 <translation id="7070484045139057854">Расширение может получать доступ к данным сайта и изменять их</translation>
 <translation id="7072010813301522126">Название ярлыка</translation>
 <translation id="707392107419594760">Выберите раскладку:</translation>
@@ -3909,6 +3938,7 @@
 <translation id="7189234443051076392">Убедитесь, что на вашем устройстве достаточно свободного места.</translation>
 <translation id="7189965711416741966">Отпечаток добавлен.</translation>
 <translation id="7191159667348037">Неизвестный принтер (USB)</translation>
+<translation id="7193051357671784796">Это приложение добавила ваша организация. Перезапустите его, чтобы завершить установку.</translation>
 <translation id="7193374945610105795">Для сайта <ph name="ORIGIN" /> нет сохраненных паролей</translation>
 <translation id="7196913789568937443">Резервное копирование на Google Диск. Позволяет в любой момент восстановить данные (в том числе данные приложений) или перенести их на новое устройство. Резервные копии загружаются в Google и шифруются с помощью пароля вашего аккаунта Google. <ph name="BEGIN_LINK1" />Подробнее…<ph name="END_LINK1" /></translation>
 <translation id="7197190419934240522">Помогите Поиску и другим сервисам Google узнать вас лучше!</translation>
@@ -4331,6 +4361,7 @@
     <ph name="BR" />
     <ph name="BEGIN_BOLD" />Примечание.<ph name="END_BOLD" /> Система перезагрузится во время этого процесса.</translation>
 <translation id="7829298379596169484">Доступ к аудиовходу</translation>
+<translation id="7830594666202422257">Подключить к Linux</translation>
 <translation id="7831491651892296503">Ошибка при настройке сети</translation>
 <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation>
 <translation id="7832084384634357321">Время окончания</translation>
@@ -4360,6 +4391,7 @@
 <translation id="7877451762676714207">Обнаружена неизвестная ошибка сервера. Повторите попытку или свяжитесь с его администратором.</translation>
 <translation id="7877680364634660272">Обзор возможностей</translation>
 <translation id="7878562273885520351">Злоумышленники могли узнать ваш пароль</translation>
+<translation id="7880823633812189969">Локальные данные будут удалены после перезапуска</translation>
 <translation id="7881483672146086348">Просмотреть аккаунт</translation>
 <translation id="7882358943899516840">Тип провайдера</translation>
 <translation id="7885253890047913815">Недавние места назначения</translation>
@@ -4698,6 +4730,7 @@
 <translation id="8426713856918551002">Включение</translation>
 <translation id="8427292751741042100">встроено на любом хосте</translation>
 <translation id="8428213095426709021">Настройки</translation>
+<translation id="8428628598981198790">Невозможно использовать электронный ключ для этого сайта</translation>
 <translation id="84297032718407999">Выход из системы произойдет через <ph name="LOGOUT_TIME_LEFT" /></translation>
 <translation id="8431190899827883166">Визуальный отклик</translation>
 <translation id="8431909052837336408">Изменение PIN-кода SIM-карты</translation>
@@ -4902,6 +4935,7 @@
 <translation id="8732212173949624846">Чтение и изменение истории просмотров на всех устройствах, где вы используете этот аккаунт</translation>
 <translation id="8732844209475700754">Остальные настройки конфиденциальности, безопасности и сбора данных</translation>
 <translation id="8734073480934656039">Если вы включите эту опцию, киоск-приложения смогут запускаться автоматически при включении компьютера</translation>
+<translation id="8734671092194994316">На вашем электронном ключе останется запись о посещении сайта <ph name="WEBSITE" />.</translation>
 <translation id="873545264931343897">После обновления плагина "<ph name="PLUGIN_NAME" />" перезагрузите страницу, чтобы активировать его</translation>
 <translation id="8736288397686080465">Этот сайт был обновлен в фоновом режиме</translation>
 <translation id="8737685506611670901">обработку всех ссылок типа "<ph name="PROTOCOL" />" вместо сервиса <ph name="REPLACED_HANDLER_TITLE" /></translation>
@@ -5000,6 +5034,7 @@
 <translation id="8877448029301136595">[родительский каталог]</translation>
 <translation id="8879284080359814990">Показать как вкладку</translation>
 <translation id="8883847527783433352">Синхронизировать с другим аккаунтом</translation>
+<translation id="8884570509232205463">Теперь устройство будет блокироваться в <ph name="UNLOCK_TIME" />.</translation>
 <translation id="8885197664446363138">Функция Smart Lock недоступна</translation>
 <translation id="8888253246822647887">Приложение откроется, когда завершится обновление. Это может занять несколько минут.</translation>
 <translation id="8888432776533519951">Цвет:</translation>
@@ -5092,6 +5127,7 @@
 <translation id="9026852570893462412">Подождите несколько минут. Скачивание виртуальной машины…</translation>
 <translation id="9027459031423301635">Открыть ссылку в новой вкладке</translation>
 <translation id="9030515284705930323">Приложение "Play Маркет" отключено для вашего аккаунта. За дополнительными сведениями обратитесь к администратору.</translation>
+<translation id="9030785788945687215">Gmail</translation>
 <translation id="9033857511263905942">&amp;Вставить</translation>
 <translation id="9037965129289936994">Показать оригинал</translation>
 <translation id="9038649477754266430">Использовать подсказки для ускорения загрузки страниц</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb
index 5396811..e2ea0556 100644
--- a/chrome/app/resources/generated_resources_sk.xtb
+++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -2075,7 +2075,6 @@
 <translation id="42126664696688958">Exportovať</translation>
 <translation id="42137655013211669">Server zakázal prístup k tomuto zdroju</translation>
 <translation id="4215350869199060536">Hops, v mene sú nepovolené symboly!</translation>
-<translation id="4222932583846282852">Ruší sa...</translation>
 <translation id="4225397296022057997">Na všetkých weboch</translation>
 <translation id="4235200303672858594">Celá obrazovka</translation>
 <translation id="4235965441080806197">Zrušiť prihlasovanie</translation>
@@ -3828,7 +3827,6 @@
 <translation id="7017480957358237747">povoliť alebo zakázať konkrétne webové stránky,</translation>
 <translation id="7018275672629230621">Čítať a upravovať históriu prehliadania</translation>
 <translation id="7019805045859631636">Rýchle</translation>
-<translation id="702252130983202758">Vaše aplikácie</translation>
 <translation id="7022562585984256452">Vaša domovská stránka bola nastavená.</translation>
 <translation id="7025190659207909717">Správa mobilnej dátovej služby</translation>
 <translation id="7029809446516969842">Heslá</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb
index 50b450ee..9bd12841 100644
--- a/chrome/app/resources/generated_resources_sl.xtb
+++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -2077,7 +2077,6 @@
 <translation id="42126664696688958">Izvozi</translation>
 <translation id="42137655013211669">Strežnik je onemogočil dostop do tega vira.</translation>
 <translation id="4215350869199060536">Ojoj, neveljavni znaki v imenu.</translation>
-<translation id="4222932583846282852">Preklic …</translation>
 <translation id="4225397296022057997">Na vseh spletnih mestih</translation>
 <translation id="4235200303672858594">Celoten zaslon</translation>
 <translation id="4235965441080806197">Prekliči prijavo</translation>
@@ -3832,7 +3831,6 @@
 <translation id="7017480957358237747">dovoljevanje ali prepoved nekaterih spletnih mest,</translation>
 <translation id="7018275672629230621">Branje in spreminjanje zgodovine brskanja</translation>
 <translation id="7019805045859631636">Hitro</translation>
-<translation id="702252130983202758">Vaše aplikacije</translation>
 <translation id="7022562585984256452">Domača stran je nastavljena.</translation>
 <translation id="7025190659207909717">Upravljanje mobilne podatkovne storitve</translation>
 <translation id="7029809446516969842">Gesla</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb
index ef8827ae..d4a48fc94 100644
--- a/chrome/app/resources/generated_resources_sr.xtb
+++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -2008,6 +2008,7 @@
 <translation id="409579654357498729">Додај у Cloud штампање</translation>
 <translation id="4096508467498758490">Онемогућите додатке у режиму програмера</translation>
 <translation id="4096824249111507322">Безбедносни модул је у припреми. Сачекајте (ово може да потраје неколико минута)...</translation>
+<translation id="4097560579602855702">Претражите Google</translation>
 <translation id="4099060993766194518">Желите да вратите подразумевани претраживач?</translation>
 <translation id="4099874310852108874">Дошло је до грешке на мрежи.</translation>
 <translation id="4100733287846229632">Простор на уређају је изузетно мали</translation>
@@ -2073,7 +2074,6 @@
 <translation id="42126664696688958">Извези</translation>
 <translation id="42137655013211669">Сервер је забранио приступ овом ресурсу.</translation>
 <translation id="4215350869199060536">Упс, имате недозвољене симболе у имену!</translation>
-<translation id="4222932583846282852">Отказује се...</translation>
 <translation id="4225397296022057997">На свим сајтовима</translation>
 <translation id="4235200303672858594">Цео екран</translation>
 <translation id="4235965441080806197">Откажи пријављивање</translation>
@@ -3828,7 +3828,6 @@
 <translation id="7017480957358237747">да дозволите или забраните одређене веб-сајтове,</translation>
 <translation id="7018275672629230621">Читање историје прегледања и мењање те историје</translation>
 <translation id="7019805045859631636">Брзо</translation>
-<translation id="702252130983202758">Апликације</translation>
 <translation id="7022562585984256452">Почетна страница је подешена.</translation>
 <translation id="7025190659207909717">Управљање услугом мобилног преноса података</translation>
 <translation id="7029809446516969842">Лозинке</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb
index 5ac6e38a..14663c6 100644
--- a/chrome/app/resources/generated_resources_sv.xtb
+++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -2076,7 +2076,6 @@
 <translation id="42126664696688958">Exportera</translation>
 <translation id="42137655013211669">Åtkomsten till den här resursen blockerades av servern.</translation>
 <translation id="4215350869199060536">Det finns ogiltiga symboler i namnet!</translation>
-<translation id="4222932583846282852">Avbryter …</translation>
 <translation id="4225397296022057997">På alla webbplatser</translation>
 <translation id="4235200303672858594">Helskärm</translation>
 <translation id="4235965441080806197">Avbryt inloggningen</translation>
@@ -3829,7 +3828,6 @@
 <translation id="7017480957358237747">tillåt eller förbjud vissa webbplatser,</translation>
 <translation id="7018275672629230621">Läsa och ändra din webbhistorik</translation>
 <translation id="7019805045859631636">Snabb</translation>
-<translation id="702252130983202758">Dina appar</translation>
 <translation id="7022562585984256452">Startsidan har ställts in.</translation>
 <translation id="7025190659207909717">Hantering av mobil datatjänst</translation>
 <translation id="7029809446516969842">Lösenord</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb
index 2d0ab13e..21cb3ead 100644
--- a/chrome/app/resources/generated_resources_sw.xtb
+++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -2003,6 +2003,7 @@
 <translation id="409579654357498729">Ongeza kwenye Printa ya Wingu</translation>
 <translation id="4096508467498758490">Zima viendelezi vya hali ya msanidi programu</translation>
 <translation id="4096824249111507322">Sehemu salama inaandaliwa, tafadhali subiri (huenda hatua hii ikachukua dakika chache)...</translation>
+<translation id="4097560579602855702">Tafuta kwenye Google</translation>
 <translation id="4099060993766194518">Ungependa kurejesha mtambo wa kutafuta chaguomsingi?</translation>
 <translation id="4099874310852108874">Hitilafu ya mtandao imetokea.</translation>
 <translation id="4100733287846229632">Hifadhi ya kifaa ni ndogo sana</translation>
@@ -2068,7 +2069,6 @@
 <translation id="42126664696688958">Hamisha</translation>
 <translation id="42137655013211669">Idhini ya kufikia rasilimali hii ilizuiwa na seva.</translation>
 <translation id="4215350869199060536">Lo!, alama batili katika jina!</translation>
-<translation id="4222932583846282852">Inaghairi...</translation>
 <translation id="4225397296022057997">Kwenye tovuti zote</translation>
 <translation id="4235200303672858594">Skrini Nzima</translation>
 <translation id="4235965441080806197">Ghairi kuingia katika akaunti</translation>
@@ -3821,7 +3821,6 @@
 <translation id="7017480957358237747">ruhusu au zuia tovuti fulani,</translation>
 <translation id="7018275672629230621">Kusoma na kubadilisha historia yako ya kuvinjari</translation>
 <translation id="7019805045859631636">Haraka</translation>
-<translation id="702252130983202758">Programu zako</translation>
 <translation id="7022562585984256452">Ukurasa wako wa mwanzo umewekwa.</translation>
 <translation id="7025190659207909717">Udhibiti wa huduma ya data ya simu ya mkononi</translation>
 <translation id="7029809446516969842">Manenosiri</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb
index 969f524..1a2979c 100644
--- a/chrome/app/resources/generated_resources_ta.xtb
+++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -140,7 +140,7 @@
 <translation id="1197979282329025000"><ph name="PRINTER_NAME" /> பிரிண்டர்க்கான, பிரிண்டர் திறன்களை மீட்டெடுக்கும்போது பிழை ஏற்பட்டது. இந்த அச்சுப் பொறியை <ph name="CLOUD_PRINT_NAME" /> உடன் பதிவு செய்யமுடியவில்லை.</translation>
 <translation id="119944043368869598">அனைத்தையும் அழி</translation>
 <translation id="1201402288615127009">அடுத்து</translation>
-<translation id="1202596434010270079">கியாஸ்க் பயன்பாடு புதுப்பிக்கப்பட்டது. USB சாதனத்தை அகற்றவும்.</translation>
+<translation id="1202596434010270079">கியாஸ்க் ஆப்ஸ் புதுப்பிக்கப்பட்டது. USB சாதனத்தை அகற்றவும்.</translation>
 <translation id="120368089816228251">இசைக் குறிப்பு</translation>
 <translation id="1205489148908752564">ஏற்புபட்டியல் பயனர்களைப் படிக்கலாம் மற்றும் மாற்றலாம்</translation>
 <translation id="1206407435587370571">உங்கள் Chromebookஐப் பற்றி அறிந்துகொள்ளுங்கள்</translation>
@@ -613,7 +613,7 @@
 <translation id="1954813140452229842">பகிர்வை ஏற்றுவதில் பிழை. உங்கள் அனுமதிச் சான்றுகளைச் சரிபார்த்து, மீண்டும் முயலவும்.</translation>
 <translation id="1956050014111002555">இந்தக் கோப்பில் பல சான்றிதழ்கள் உள்ளன, அவற்றில் எதுவும் இறக்குமதி செய்யப்படவில்லை:</translation>
 <translation id="1956390763342388273">இதைச் செய்தால், "<ph name="FOLDER_PATH" />" இல் உள்ள அனைத்துக் கோப்புகளும் பதிவேற்றப்படும். தளத்தை நம்பினால் மட்டுமே இதைச் செய்யவும்.</translation>
-<translation id="1962233722219655970">உங்கள் கணினியில் பணியாற்றாத நேட்டிவ் க்ளையன்ட் பயன்பாட்டை இந்தப் பக்கம் பயன்படுத்துகிறது.</translation>
+<translation id="1962233722219655970">உங்கள் கணினியில் பணியாற்றாத நேட்டிவ் க்ளையன்ட் ஆப்ஸை இந்தப் பக்கம் பயன்படுத்துகிறது.</translation>
 <translation id="1963227389609234879">அனைத்தையும் அகற்று</translation>
 <translation id="1965624977906726414">எந்தச் சிறப்பு அனுமதிகளும் இல்லை.</translation>
 <translation id="1969654639948595766">WebRTC உரைப் பதிவுகள் (<ph name="WEBRTC_TEXT_LOG_COUNT" />)</translation>
@@ -842,7 +842,7 @@
 <translation id="2322193970951063277">மேற்குறிப்புகளும் அடிக்குறிப்புகளும்</translation>
 <translation id="2322318151094136999">ஒரு தளம் சீரியல் போர்ட்டுகளை அணுக வேண்டியிருக்கும்போது கேள் (பரிந்துரைக்கப்படுகிறது)</translation>
 <translation id="2326931316514688470">&amp;பயன்பாட்டை மீண்டும் ஏற்று</translation>
-<translation id="2327492829706409234">பயன்பாட்டை இயக்கு</translation>
+<translation id="2327492829706409234">ஆப்ஸை இயக்கு</translation>
 <translation id="2329597144923131178">உங்கள் எல்லா சாதனங்களிலும் புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகளைப் பெற உள்நுழையவும்.</translation>
 <translation id="2332131598580221120">அங்காடியில் காட்டு</translation>
 <translation id="2332192922827071008">விருப்பத்தேர்வுகளைத் திற</translation>
@@ -857,8 +857,8 @@
 <translation id="2344028582131185878">தானியக்கப் பதிவிறக்கங்கள்</translation>
 <translation id="2345723121311404059">1 பக்கம் - <ph name="PRINTER_NAME" /></translation>
 <translation id="2347644257713614136">Hangouts மற்றும் Cast for Education ஆகியவற்றின் பயன்பாடு, Google தனியுரிமைக் கொள்கையால் நிர்வகிக்கப்படுகிறது.</translation>
-<translation id="2348176352564285430">பயன்பாடு: <ph name="ARC_PROCESS_NAME" /></translation>
-<translation id="2350182423316644347">பயன்பாட்டை தொடங்குகிறது...</translation>
+<translation id="2348176352564285430">ஆப்ஸ்: <ph name="ARC_PROCESS_NAME" /></translation>
+<translation id="2350182423316644347">ஆப்ஸை தொடங்குகிறது...</translation>
 <translation id="2350796302381711542">எல்லா <ph name="PROTOCOL" /> இணைப்புகளையும் திறக்க, <ph name="REPLACED_HANDLER_TITLE" /> க்குப் பதிலாக <ph name="HANDLER_HOSTNAME" /> ஐ அனுமதிக்கவா?</translation>
 <translation id="2351266942280602854">மொழியும் உள்ளீடும்</translation>
 <translation id="2352662711729498748">&lt; 1 மெ.பை.</translation>
@@ -1317,7 +1317,7 @@
 <translation id="3060379269883947824">பேசும் திரையை இயக்கு</translation>
 <translation id="3061707000357573562">பேட்ச் சேவை</translation>
 <translation id="3065041951436100775">தாவல் நிறுத்தப்பட்டது பற்றிய கருத்து.</translation>
-<translation id="3067198179881736288">பயன்பாட்டை நிறுவவா?</translation>
+<translation id="3067198179881736288">ஆப்ஸை நிறுவவா?</translation>
 <translation id="3067198360141518313">இந்தச் செருகுநிரலை இயக்கு</translation>
 <translation id="3071624960923923138">புதிய தாவலைத் திறக்க, இங்கே கிளிக் செய்யவும்</translation>
 <translation id="3074037959626057712">உள்நுழைந்து, ஒத்திசைவை இயக்கியுள்ளீர்கள்</translation>
@@ -1378,7 +1378,7 @@
 <translation id="3157931365184549694">மீட்டமை</translation>
 <translation id="3158033540161634471">உங்கள் கைரேகையை அமைக்கவும்</translation>
 <translation id="3160842278951476457"><ph name="ISSUED_BY" /> [<ph name="ISSUED_TO" />] (வன்பொருளில் சேமிக்கப்பட்டிருக்கும்)</translation>
-<translation id="316125635462764134">பயன்பாட்டை அகற்று</translation>
+<translation id="316125635462764134">ஆப்ஸை அகற்று</translation>
 <translation id="3161522574479303604">எல்லா மொழிகளும்</translation>
 <translation id="3163201441334626963"><ph name="VENDOR_ID" /> அனுப்பிய <ph name="PRODUCT_ID" /> தயாரிப்பை அறிய முடியவில்லை.</translation>
 <translation id="3165390001037658081">சில தொலைத்தொடர்பு நிறுவனங்கள் இந்த அம்சத்தைத் தடுக்கலாம்.</translation>
@@ -1814,7 +1814,7 @@
 <translation id="3831436149286513437">Google இயக்ககத் தேடல் பரிந்துரைகள்</translation>
 <translation id="3831486154586836914">சாளர மேலோட்ட பயன்முறைக்குள் நுழைந்துவிட்டீர்கள்</translation>
 <translation id="383161972796689579">இந்தச் சாதனத்தில் புதியவர்கள் சேர்க்கப்படுவதை இதன் உரிமையாளர் முடக்கியுள்ளார்</translation>
-<translation id="3834775135533257713">"<ph name="TO_INSTALL_APP_NAME" />" பயன்பாடு "<ph name="INSTALLED_APP_NAME" />" உடன் முரண்படுவதால், அதைச் சேர்க்க முடியவில்லை.</translation>
+<translation id="3834775135533257713">"<ph name="TO_INSTALL_APP_NAME" />" ஆப்ஸ் "<ph name="INSTALLED_APP_NAME" />" உடன் முரண்படுவதால், அதைச் சேர்க்க முடியவில்லை.</translation>
 <translation id="3835522725882634757">அச்சச்சோ!!! <ph name="PRODUCT_NAME" /> ஆல் புரிந்துகொள்ள முடியாத தரவைச் சேவையகம் அனுப்பிக்கொண்டிருக்கிறது. தயவுசெய்து <ph name="BEGIN_LINK" />பிழை எனப் புகாரளித்து<ph name="END_LINK" />, <ph name="BEGIN2_LINK" />மாற்றப்படாத பட்டியலைச்<ph name="END2_LINK" /> சேர்த்திடுங்கள்.</translation>
 <translation id="3838085852053358637">நீட்டிப்பை ஏற்ற முடியவில்லை</translation>
 <translation id="3838486795898716504">மேலும் <ph name="PAGE_TITLE" /></translation>
@@ -1861,7 +1861,7 @@
 <translation id="3899879303189199559">ஒரு வருடத்திற்கும் மேலாக ஆஃப்லைனில் உள்ளது</translation>
 <translation id="3900966090527141178">கடவுச்சொற்களை ஏற்று</translation>
 <translation id="3901991538546252627"><ph name="NAME" /> க்கு இணைக்கிறது</translation>
-<translation id="3905761538810670789">பயன்பாட்டை பழுதுநீக்கு</translation>
+<translation id="3905761538810670789">ஆப்ஸை பழுதுநீக்கு</translation>
 <translation id="3908393983276948098"><ph name="PLUGIN_NAME" /> காலாவதியாகிவிட்டது</translation>
 <translation id="3908501907586732282">நீட்டிப்பை இயக்கு</translation>
 <translation id="3909477809443608991">பாதுகாக்கப்பட்ட உள்ளடக்கத்தை <ph name="URL" /> இயக்க விரும்புகிறது. உங்கள் சாதனத்தின் அடையாளத்தை Google சரிபார்க்கும், சாதன அடையாளத்தை இந்தத் தளம் அணுகக்கூடும்.</translation>
@@ -2059,7 +2059,6 @@
 <translation id="42126664696688958">ஏற்றுமதி செய்</translation>
 <translation id="42137655013211669">இந்த ஆதாரத்திற்கான அணுகல் சேவையகத்தால் தடுக்கப்பட்டிருக்கிறது.</translation>
 <translation id="4215350869199060536">அச்சச்சோ, பெயரில் சட்டவிரோத சின்னங்கள் உள்ளன!</translation>
-<translation id="4222932583846282852">ரத்துசெய்கிறது...</translation>
 <translation id="4225397296022057997">எல்லாத் தளங்களிலும்</translation>
 <translation id="4235200303672858594">திரை முழுவதும்</translation>
 <translation id="4235965441080806197">உள்நுழைவை ரத்துசெய்</translation>
@@ -2283,7 +2282,7 @@
 <translation id="4619615317237390068">பிற சாதனங்களின் தாவல்கள்</translation>
 <translation id="4620809267248568679">இந்த அமைப்பு நீட்டிப்பால் செயல்படுத்தப்படுகிறது.</translation>
 <translation id="4623189117674524348">இந்தச் சாதனத்திற்கான API அணுகலை சிஸ்டத்தால் அங்கீகரிக்க முடியவில்லை.</translation>
-<translation id="4625078469366263107">பயன்பாட்டை இயக்கு</translation>
+<translation id="4625078469366263107">ஆப்ஸை இயக்கு</translation>
 <translation id="4627427111733173920">குக்கீகள் தடுக்கப்பட்டன</translation>
 <translation id="4627442949885028695">மற்றொரு சாதனத்திலிருந்து பார்த்தவை</translation>
 <translation id="4628757576491864469">சாதனங்கள்</translation>
@@ -2499,7 +2498,7 @@
 <translation id="4964455510556214366">ஒழுங்கமைவு</translation>
 <translation id="4964673849688379040">சரிபார்க்கிறது...</translation>
 <translation id="4965808351167763748">Hangouts Meetஐ இயக்க, இந்தச் சாதனத்தை நிச்சயமாக அமைக்க விரும்புகிறீர்களா?</translation>
-<translation id="496888482094675990">Google இயக்ககம், வெளிப்புறச் சேமிப்பகம் அல்லது உங்கள் Chrome OS சாதனத்தில் சேமித்துள்ள கோப்புகளுக்கான விரைவான அணுகலைக் கோப்புகள் பயன்பாடு வழங்குகிறது.</translation>
+<translation id="496888482094675990">Google இயக்ககம், வெளிப்புறச் சேமிப்பகம் அல்லது உங்கள் Chrome OS சாதனத்தில் சேமித்துள்ள கோப்புகளுக்கான விரைவான அணுகலைக் கோப்புகள் ஆப்ஸ் வழங்குகிறது.</translation>
 <translation id="4971412780836297815">முடிந்ததும் திற</translation>
 <translation id="4972129977812092092">பிரிண்டரின் தகவலை மாற்று</translation>
 <translation id="4972164225939028131">தவறான கடவுச்சொல்</translation>
@@ -2651,7 +2650,7 @@
 <translation id="5233638681132016545">புதிய தாவல்</translation>
 <translation id="5233736638227740678">&amp;ஒட்டு</translation>
 <translation id="5234764350956374838">நிராகரி</translation>
-<translation id="5235050375939235066">பயன்பாட்டை நிறுவல் நீக்கவா?</translation>
+<translation id="5235050375939235066">ஆப்ஸை நிறுவல் நீக்கவா?</translation>
 <translation id="5235750401727657667">புதிய தாவலைத் திறக்கும் போது காண்பிக்கப்படும் பக்கத்தை மாற்று</translation>
 <translation id="5238278114306905396">பயன்பாட்டின் "<ph name="EXTENSION_NAME" />" ஆனது தானாக அகற்றப்பட்டது.</translation>
 <translation id="5238369540257804368">நோக்கங்கள்</translation>
@@ -2659,7 +2658,7 @@
 <translation id="5242724311594467048">"<ph name="EXTENSION_NAME" />" ஐ இயக்கவா?</translation>
 <translation id="5243522832766285132">ஒரு சில வினாடிகளில் மீண்டும் முயலவும்</translation>
 <translation id="5244474230056479698"><ph name="EMAIL" />க்கு ஒத்திசைக்கிறது</translation>
-<translation id="5246282308050205996"><ph name="APP_NAME" /> செயலிழந்தது. பயன்பாட்டை மறுதொடக்கம் செய்ய இந்த பலூனைக் கிளிக் செய்க.</translation>
+<translation id="5246282308050205996"><ph name="APP_NAME" /> செயலிழந்தது. ஆப்ஸை மறுதொடக்கம் செய்ய இந்த பலூனைக் கிளிக் செய்க.</translation>
 <translation id="5247051749037287028">காட்சிப் பெயர் (விரும்பினால்)</translation>
 <translation id="5249624017678798539">பதிவிறக்கம் நிறைவுபெறுவதற்கு முன்பாகவே உலாவி சிதைவுற்றது.</translation>
 <translation id="5250372599208556903">உள்ளூர் உள்ளடக்கத்தை வழங்க, <ph name="SEARCH_ENGINE_NAME" /> உங்கள் இருப்பிடத்தைப் பயன்படுத்தும். இதை <ph name="SETTINGS_LINK" /> என்பதில் மாற்றலாம்.</translation>
@@ -2673,7 +2672,7 @@
 <translation id="5260508466980570042">மன்னிக்கவும், உங்கள் மின்னஞ்சலையும் கடவுச்சொல்லையும் சரிபார்க்க முடியவில்லை. தயவுசெய்து மீண்டும் முயற்சி செய்க.</translation>
 <translation id="5261683757250193089">இணைய அங்காடியில் திற</translation>
 <translation id="5264148714798105376">இதற்கு ஒரு நிமிடம் அல்லது அதற்கும் மேல் ஆகலாம்.</translation>
-<translation id="5264252276333215551">உங்கள் பயன்பாட்டை கியோஸ்க் பயன்முறையில் தொடங்க இணையத்துடன் இணைக்கவும்.</translation>
+<translation id="5264252276333215551">உங்கள் ஆப்ஸை கியோஸ்க் பயன்முறையில் தொடங்க இணையத்துடன் இணைக்கவும்.</translation>
 <translation id="5265562206369321422">ஒரு வாரத்திற்கும் மேலாக ஆஃப்லைனில் உள்ளது</translation>
 <translation id="5265797726250773323">நிறுவும்போது பிழை நேர்ந்தது</translation>
 <translation id="5266113311903163739">சான்றளிக்கும் மைய இறக்குமதி பிழை</translation>
@@ -2904,14 +2903,14 @@
 <translation id="5605623530403479164">பிற தேடல் இன்ஜின்கள்</translation>
 <translation id="5605758115928394442">அது நீங்கள்தான் என்பதை உறுதிப்படுத்த உங்கள் ஃபோனுக்கு ஓர் அறிவிப்பு அனுப்பப்பட்டுள்ளது.</translation>
 <translation id="5608580678041221894">செதுக்கும் பகுதியைச் சரிசெய்ய அல்லது நகர்த்த, பின்வரும் விசைகளைத் தட்டவும்</translation>
-<translation id="5609231933459083978">பயன்பாடு தவறானது என்பதுபோல் தெரிகிறது.</translation>
+<translation id="5609231933459083978">ஆப்ஸ் தவறானது என்பதுபோல் தெரிகிறது.</translation>
 <translation id="5610038042047936818">கேமரா பயன்முறைக்கு மாறு</translation>
 <translation id="5612720917913232150"><ph name="URL" /> உங்கள் கணினியின் இருப்பிடத்தைப் பயன்படுத்த விரும்புகிறது</translation>
 <translation id="5612734644261457353">மன்னிக்கவும், உங்கள் கடவுச்சொல் இன்னும் சரிபார்க்கப்படவில்லை. குறிப்பு: உங்கள் கடவுச்சொல்லை சமீபத்தில் மாற்றியிருந்தால், நீங்கள் வெளியேறியவுடன் புதிய கடவுச்சொல் செயல்படுத்தப்படும், இங்கு பழைய கடவுச்சொல்லைப் பயன்படுத்தவும்.</translation>
 <translation id="5614190747811328134">பயனர் அறிவிப்பு</translation>
 <translation id="5614553682702429503">கடவுச்சொல்லைச் சேமிக்கவா?</translation>
 <translation id="561698261642843490">Firefoxஐ மூடு</translation>
-<translation id="5618075537869101857">அச்சோ, Kiosk பயன்பாட்டை தொடங்க முடியவில்லை.</translation>
+<translation id="5618075537869101857">அச்சோ, Kiosk ஆப்ஸை தொடங்க முடியவில்லை.</translation>
 <translation id="5618333180342767515">(இதற்கு சில நிமிடங்கள் ஆகக்கூடும்)</translation>
 <translation id="56197088284879152">பின்வரும் தொலைநிலைச் சாதனத்திற்கான இணைப்பு நெரிசலாக உள்ளது: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="5620568081365989559"><ph name="FOLDER_PATH" />க்கான முழு அணுகலை DevTools கோருகிறது.
@@ -3152,7 +3151,7 @@
 <translation id="598472838394900788">{0,plural, =1{மறைநிலை}other{மறைநிலை (#)}}</translation>
 <translation id="5985458664595100876">தவறான URL வடிவமைப்பு. ஆதரிக்கப்படும் வடிவமைப்புகள்: \\server\share, smb://server/share.</translation>
 <translation id="5990386583461751448">மொழிபெயர்க்கப்பட்டது</translation>
-<translation id="599131315899248751">{NUM_APPLICATIONS,plural, =1{இணையத்தில் உங்களால் தொடர்ந்து உலாவ முடிய வேண்டுமானால், இந்தப் பயன்பாட்டை அகற்றும்படி உங்கள் நிர்வாகியிடம் தெரிவிக்கவும்.}other{இணையத்தில் உங்களால் தொடர்ந்து உலாவ முடிய வேண்டுமானால், இந்தப் பயன்பாடுகளை அகற்றும்படி உங்கள் நிர்வாகியிடம் தெரிவிக்கவும்.}}</translation>
+<translation id="599131315899248751">{NUM_APPLICATIONS,plural, =1{இணையத்தில் உங்களால் தொடர்ந்து உலாவ முடிய வேண்டுமானால், இந்த ஆப்ஸை அகற்றும்படி உங்கள் நிர்வாகியிடம் தெரிவிக்கவும்.}other{இணையத்தில் உங்களால் தொடர்ந்து உலாவ முடிய வேண்டுமானால், இந்தப் பயன்பாடுகளை அகற்றும்படி உங்கள் நிர்வாகியிடம் தெரிவிக்கவும்.}}</translation>
 <translation id="5997337190805127100">தள அணுகலைப் பற்றி மேலும் அறிக</translation>
 <translation id="6000758707621254961">'<ph name="SEARCH_TEXT" />'க்கு <ph name="RESULT_COUNT" /> முடிவுகள் உள்ளன</translation>
 <translation id="6002458620803359783">விருப்பமான குரல்கள்</translation>
@@ -3172,7 +3171,7 @@
 <translation id="6022705094403139349">பாதுகாப்பு விசையை இணைக்கத் தயாரா?</translation>
 <translation id="6023643151125006053">இந்தச் சாதனம் (SN: <ph name="SERIAL_NUMBER" />), <ph name="SAML_DOMAIN" /> நிர்வாகியால் பூட்டப்பட்டது.</translation>
 <translation id="6025215716629925253">அடுக்கின் அடையாளம்</translation>
-<translation id="6026047032548434446">பயன்பாட்டை நிறுவவா?</translation>
+<translation id="6026047032548434446">ஆப்ஸை நிறுவவா?</translation>
 <translation id="6026819612896463875"><ph name="WINDOW_TITLE" /> - USB சாதனம் இணைக்கப்பட்டது</translation>
 <translation id="6029027682598229313">Linux நிறுவல் முடிந்தது.</translation>
 <translation id="6029292188939175871">[<ph name="FINGERPRINT_NAME" />]ஐ நீக்கு, பட்டன்</translation>
@@ -3231,7 +3230,7 @@
 <translation id="6096326118418049043">X.500 பெயர்</translation>
 <translation id="6097480669505687979">போதுமான இடத்தைக் காலியாக்கவில்லை எனில், பயனர்களும் தரவும் தானாகவே அகற்றப்படலாம்.</translation>
 <translation id="6100736666660498114">தொடக்க மெனு</translation>
-<translation id="6101226222197207147">புதிய பயன்பாடு சேர்க்கப்பட்டது (<ph name="EXTENSION_NAME" />)</translation>
+<translation id="6101226222197207147">புதிய ஆப்ஸ் சேர்க்கப்பட்டது (<ph name="EXTENSION_NAME" />)</translation>
 <translation id="6103681770816982672">எச்சரிக்கை: டெவெலப்பர் சேனலுக்கு மாறுகிறீர்கள்</translation>
 <translation id="6104068876731806426">Google கணக்குகள்</translation>
 <translation id="6104311680260824317">சாதனத்தை டொமைனில் சேர்க்க முடியவில்லை. குறிப்பிடப்பட்டுள்ள Kerberos என்க்ரிப்ஷன் வகைகளைச் சேவையகம் ஆதரிக்கவில்லை. என்க்ரிப்ஷன் அமைப்புகளுக்கு, “மேலும் விருப்பங்கள்” என்பதைப் பார்க்கவும்.</translation>
@@ -3487,7 +3486,7 @@
 <translation id="6504611359718185067">பிரிண்டரைச் சேர்க்க, இணையத்துடன் இணைக்கவும்</translation>
 <translation id="6506374932220792071">SHA-256 உடனான X9.62 ECDSA கையொப்பம்</translation>
 <translation id="6508248480704296122"><ph name="NAME_PH" /> உடன் தொடர்புடையது</translation>
-<translation id="6508261954199872201">பயன்பாடு: <ph name="APP_NAME" /></translation>
+<translation id="6508261954199872201">ஆப்ஸ்: <ph name="APP_NAME" /></translation>
 <translation id="6509207748479174212">மீடியா உரிமம்</translation>
 <translation id="6513247462497316522">நீங்கள் வேறு நெட்வொர்க்குடன் இணையாதபோது Google Chrome மொபைல் டேட்டாவைப் பயன்படுத்தும்.</translation>
 <translation id="6514010653036109809">இணைப்பதற்கு உள்ள சாதனம்:</translation>
@@ -3634,7 +3633,7 @@
 <translation id="674632704103926902">தட்டி இழுப்பதை இயக்கு</translation>
 <translation id="6748217015615267851">ரெண்டரர்: <ph name="RENDERER_URL" /></translation>
 <translation id="6748465660675848252">தொடர்ந்தாலும், ஒத்திசைக்கப்பட்ட தரவும் அமைப்புகளும் மட்டுமே மீட்டெடுக்கப்படும். சிஸ்டத்தின் அகத் தரவு முழுவதையும் இழப்பீர்கள்.</translation>
-<translation id="6748775883310276718">ஒற்றைப் பயன்பாடு கியோஸ்க்</translation>
+<translation id="6748775883310276718">ஒற்றைப் ஆப்ஸ் கியோஸ்க்</translation>
 <translation id="6751344591405861699"><ph name="WINDOW_TITLE" /> (மறைநிலை)</translation>
 <translation id="6757101664402245801">URL நகலெடுக்கப்பட்டது</translation>
 <translation id="6758056191028427665">எவ்வாறு செயல்படுகிறோம் என்பதை எங்களுக்குத் தெரிவிக்கவும்.</translation>
@@ -3694,7 +3693,7 @@
 <translation id="6845038076637626672">பெரிதாக்கப்பட்டதை திற</translation>
 <translation id="6845325883481699275">Chromeமின் பாதுகாப்பை மேம்படுத்த உதவுக</translation>
 <translation id="6848388270925200958">தற்போது, இந்தச் சாதனத்தில் மட்டுமே பயன்படுத்தக்கூடிய சில கார்டுகள் உள்ளன</translation>
-<translation id="6851497530878285708">பயன்பாடு இயக்கப்பட்டது</translation>
+<translation id="6851497530878285708">ஆப்ஸ் இயக்கப்பட்டது</translation>
 <translation id="6853388645642883916">புதுப்பிப்பான் செயலில் இல்லை</translation>
 <translation id="68541483639528434">பிற தாவல்களை மூடுக</translation>
 <translation id="6856623341093082836">டச்ஸ்கிரீனை அமைத்து, அதன் துல்லியத்தைச் சரிசெய்க</translation>
@@ -3719,7 +3718,7 @@
 <translation id="6896758677409633944">நகலெடு</translation>
 <translation id="6898440773573063262">இந்தச் சாதனத்தில் தானாகத் துவங்குவதற்கு, கியோஸ்க் பயன்பாடுகளைத் தற்போது உள்ளமைக்கலாம்.</translation>
 <translation id="6898699227549475383">நிறுவனம் (O)</translation>
-<translation id="6900284862687837908">பின்னணிப் பயன்பாடு: <ph name="BACKGROUND_APP_URL" /></translation>
+<translation id="6900284862687837908">பின்னணிப் ஆப்ஸ்: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6902066522699286937">மாதிரிக்காட்சிக் குரல்</translation>
 <translation id="6902837902700739466">சாதனத்தை டொமைனில் சேர்க்கவும்</translation>
 <translation id="6904344821472985372">கோப்பின் அணுகலை அகற்றுதல்</translation>
@@ -3985,7 +3984,7 @@
 <translation id="7297443947353982503">பயனர்பெயர்/கடவுச்சொல் தவறானது அல்லது EAP-அங்கீகாரம் தோல்வி</translation>
 <translation id="729761647156315797">மொழி &amp; விசைப்பலகையைத் தேர்ந்தெடுக்கவும்</translation>
 <translation id="7299337219131431707">விருந்தினர் உலாவலை இயக்கு</translation>
-<translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{Chrome சரியாக இயங்குவதிலிருந்து இந்த ஆப்ஸ் தடுக்கக்கூடும்.}other{Chrome சரியாக இயங்குவதிலிருந்து இந்த ஆப்ஸ்கள் தடுக்கக்கூடும்.}}</translation>
+<translation id="730289542559375723">{NUM_APPLICATIONS,plural, =1{Chrome சரியாக இயங்குவதிலிருந்து இந்த ஆப்ஸ் தடுக்கக்கூடும்.}other{Chrome சரியாக இயங்குவதிலிருந்து இந்த ஆப்ஸ் தடுக்கக்கூடும்.}}</translation>
 <translation id="7303281435234579599">அச்சச்சோ! டெமோ பயன்முறையை அமைக்கும்போது ஏதோ தவறாகிவிட்டது.</translation>
 <translation id="7303900363563182677">கிளிப்போர்டுக்கு நகலெடுத்த உரையையும் படங்களையும் பார்ப்பதிலிருந்து, இந்தத் தளம் தடைசெய்யப்பட்டுள்ளது</translation>
 <translation id="730515362922783851">அக நெட்வொர்க் அல்லது இணையத்தில் உள்ள எந்த சாதனத்துடனும் தரவைப் பரிமாறவும்</translation>
@@ -4091,7 +4090,7 @@
 <translation id="747459581954555080">எல்லாம் மீட்டெடு</translation>
 <translation id="7475671414023905704">Netscape தொலைந்த கடவுச்சொல் URL</translation>
 <translation id="7476454130948140105">பேட்டரி மிகவும் குறைவாக இருப்பதால், புதுப்பிக்க முடியவில்லை (<ph name="BATTERY_PERCENT" />%)</translation>
-<translation id="7478485216301680444">Kiosk பயன்பாட்டை நிறுவ முடியவில்லை.</translation>
+<translation id="7478485216301680444">Kiosk ஆப்ஸை நிறுவ முடியவில்லை.</translation>
 <translation id="7481312909269577407">அடுத்த பக்கம்</translation>
 <translation id="748138892655239008">சான்றிதழ் அடிப்படை கட்டுப்பாடுகள்</translation>
 <translation id="7487067081878637334">தொழில்நுட்பம்</translation>
@@ -4137,12 +4136,12 @@
 <translation id="7554791636758816595">புதிய தாவல்</translation>
 <translation id="7556033326131260574">Smart Lock ஆல் உங்கள் கணக்கைச் சரிபார்க்க முடியவில்லை. நுழைவதற்கு உங்கள் கடவுச்சொல்லை உள்ளிடவும்.</translation>
 <translation id="7556242789364317684">துரதிருஷ்டவசமாக, <ph name="SHORT_PRODUCT_NAME" /> ஆல் உங்கள் அமைப்புகளை மீட்க முடியவில்லை. பிழையைச் சரிசெய்வதற்கு, உங்கள் சாதனத்தை <ph name="SHORT_PRODUCT_NAME" /> பவர்வாஷ் மூலம் மீட்டமைக்க வேண்டும்.</translation>
-<translation id="7559719679815339381">காத்திருக்கவும்....கியாஸ்க் பயன்பாடு புதுப்பிக்கப்படுகிறது. USB சாதனத்தை அகற்றாதீர்கள்.</translation>
+<translation id="7559719679815339381">காத்திருக்கவும்....கியாஸ்க் ஆப்ஸ் புதுப்பிக்கப்படுகிறது. USB சாதனத்தை அகற்றாதீர்கள்.</translation>
 <translation id="7561196759112975576">எப்போதும்</translation>
 <translation id="7563991800558061108">இந்தப் பிழையிலிருந்து மீட்டமைக்க, உள்நுழைவுத் திரையிலிருந்து உங்கள் Google கணக்கில் உள்நுழைய வேண்டும். பின்னர் உங்கள் Google கணக்கிலிருந்து வெளியேறி, மேற்பார்வையிடப்படும் பயனரை மீண்டும் உருவாக்க முயற்சிக்கலாம்.</translation>
 <translation id="756445078718366910">உலாவி சாளரத்தைத் திற</translation>
 <translation id="7564847347806291057">செயலாக்கத்தை முடி</translation>
-<translation id="7566118625369982896">Play பயன்பாடு இணைப்புகளை நிர்வகி</translation>
+<translation id="7566118625369982896">Play ஆப்ஸ் இணைப்புகளை நிர்வகி</translation>
 <translation id="756809126120519699">Chrome தரவு அழிக்கப்பட்டது</translation>
 <translation id="7568790562536448087">புதுப்பிக்கிறது</translation>
 <translation id="7571643774869182231">புதுப்பிப்பதற்குப் போதுமான சேமிப்பிடம் இல்லை</translation>
@@ -4467,11 +4466,11 @@
 <translation id="8017679124341497925">ஷார்ட்கட் திருத்தப்பட்டது</translation>
 <translation id="8018313076035239964">இணையதளங்கள் என்ன தகவலைப் பயன்படுத்தலாம், என்ன உள்ளடக்கத்தைக் காட்டலாம் என்பதைக் கட்டுப்படுத்தலாம்</translation>
 <translation id="8023801379949507775">நீட்டிப்புகளை இப்போதே புதுப்பி</translation>
-<translation id="8024483450737722621">Google Play இலிருந்து பதிவிறக்கிய பயன்பாடுகள் இந்த Chromebook இலிருந்து நீக்கப்படும்.
+<translation id="8024483450737722621">Google Play இலிருந்து பதிவிறக்கிய ஆப்ஸ்கள் இந்த Chromebook இலிருந்து நீக்கப்படும்.
       <ph name="LINE_BREAKS1" />
-      திரைப்படங்கள், டிவி நிகழ்ச்சிகள், இசை, புத்தகங்கள் போன்ற நீங்கள் வாங்கிய உள்ளடக்கம் அல்லது பயன்பாடு சார்ந்த பிற வாங்குதல்களும் நீக்கப்படலாம்.
+      திரைப்படங்கள், டிவி நிகழ்ச்சிகள், இசை, புத்தகங்கள் போன்ற நீங்கள் வாங்கிய உள்ளடக்கம் அல்லது ஆப்ஸ் சார்ந்த பிற வாங்குதல்களும் நீக்கப்படலாம்.
       <ph name="LINE_BREAKS2" />
-      இதனால் பிற சாதனங்களில் உள்ள பயன்பாடுகள் அல்லது உள்ளடக்கம் பாதிக்கப்படாது.</translation>
+      இதனால் பிற சாதனங்களில் உள்ள ஆப்ஸ்கள் அல்லது உள்ளடக்கம் பாதிக்கப்படாது.</translation>
 <translation id="8026334261755873520">உலாவல் தரவை அழி</translation>
 <translation id="8028060951694135607">Microsoft Key Recovery</translation>
 <translation id="8028803902702117856"><ph name="SIZE" />, <ph name="FILE_NAME" />ஐப் பதிவிறக்குகிறது</translation>
@@ -4544,7 +4543,7 @@
 <translation id="8140778357236808512">ஏற்கனவே உள்ள மேற்பார்வையிடப்படும் பயனரை இறக்குமதிசெய்யவும்</translation>
 <translation id="8141584439523427891">மாற்று உலாவியில் இப்போது திறக்கிறது</translation>
 <translation id="8141725884565838206">உங்கள் கடவுச்சொற்களை நிர்வகிக்கவும்</translation>
-<translation id="8143442547342702591">தவறான பயன்பாடு</translation>
+<translation id="8143442547342702591">தவறான ஆப்ஸ்</translation>
 <translation id="8146177459103116374">இந்த சாதனத்தில் ஏற்கனவே பதிவுசெய்திருந்தால், <ph name="LINK2_START" />நடப்புப் பயனராக உள்நுழையலாம்<ph name="LINK2_END" />.</translation>
 <translation id="8146793085009540321">உள்நுழைய முடியவில்லை. உங்கள் நிர்வாகியைத் தொடர்புகொள்ளவும் அல்லது மீண்டும் முயலவும்.</translation>
 <translation id="8151638057146502721">உள்ளமை</translation>
@@ -4813,7 +4812,7 @@
 <translation id="8606726445206553943">MIDI சாதனங்களைப் பயன்படுத்தவும்</translation>
 <translation id="8609465669617005112">மேலே நகர்த்து</translation>
 <translation id="8610103157987623234">தவறான வடிவம், மீண்டும் முயலவும்</translation>
-<translation id="8615618338313291042">மறைநிலை பயன்பாடு: <ph name="APP_NAME" /></translation>
+<translation id="8615618338313291042">மறைநிலை ஆப்ஸ்: <ph name="APP_NAME" /></translation>
 <translation id="8619892228487928601"><ph name="CERTIFICATE_NAME" />: <ph name="ERROR" /></translation>
 <translation id="8620617069779373398">ரோமிங் நிலை</translation>
 <translation id="8620765578342452535">நெட்வொர்க் இணைப்புகளை உள்ளமைக்கவும்</translation>
@@ -4866,7 +4865,7 @@
 <translation id="8676374126336081632">உள்ளீட்டை அழி</translation>
 <translation id="8677212948402625567">அனைத்தையும் சுருக்கு...</translation>
 <translation id="8678648549315280022">பதிவிறக்க அமைப்புகளை நிர்வகிக்கவும்...</translation>
-<translation id="8678933587484842200">இந்தப் பயன்பாட்டை எப்படித் துவக்க விரும்புகிறீர்கள்?</translation>
+<translation id="8678933587484842200">இந்த ஆப்ஸை எப்படித் துவக்க விரும்புகிறீர்கள்?</translation>
 <translation id="8680251145628383637">உள்நுழைந்து, உங்கள் சாதனங்கள் எல்லாவற்றிலும் உள்ள புக்மார்க்குகள், வரலாறு, கடவுச்சொற்கள் மற்றும் பிற அமைப்புகளைப் பெறவும். உங்கள் Google சேவைகளிலும் தானாகவே உள்நுழைவீர்கள்.</translation>
 <translation id="8688579245973331962">உங்கள் பெயரைப் பார்க்கவில்லையா?</translation>
 <translation id="8688591111840995413">எளிதான கடவுச்சொல்</translation>
@@ -5149,7 +5148,7 @@
 <translation id="9114663181201435112">எளிதாக உள்நுழையலாம்</translation>
 <translation id="9115675100829699941">&amp;புக்மார்க்குகள்</translation>
 <translation id="9116465289595958864">கடைசியாக மாற்றியது</translation>
-<translation id="9116799625073598554">குறிப்பெடுக்கும் பயன்பாடு</translation>
+<translation id="9116799625073598554">குறிப்பெடுக்கும் ஆப்ஸ்</translation>
 <translation id="9121814364785106365">பொருத்திய தாவலாகத் திற</translation>
 <translation id="9124003689441359348">சேமித்த கடவுச்சொற்கள் இங்கே தோன்றும்</translation>
 <translation id="9125466540846359910"><ph name="LICENSE_TYPE" /> (<ph name="LICENSE_COUNT" /> ரெம்)</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb
index 720dbf9..8cb8e341 100644
--- a/chrome/app/resources/generated_resources_te.xtb
+++ b/chrome/app/resources/generated_resources_te.xtb
@@ -8,6 +8,7 @@
 <translation id="1007408791287232274">పరికరాలను లోడ్ చేయడం సాధ్యపడలేదు.</translation>
 <translation id="1008186147501209563">బుక్‌మార్క్‌లను ఎగుమతి చేయండి</translation>
 <translation id="1008557486741366299">ఇప్పుడు కాదు</translation>
+<translation id="1010498023906173788">ఈ ట్యాబ్ ఒక సీరియల్ పోర్ట్‌కు కనెక్ట్ చేయబడింది.</translation>
 <translation id="1010833424573920260">{NUM_PAGES,plural, =1{పేజీ ప్రతిస్పందించడం లేదు}other{పేజీలు ప్రతిస్పందించడం లేదు}}</translation>
 <translation id="1012794136286421601">మీ డాక్స్, షీట్‌లు, స్లయిడ్‌లు మరియు డ్రాయింగ్‌ల ఫైల్‌లు సమకాలీకరించబడుతున్నాయి. వీటిని ఆన్‌లైన్ లేదా ఆఫ్‌లైన్‌లో యాక్సెస్ చేయడానికి Google డిస్క్ యాప్‌ని తెరవండి.</translation>
 <translation id="1012876632442809908">USB-C పరికరం (ముందువైపు పోర్ట్)</translation>
@@ -30,6 +31,7 @@
 <translation id="1036982837258183574">పూర్తి స్క్రీన్‌ నుండి నిష్క్రమించడానికి |<ph name="ACCELERATOR" />| నొక్కండి</translation>
 <translation id="1038168778161626396">కోడ్ మాత్రమే</translation>
 <translation id="1039337018183941703">ఫైల్ చెల్లదు లేదా పాడైంది</translation>
+<translation id="1041175011127912238">ఈ పేజీ ప్రతిస్పందించడం లేదు</translation>
 <translation id="1042174272890264476">మీ కంప్యూటర్‌‍లో కూడా <ph name="SHORT_PRODUCT_NAME" /> యొక్క అంతర్గత RLZ లైబ్రరీ ఉంటుంది. RLZ శోధనలను మరియు నిర్దిష్ట ప్రమోషనల్ ప్రచారం ద్వారా ఉపయోగించబడిన <ph name="SHORT_PRODUCT_NAME" /> వినియోగాన్ని లెక్కించడానికి, ప్రత్యేకం కానటువంటి, వ్యక్తిగతంగా గుర్తించలేని ట్యాగ్‌ను సమర్పిస్తుంది. ఈ లేబుల్‌లు కొన్నిసార్లు <ph name="PRODUCT_NAME" />లోని Google శోధన ప్రశ్నలలో కనిపిస్తాయి.</translation>
 <translation id="1046059554679513793">అయ్యో, ఈ పేరు ఇప్పటికే వినియోగంలో ఉంది!</translation>
 <translation id="1046635659603195359">మీరు ఇప్పటికే మరో పరికరంలో మీ Google అసిస్టెంట్‌ని ఉపయోగించి Voice Matchని సెటప్ చేసినట్టున్నారు. ఈ పరికరంలో వాయిస్ నమూనాని రూపొందించడం కోసం ఈ మునుపటి రికార్డింగ్‌లు ఉపయోగించబడతాయి. ఇందుకు నిమిషం కంటే తక్కువ సమయం పడుతుంది.</translation>
@@ -148,6 +150,7 @@
 <translation id="1211364473545090084">మీ బ్రౌజింగ్ చరిత్రను సేవ్ చేయకుండానే వెబ్‌ను ఉపయోగించడానికి అజ్ఞాత విండోను వాడండి</translation>
 <translation id="1213037489357051291"><ph name="NUM_FINGERPRINTS" /> వేలిముద్రలు సెటప్ చేయబడ్డాయి</translation>
 <translation id="1215411991991485844">కొత్త బ్యాక్‌గ్రౌండ్‌ యాప్ జోడించబడింది</translation>
+<translation id="1217483152325416304">మీ స్థానిక డేటా త్వరలో తొలగించబడుతుంది</translation>
 <translation id="1217668622537098248">చర్య తర్వాత తిరిగి ఎడమ క్లిక్ వద్దకు మారు</translation>
 <translation id="121783623783282548">పాస్‌‌వర్డ్‌లు సరిపోలలేదు.</translation>
 <translation id="1218839827383191197"><ph name="BEGIN_PARAGRAPH1" />ఈ పరికర స్థానాన్ని అంచనా వేయడంలో సహాయపడటానికి Wi‑Fi, మొబైల్ నెట్‌వర్క్‌లు మరియు సెన్సార్‌ల వంటి మూలాధారాలను Google స్థాన సేవ ఉపయోగిస్తుంది.<ph name="END_PARAGRAPH1" />
@@ -308,6 +311,7 @@
 <translation id="1478340334823509079">వివరాలు: <ph name="FILE_NAME" /></translation>
 <translation id="1478607704480248626">ఇన్‌స్టాలేషన్ ప్రారంభించబడలేదు</translation>
 <translation id="1483493594462132177">పంపు</translation>
+<translation id="1484979925941077974">సైట్ బ్లూటూత్‌ను ఉపయోగిస్తోంది</translation>
 <translation id="1485015260175968628">ఇప్పుడు ఇది వీటిని చేయగలదు:</translation>
 <translation id="1485141095922496924">వెర్షన్ <ph name="PRODUCT_VERSION" /> (<ph name="PRODUCT_CHANNEL" />) <ph name="PRODUCT_MODIFIER" /> <ph name="PRODUCT_VERSION_BITS" /></translation>
 <translation id="1486096554574027028">పాస్‌వర్డ్‌లను వెతుకు</translation>
@@ -457,6 +461,7 @@
 <translation id="1708338024780164500">(క్రియారహితం)</translation>
 <translation id="1708713382908678956"><ph name="NAME_PH" /> (ID: <ph name="ID_PH" />)</translation>
 <translation id="1709106626015023981"><ph name="WIDTH" /> x <ph name="HEIGHT" /> (స్థానికం)</translation>
+<translation id="1711401317189798723"><ph name="CONTAINER_ID" /> కోసం బ్యాకప్ ప్రక్రియ ప్రస్తుతం ప్రోగ్రెస్‌లో ఉంది</translation>
 <translation id="1712349894969001173">మీ iPhoneలో ఈ పాస్‌వర్డ్‌ను పొందండి</translation>
 <translation id="1712552549805331520">మీ స్థానిక కంప్యూటర్‌లో <ph name="URL" /> శాశ్వతంగా డేటాను నిల్వ చేయాలనుకుంటోంది</translation>
 <translation id="1718835860248848330">చివరి గంట</translation>
@@ -606,6 +611,7 @@
 <translation id="1932026958134051332">ఆక్సెస్ ఎంపికలను మార్చు</translation>
 <translation id="1932098463447129402">ముందు కాదు</translation>
 <translation id="1933809209549026293">దయచేసి మౌస్ లేదా కీబోర్డ్‌ను కనెక్ట్ చేయండి. మీరు బ్లూటూత్ పరికరాన్ని ఉపయోగిస్తుంటే, అది జత చేయడానికి సిద్ధంగా ఉందని నిర్ధారించుకోండి.</translation>
+<translation id="1937774647013465102"><ph name="ARCHITECTURE_DEVICE" /> అయిన ఈ పరికరంతో <ph name="ARCHITECTURE_CONTAINER" /> రకమైన కంటెయినర్ ఆర్కిటెక్చర్‌ను దిగుమతి చేయడం సాధ్యపడదు. మీరు ఈ కంటెయినర్‌ను వేరే పరికరంలోకి పునరుద్ధరించడం ప్రయత్నించవచ్చు లేదా ఈ కంటెయినర్ చిత్రంలోని ఫైల్‌లను "ఫైల్స్ యాప్"లో తెరవడం ద్వారా యాక్సెస్ చేయవచ్చు.</translation>
 <translation id="1938351510777341717">బాహ్య ఆదేశం</translation>
 <translation id="1940546824932169984">కనెక్ట్ చేయబడిన పరికరాలు</translation>
 <translation id="1944921356641260203">అప్‌డేట్ కనుగొనబడింది</translation>
@@ -890,9 +896,11 @@
 <translation id="2392369802118427583">సక్రియం చెయ్యి</translation>
 <translation id="2394566832561516196">సెట్టింగ్‌లు తర్వాతిసారి మళ్లీ లోడ్‌ చేసే సమయంలో క్లియర్ చేయబడతాయి.</translation>
 <translation id="2395616325548404795">మీ <ph name="DEVICE_TYPE" /> ఎంటర్‌ప్రైజ్ నిర్వహణ కోసం విజయవంతంగా నమోదు చేయబడింది, కానీ దాని లక్షణ మరియు స్థాన సమాచారాన్ని పంపడంలో విఫలమైంది. దయచేసి ఈ పరికరం కోసం ఈ సమాచారాన్ని మీ నిర్వాహక కన్సోల్ నుండి మాన్యువల్‌గా నమోదు చేయండి.</translation>
+<translation id="2396783860772170191">4 అంకెల పిన్ (0000-9999) నమోదు చేయండి</translation>
 <translation id="2408955596600435184">మీ PINని నమోదు చేయండి</translation>
 <translation id="241082044617551207">తెలియని ప్లగ్ఇన్‌</translation>
 <translation id="2413749388954403953">బుక్‌మార్క్‌ల వినియోగదారు ఇంటర్‌ఫేస్‌ను మార్చడం</translation>
+<translation id="241639282915300771">ప్రస్తుతం <ph name="CONTAINER_ID" /> కోసం పునరుద్ధరణ ప్రక్రియ ప్రోగ్రెస్‌లో ఉంది</translation>
 <translation id="241727068219398187"><ph name="TIME" /> నాటికి మీ Google పాస్‌వర్డ్‌తో డేటా ఎన్‌క్రిప్ట్ చేయబడింది.
           Google Payకి చెందిన చెల్లింపు పద్ధతులు మరియు చిరునామాలు ఇందులో ఉండవు.</translation>
 <translation id="2419706071571366386">భద్రత కోసం, మీ కంప్యూటర్‌ని ఉపయోగించనప్పుడు సైన్ అవుట్ చేయండి.</translation>
@@ -985,6 +993,7 @@
 <translation id="2538361623464451692">సింక్ నిలిపివేయబడింది</translation>
 <translation id="2540449034743108469">ఎక్స్‌టెన్షన్ కార్యకలాపాలను వినడానికి "ప్రారంభించు" నొక్కండి</translation>
 <translation id="2541002089857695151">పూర్తిస్క్రీన్ ప్రసారాన్ని ఆప్టిమైజ్ చేయాలా?</translation>
+<translation id="2541706104884128042">కొత్త నిద్ర సమయం సెట్ చేయబడింది</translation>
 <translation id="2544853746127077729">ప్రామాణీకరణ ప్రమాణపత్రం నెట్‌వర్క్ ద్వారా తిరస్కరించబడింది</translation>
 <translation id="2549985041256363841">రికార్డింగ్‌ను ప్రారంభించు</translation>
 <translation id="2550212893339833758">వినిమయం చేసిన మెమరీ</translation>
@@ -1075,6 +1084,7 @@
 <translation id="2677748264148917807">నిష్క్రమించు</translation>
 <translation id="2678063897982469759">మ‌ళ్లీ-ప్రారంభించు</translation>
 <translation id="268053382412112343">&amp;చరిత్ర</translation>
+<translation id="2682498795777673382">మీ తల్లి/తండ్రి నుండి హెచ్చరిక సందేశం</translation>
 <translation id="2683638487103917598">ఫోల్డర్ క్రమబద్ధీకరించబడింది</translation>
 <translation id="2684004000387153598">కొనసాగించడానికి, సరే క్లిక్ చేసి, ఆపై మీ ఇమెయిల్ చిరునామా కోసం కొత్త ప్రొఫైల్‌ను రూపొందించడానికి వ్యక్తిని జోడించు క్లిక్ చేయండి.</translation>
 <translation id="2688196195245426394">పరికరం సర్వర్‌తో నమోదు అవుతున్నప్పుడు లోపం: <ph name="CLIENT_ERROR" />.</translation>
@@ -1108,6 +1118,7 @@
 <translation id="2731392572903530958">మూసివేయబడిన విండోను మళ్లీ తె&amp;రవండి</translation>
 <translation id="2731700343119398978">దయచేసి వేచి ఉండండి...</translation>
 <translation id="2731710757838467317">మీ పర్యవేక్షించబడే వినియోగదారును సృష్టిస్తోంది. దీనికి కొంత సమయం పట్టవచ్చు.</translation>
+<translation id="2731971182069536520">మీరు మీ పరికరాన్ని పునఃప్రారంభించే తర్వాతిసారి, మీ నిర్వాహకుడు ఒక పర్యాయ అప్‌డేట్‌ను అమలు చేస్తారు, దీని వలన మీ స్థానిక డేటా తొలగించబడుతుంది.</translation>
 <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" />లోని సైట్‌లు కూడా రీసెట్ చేయబడతాయి.</translation>
 <translation id="2735438478659026460">మౌస్ కర్సర్ ఆపినప్పుడు ఆటోమేటిక్‌గా క్లిక్ అవుతుంది</translation>
 <translation id="2735712963799620190">షెడ్యూల్</translation>
@@ -1311,6 +1322,7 @@
 <translation id="304747341537320566">ప్రసంగ ఇంజిన్‌లు</translation>
 <translation id="3047644958362961983">మీ అసిస్టెంట్ సమస్యను మెరుగ్గా అర్థం చేసుకోవడంలో ఈ సమాచారం మాకు సహాయపడుతుంది. ఇది గరిష్టంగా 90 రోజుల పాటు నిల్వ చేయబడుతుంది మరియు సంబంధిత ఇంజినీరింగ్ మరియు అభిప్రాయ బృందాలు మాత్రమే దీనిని యాక్సెస్ చేయగలవు.</translation>
 <translation id="3053013834507634016">సర్టిఫికెట్ కీ ఉపయోగం</translation>
+<translation id="3053273573829329829">వినియోగదారు పిన్‌ను ప్రారంభించు</translation>
 <translation id="3058498974290601450">సెట్టింగ్‌లలో ఎప్పుడైనా మీరు సింక్‌ను ఆన్ చేయవచ్చు</translation>
 <translation id="3060379269883947824">వినడానికి-ఎంచుకోండిని ప్రారంభించు</translation>
 <translation id="3061707000357573562">ప్యాచ్ సేవ</translation>
@@ -1330,6 +1342,7 @@
 <translation id="3084771660770137092">Chrome మెమరీ దాటిపోయి ఉండవచ్చు లేదా వేరొక కారణంచేత ఆ వెబ్‌పేజీ ప్రాసెస్ ముగించబడి ఉండవచ్చు. కొనసాగించడానికి మళ్లీ లోడ్ చేయండి లేదా మరొక పేజీకి వెళ్ళండి.</translation>
 <translation id="3085412380278336437">సైట్ మీ కెమెరాను ఉపయోగించవచ్చు</translation>
 <translation id="3085752524577180175">SOCKS హోస్ట్</translation>
+<translation id="3088052000289932193">సైట్ MIDIని ఉపయోగిస్తోంది</translation>
 <translation id="3088325635286126843">&amp;పేరుమార్చు...</translation>
 <translation id="3089137131053189723">శోధన తీసివేయబడింది</translation>
 <translation id="3090193911106258841">ఆడియో, వీడియో ఇన్‌పుట్ యాక్సెస్‌ చేయబడుతోంది</translation>
@@ -1469,6 +1482,7 @@
 <translation id="3317459757438853210">రెండు-వైపులా ఉండేది</translation>
 <translation id="3317678681329786349">కెమెరా మరియు మైక్రోఫోన్ బ్లాక్ చేయబడ్డాయి</translation>
 <translation id="3319048459796106952">కొత్త &amp;అజ్ఞాత విండో</translation>
+<translation id="3323521181261657960">బోనస్! మీరు మరింత స్క్రీన్ వినియోగ సమయం పొందారు</translation>
 <translation id="3325910708063135066">Mac సిస్టమ్ ప్రాధాన్యతలలో కెమెరా మరియు మైక్రోఫోన్ ఆపివేయబడతాయి</translation>
 <translation id="3331321258768829690">(<ph name="UTCOFFSET" />) <ph name="LONGTZNAME" /> (<ph name="EXEMPLARCITY" />)</translation>
 <translation id="3331974543021145906">యాప్‌ సమాచారం</translation>
@@ -1764,6 +1778,7 @@
 <translation id="3765246971671567135">ఆఫ్‌లైన్ డెమో మోడ్ విధానాన్ని చదవడం సాధ్యపడలేదు.</translation>
 <translation id="3766223500670287046">రిమోట్ స్క్రీన్</translation>
 <translation id="3768037234834996183">మీ ప్రాధాన్యతలను సమకాలీకరిస్తోంది...</translation>
+<translation id="377050016711188788">ఐస్‌క్రీమ్</translation>
 <translation id="3771294271822695279">వీడియో ఫైళ్లు</translation>
 <translation id="3775432569830822555">SSL సర్వర్ సర్టిఫికెట్</translation>
 <translation id="3775705724665058594">మీ పరికరాలకు పంపండి</translation>
@@ -1842,6 +1857,7 @@
 <translation id="3869917919960562512">తప్పు సూచిక.</translation>
 <translation id="3870931306085184145"><ph name="DOMAIN" /> కోసం సేవ్ చేసిన పాస్‌వర్డ్‌లు లేవు</translation>
 <translation id="3871092408932389764">అతి తక్కువ</translation>
+<translation id="3871350334636688135">24 గంటల తర్వాత, మీ నిర్వాహకుడు మీరు మీ పరికరాన్ని పునఃప్రారంభిస్తే మీ స్థానిక డేటా తొలగించబడే ఒక పర్యాయ అప్‌డేట్‌ను అమలు చేస్తారు. మీకు అవసరమైన ఏ స్థానిక డేటాను అయినా 24 గంటలలోపు cloud storageలో సేవ్ చేసుకోండి.</translation>
 <translation id="3872220884670338524">మరిన్ని చర్యలు, <ph name="DOMAIN" />లో <ph name="USERNAME" /> కోసం సేవ్ చేయబడిన ఖాతా</translation>
 <translation id="3872991219937722530">డిస్క్ స్థలాన్ని ఖాళీ చేయండి, లేదంటే పరికరం ఇక స్పందించదు.</translation>
 <translation id="3873315167136380065">దీన్ని ఆన్ చేయడానికి, మీ సమకాలీకరణ రహస్య పదబంధాన్ని తీసివేయడానికి <ph name="BEGIN_LINK" />సమకాలీకరణను రీసెట్ చేయండి<ph name="END_LINK" /></translation>
@@ -1921,6 +1937,7 @@
 <translation id="3983400541576569538">కొన్ని యాప్‌ల డేటాని కోల్పోవచ్చు</translation>
 <translation id="3983586614702900908">తెలియని విక్రేత అందించిన పరికరాలు</translation>
 <translation id="3984159763196946143">డెమో మోడ్‌ను ప్రారంభించలేకపోయాము</translation>
+<translation id="3984431586879874039">మీ సెక్యూరిటీ కీని చూడటానికి ఈ సైట్‌ను అనుమతించాలా?</translation>
 <translation id="3987348946546879621">డేటా ఆదా చేయబడింది</translation>
 <translation id="3987938432087324095">క్షమించండి, అర్థం కాలేదు.</translation>
 <translation id="3988996860813292272">సమయ మండలిని ఎంచుకోండి</translation>
@@ -1997,6 +2014,7 @@
 <translation id="4099060993766194518">డిఫాల్ట్ శోధన ఇంజిన్‌ను పునరుద్ధరించాలా?</translation>
 <translation id="4099874310852108874">నెట్‌వర్క్ ఎర్రర్ సంభవించింది.</translation>
 <translation id="4100733287846229632">పరికరంలో ఖాళీ స్థలం చాలా తక్కువగా ఉంది</translation>
+<translation id="4100853287411968461">కొత్త స్క్రీన్ సమయ పరిమితి</translation>
 <translation id="4103091233824664032">స్క్రీన్ లాక్ మరియు సైన్ ఇన్‌ను కాన్ఫిగర్ చేయడానికి మీ పాస్‌వర్డ్‌ను నమోదు చేయండి</translation>
 <translation id="4104163789986725820">ఎ&amp;గుమతి...</translation>
 <translation id="4107048419833779140">నిల్వ డివైజ్‌లను గుర్తించి, తొలగించండి</translation>
@@ -2058,7 +2076,6 @@
 <translation id="42126664696688958">ఎగుమతి చేయి</translation>
 <translation id="42137655013211669">సర్వర్ ఈ వనరుకు యాక్సెస్‌ను నిషేధించింది.</translation>
 <translation id="4215350869199060536">అయ్యో, పేరులో చట్టవ్యతిరేక చిహ్నాలు ఉన్నాయి!</translation>
-<translation id="4222932583846282852">రద్దు చేస్తోంది...</translation>
 <translation id="4225397296022057997">అన్ని సైట్‌లలో</translation>
 <translation id="4235200303672858594">పూర్తి స్క్రీన్</translation>
 <translation id="4235965441080806197">సైన్ ఇన్‌ను రద్దు చేయి</translation>
@@ -2116,6 +2133,7 @@
 <translation id="4324577459193912240">ఫైల్ అసంపూర్ణంగా ఉంది</translation>
 <translation id="4325237902968425115"><ph name="LINUX_APP_NAME" />ని అన్ఇన్‌స్టాల్ చేస్తోంది...</translation>
 <translation id="4328203388435897516">మీ Chromebookని సెటప్ చేసినప్పుడు, అసిస్టెంట్ బటన్ నొక్కడం లేదా "Ok Google" చెప్పడం ద్వారా ఎప్పుడైనా సహాయాన్ని పొందండి. మార్పులు చేయడానికి అసిస్టెంట్ సెట్టింగ్‌లకు వెళ్లండి.</translation>
+<translation id="4330191372652740264">చల్లటి నీరు</translation>
 <translation id="4330387663455830245"><ph name="LANGUAGE" />ని ఎప్పటికీ అనువదించవద్దు</translation>
 <translation id="4333854382783149454">RSA ఎన్‌క్రిప్షన్‌తో PKCS #1 SHA-1</translation>
 <translation id="4336979451636460645">నెట్‌వర్క్ లాగ్‌ల కోసం, దీనిని చూడండి: <ph name="DEVICE_LOG_LINK" /></translation>
@@ -2151,6 +2169,7 @@
 <translation id="438503109373656455">సారటోగా</translation>
 <translation id="4387004326333427325">ప్రామాణీకరణ ప్రమాణపత్రం రిమోట్‌లో తిరస్కరించబడింది</translation>
 <translation id="4389091756366370506">వినియోగదారు <ph name="VALUE" /></translation>
+<translation id="4390000551125140321">{0,plural, =1{అజ్ఞాతం}other{# తెరవబడిన అజ్ఞాత విండోలు}}</translation>
 <translation id="439266289085815679">బ్లూటూత్ కాన్ఫిగరేషన్ <ph name="USER_EMAIL" /> ద్వారా నియంత్రించబడుతుంది.</translation>
 <translation id="4394049700291259645">నిలిపివేయి</translation>
 <translation id="4400367121200150367">పాస్‌వర్డ్‌లను ఎప్పుడూ సేవ్ చేయని సైట్‌లు ఇక్కడ కనిపిస్తాయి</translation>
@@ -2299,6 +2318,7 @@
 <translation id="4648499713050786492">వ్యక్తిని జోడించే ముందు దయచేసి మీ ప్రొఫైల్‌ను అన్‌లాక్ చేయండి.</translation>
 <translation id="4651484272688821107">డెమో మోడ్ వనరులతో ఆన్‌లైన్ అంతర్భాగాన్ని లోడ్ చేయడం సాధ్యపడలేదు.</translation>
 <translation id="465878909996028221">కేవలం http, https, ఫైల్ ప్రోటోకాల్‌లు మాత్రమే బ్రౌజర్ మళ్లింపులకు మద్దతిస్తాయి.</translation>
+<translation id="4659077111144409915">ప్రాథమిక ఖాతా</translation>
 <translation id="4660476621274971848">ఆశించిన వెర్షన్ "<ph name="EXPECTED_VERSION" />", కానీ ఉన్న వెర్షన్ "<ph name="NEW_ID" />"</translation>
 <translation id="4662788913887017617">ఈ బుక్‌మార్క్‌ను మీ iPhoneతో షేర్ చేయండి</translation>
 <translation id="4663373278480897665">కెమెరా అనుమతించబడింది</translation>
@@ -2344,6 +2364,7 @@
 <translation id="4724450788351008910">అనుబంధం మార్చబడింది</translation>
 <translation id="4725511304875193254">కార్గి</translation>
 <translation id="4726710629007580002">ఈ ఎక్స్‌టెన్ష‌న్‌ను ఇన్‌స్టాల్ చేయడానికి ప్రయత్నిస్తున్నప్పుడు హెచ్చరికలు చేయబడ్డాయి:</translation>
+<translation id="4727847987444062305">నిర్వహిత అతిథి సెషన్</translation>
 <translation id="4728558894243024398">ప్లాట్‌ఫారమ్</translation>
 <translation id="4733082559415072992"><ph name="URL" /> మీ పరికర స్థానాన్ని ఉపయోగించాలని అనుకుంటోంది</translation>
 <translation id="4733793249294335256">స్థానం</translation>
@@ -2453,6 +2474,7 @@
 <translation id="488785315393301722">వివరాలను చూపించు</translation>
 <translation id="4890773143211625964">అధునాతన ప్రింటర్ ఎంపికలను చూపు</translation>
 <translation id="4891089016822695758">బీటా ఫోరమ్</translation>
+<translation id="4892229439761351791">సైట్ బ్లూటూత్‌ను ఉపయోగించవచ్చు</translation>
 <translation id="4893336867552636863">దీని వలన మీ బ్రౌజింగ్ డేటా ఈ పరికరం నుండి శాశ్వతంగా తొలగించబడుతుంది.</translation>
 <translation id="4893522937062257019">లాక్ స్క్రీన్‌పై</translation>
 <translation id="4898011734382862273">ప్రమాణపత్రం "<ph name="CERTIFICATE_NAME" />" ప్రమాణపత్రాలను మంజూరు చేసే సంస్థను సూచిస్తోంది</translation>
@@ -2628,6 +2650,8 @@
 <translation id="5187295959347858724"><ph name="SHORT_PRODUCT_NAME" />కు మీరు ఇప్పుడు సైన్‌ఇన్ చేశారు. మీ బుక్‌మార్క్‌లు, చరిత్ర, మరియు ఇతర సెట్టింగ్‌లు మీ Google ఖాతాకు సమకాలీకరించబడుతున్నాయి.</translation>
 <translation id="5187826826541650604"><ph name="KEY_NAME" /> (<ph name="DEVICE" />)</translation>
 <translation id="51918995459521422"><ph name="ORIGIN" /> పలు ఫైల్‌లను డౌన్‌లోడ్ చేయాలనుకుంటోంది</translation>
+<translation id="5192316339598592690">వేగంగా ఖాతాలను మార్చండి, అలాగే ఒకేసారి అన్ని యాప్‌లు మరియు వెబ్‌సైట్‌లకు సైన్ ఇన్ చేయండి.
+    మీ Google ఖాతాలోని కొంత సమాచారాన్ని ఉపయోగించడానికి యాప్‌లు మరియు సైట్‌లు మీ అనుమతి కోరగలవు. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation>
 <translation id="5204673965307125349">దయచేసి పరికరాన్ని పవర్‌వాష్ చేసి, మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="5204967432542742771">పాస్‌వర్డ్‌ని నమోదు చేయండి</translation>
 <translation id="5206215183583316675">"<ph name="CERTIFICATE_NAME" />"ని తొలగించాలా?</translation>
@@ -3512,6 +3536,7 @@
 <translation id="6547354035488017500">కనీసం 512 MB స్థలాన్ని ఖాళీగా ఉంచండి, లేదంటే పరికరం ఇక స్పందించదు. స్థలాన్ని ఖాళీ చేయడానికి, పరికర నిల్వ నుండి ఫైల్‌లను తొలగించండి.</translation>
 <translation id="6550675742724504774">ఎంపికలు</translation>
 <translation id="6551508934388063976">ఆదేశం అందుబాటులో లేదు. కొత్త విండోను తెరవడానికి control-N నొక్కండి.</translation>
+<translation id="6551612971599078809">సైట్ USBని ఉపయోగిస్తోంది</translation>
 <translation id="655384502888039633"><ph name="USER_COUNT" /> వినియోగదారులు</translation>
 <translation id="655483977608336153">మళ్లీ ప్రయత్నించు</translation>
 <translation id="6555432686520421228">అన్ని వినియోగదారు ఖాతాలను తీసివేయండి మరియు మీ <ph name="IDS_SHORT_PRODUCT_NAME" /> పరికరాన్ని కొత్త‌ దాని లాగా రీసెట్ చేయండి.</translation>
@@ -3735,6 +3760,7 @@
 <translation id="692114467174262153"><ph name="ALTERNATIVE_BROWSER_NAME" />ను తెరవలేకపోయింది</translation>
 <translation id="6921709132208495314">ఈ పేజీలో డేటాను ఉపయోగించడం ఆపివేయండి</translation>
 <translation id="6922128026973287222">Google డేటా సేవర్‌ను ఉపయోగించి డేటాను ఆదా చేయండి. వేగంగా బ్రౌజ్ చేయండి. మరింత తెలుసుకోవడానికి క్లిక్ చేయండి.</translation>
+<translation id="6922745772873733498">ముద్రించడానికి పిన్‌ను నమోదు చేయండి</translation>
 <translation id="6923132443355966645">స్క్రోల్ / క్లిక్</translation>
 <translation id="6923633482430812883">షేర్‌ని మౌంట్ చేస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది. దయచేసి మీరు కనెక్ట్ చేస్తున్న ఫైల్ సర్వర్‌లో SMBv2 లేదా అంతకంటే తాజా వెర్షన్‌కు మద్దతు ఉందో లేదో తనిఖీ చేయండి.</translation>
 <translation id="6930036377490597025">బహిర్గత సెక్యూరిటీ కీ లేదా అంతర్నిర్మిత సెన్సార్</translation>
@@ -3789,6 +3815,7 @@
 <translation id="7003339318920871147">వెబ్ డేటాబేస్‌లు</translation>
 <translation id="7003723821785740825">మీ పరికరాన్ని అన్‌లాక్ చేయడానికి వేగవంతమైన మార్గాన్ని సెటప్ చేయండి</translation>
 <translation id="7003844668372540529"><ph name="VENDOR_NAME" /> నుండి తెలియని ఉత్పత్తి <ph name="PRODUCT_ID" /></translation>
+<translation id="7004402701596653846">సైట్ MIDIని ఉపయోగించగలదు</translation>
 <translation id="7004499039102548441">ఇటీవలి ట్యాబ్‌లు</translation>
 <translation id="7005848115657603926">చెల్లుబాటు కాని పేజీ పరిధి, <ph name="EXAMPLE_PAGE_RANGE" />ను ఉపయోగించు</translation>
 <translation id="7006634003215061422">దిగువ అంచు</translation>
@@ -3804,6 +3831,7 @@
 <translation id="7022562585984256452">మీ హోమ్ పేజీ సెట్ చేయబడింది.</translation>
 <translation id="7025190659207909717">మొబైల్ డేటా సేవ నిర్వహణ</translation>
 <translation id="7029809446516969842">పాస్‌వర్డ్‌లు</translation>
+<translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - సీరియల్ పోర్ట్ కనెక్ట్ చేయబడింది</translation>
 <translation id="7031962166228839643">TPM అనేది సిద్ధం అవుతోంది, దయచేసి వేచి ఉంచండి (దీనికి కొన్ని నిమిషాల సమయం పట్టవచ్చు)...</translation>
 <translation id="7037509989619051237">ప్రివ్యూ చేయవలసిన వచనం</translation>
 <translation id="7039326228527141150"><ph name="VENDOR_NAME" /> అందించిన USB పరికరాలకు యాక్సెస్</translation>
@@ -3828,6 +3856,7 @@
 <translation id="706626672220389329">షేర్‌ను మౌంట్ చేయడంలో ఎర్రర్ ఏర్పడింది. పేర్కొన్న షేర్ ఇప్పటికే మౌంట్ చేయబడింది.</translation>
 <translation id="7066944511817949584">"<ph name="DEVICE_NAME" />"కి కనెక్ట్ చేయడం విఫలమైంది.</translation>
 <translation id="7067725467529581407">దీన్ని మళ్లీ ఎప్పుడూ చూపవద్దు.</translation>
+<translation id="7069811530847688087"><ph name="WEBSITE" /> కోసం సరికొత్త లేదా విభిన్న రకమైన సెక్యూరిటీ కీ అవసరం కావచ్చు</translation>
 <translation id="7070484045139057854">ఇది సైట్ డేటాను చదవగలదు మరియు మార్చగలదు</translation>
 <translation id="7072010813301522126">షార్ట్‌కట్ పేరు</translation>
 <translation id="707392107419594760">మీ కీబోర్డ్‌ని ఎంచుకోండి:</translation>
@@ -3908,6 +3937,7 @@
 <translation id="7189234443051076392">మీ పరికరంలో తగినంత స్థలం ఉన్నట్లు నిర్ధారించుకోండి</translation>
 <translation id="7189965711416741966">వేలిముద్ర జోడించబడింది.</translation>
 <translation id="7191159667348037">తెలియని ప్రింటర్ (USB)</translation>
+<translation id="7193051357671784796">మీ సంస్థ ద్వారా ఈ యాప్ జోడించబడింది. యాప్‌ను పునఃప్రారంభించడం ద్వారా దీని ఇన్‌స్టాలేషన్‌ను పూర్తి చేయండి.</translation>
 <translation id="7193374945610105795"><ph name="ORIGIN" /> కోసం పాస్‌వర్డ్‌లు సేవ్ చేయబడలేదు</translation>
 <translation id="7196913789568937443">Google డిస్క్‌కు బ్యాకప్ చేయండి. ఏ సమయంలో అయినా సులభంగా మీ డేటాని పునరుద్ధరించండి లేదా పరికరాన్ని మార్చండి. ఈ బ్యాకప్‌లో యాప్ డేటా ఉంటుంది. బ్యాకప్‌లు Googleకి అప్‌లోడ్ చేయబడతాయి మరియు మీ Google ఖాతా పాస్‌వర్డ్‌ని ఉపయోగించి ఎన్‌క్రిప్ట్ చేయబడతాయి. <ph name="BEGIN_LINK1" />మరింత తెలుసుకోండి<ph name="END_LINK1" /></translation>
 <translation id="7197190419934240522">మీరు బ్రౌజ్ చేసే ప్రతిసారి Google శోధన మరియు Google స్మార్ట్‌లను పొందండి</translation>
@@ -4329,6 +4359,7 @@
     <ph name="BR" />
     <ph name="BEGIN_BOLD" />గమనిక:<ph name="END_BOLD" />  ప్రక్రియ సమయంలో సిస్టమ్ రీబూట్ అవుతుంది.</translation>
 <translation id="7829298379596169484">ఆడియో ఇన్‌పుట్ ప్రాప్యత చేయబడుతోంది</translation>
+<translation id="7830594666202422257">Linuxకు కనెక్ట్ చేయి</translation>
 <translation id="7831491651892296503">నెట్‌వర్క్‌ను కాన్ఫిగర్ చేయడంలో ఎర్రర్</translation>
 <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation>
 <translation id="7832084384634357321">ముగింపు సమయం</translation>
@@ -4358,6 +4389,7 @@
 <translation id="7877451762676714207">తెలియని సర్వర్ లోపం. దయచేసి మళ్లీ ప్రయత్నించండి లేదా సర్వర్ నిర్వాహకుడిని సంప్రదించండి.</translation>
 <translation id="7877680364634660272">పర్యటన</translation>
 <translation id="7878562273885520351">మీ పాస్‌వర్డ్ ఎవరికైనా తెలిసిపోయి ఉండవచ్చు</translation>
+<translation id="7880823633812189969">మీరు పునఃప్రారంభించినప్పుడు స్థానిక డేటా తొలగించబడుతుంది</translation>
 <translation id="7881483672146086348">ఖాతాను వీక్షించండి</translation>
 <translation id="7882358943899516840">ప్రదాత రకం</translation>
 <translation id="7885253890047913815">ఇటీవలి గమ్యస్థానాలు</translation>
@@ -4695,6 +4727,7 @@
 <translation id="8426713856918551002">ప్రారంభించబడుతోంది</translation>
 <translation id="8427292751741042100">ఏదైనా హోస్ట్‌లో పొందుపరచబడింది</translation>
 <translation id="8428213095426709021">సెట్టింగ్‌లు</translation>
+<translation id="8428628598981198790">మీ సెక్యూరిటీ కీని ఈ సైట్‌తో ఉపయోగించలేరు</translation>
 <translation id="84297032718407999">మీరు <ph name="LOGOUT_TIME_LEFT" />లో సైన్ అవుట్ అవుతారు</translation>
 <translation id="8431190899827883166">నొక్కినవి చూపు</translation>
 <translation id="8431909052837336408">SIM PINను మార్చండి</translation>
@@ -4899,6 +4932,7 @@
 <translation id="8732212173949624846">మీ సైన్-ఇన్ చేసిన అన్ని పరికరాల్లో మీ బ్రౌజింగ్ చరిత్రను చదవడం మరియు మార్చడం</translation>
 <translation id="8732844209475700754">గోప్యత, భద్రత మరియు డేటా సేకరణకు సంబంధించిన మరిన్ని సెట్టింగ్‌లు</translation>
 <translation id="8734073480934656039">ఈ సెట్టింగ్‌ను ప్రారంభించడం వలన కియోస్క్ యాప్‌లు ప్రారంభంలో ఆటోమేటిక్‌గా ప్రారంభించడానికి అనుమతించబడతాయి.</translation>
+<translation id="8734671092194994316">ఇది <ph name="WEBSITE" />కు మీ సందర్శన సంబంధిత సమాచారాన్ని మీ సెక్యూరిటీ కీలో రికార్డ్ చేస్తుంది.</translation>
 <translation id="873545264931343897"><ph name="PLUGIN_NAME" />ను అప్‌డేట్ చేయడం పూర్తయినప్పుడు, దానిని యాక్టివేట్ చేయడానికి పేజీని మళ్లీ లోడ్ చేయండి</translation>
 <translation id="8736288397686080465">ఈ సైట్ నేపథ్యంలో అప్‌డేట్ చేయబడింది.</translation>
 <translation id="8737685506611670901"><ph name="REPLACED_HANDLER_TITLE" />కి బదులుగా <ph name="PROTOCOL" /> లింక్‌లను తెరవాలనుకుంటోంది</translation>
@@ -4997,6 +5031,7 @@
 <translation id="8877448029301136595">[పేరెంట్ డైరెక్టరీ]</translation>
 <translation id="8879284080359814990">&amp;ట్యాబ్ లాగా చూపండి</translation>
 <translation id="8883847527783433352">మరొక ఖాతాకు సమకాలీకరించు</translation>
+<translation id="8884570509232205463">మీ పరికరం ఇప్పుడు <ph name="UNLOCK_TIME" />కు లాక్ చేయబడుతుంది.</translation>
 <translation id="8885197664446363138">Smart Lock అందుబాటులో లేదు</translation>
 <translation id="8888253246822647887">అప్‌గ్రేడ్ చేయడం పూర్తయినప్పుడు మీ యాప్ తెరవబడుతుంది. అప్‌గ్రేడ్‌లు పూర్తవడానికి కొద్ది నిమిషాలు పట్టవచ్చు.</translation>
 <translation id="8888432776533519951">రంగు:</translation>
@@ -5089,6 +5124,7 @@
 <translation id="9026852570893462412">ఈ ప్రాసెస్‌కు కొన్ని నిమిషాలు పట్టవచ్చు. మర్చువల్ మెషీన్ డౌన్‌లోడ్ అవుతోంది.</translation>
 <translation id="9027459031423301635">లింక్‌ను క్రొత్త &amp;టాబ్‌లో తెరువు</translation>
 <translation id="9030515284705930323">మీ సంస్థ మీ ఖాతా కోసం Google Play స్టోర్‌ను ప్రారంభించలేదు. మరింత సమాచారం కోసం మీ నిర్వాహకులను సంప్రదించండి.</translation>
+<translation id="9030785788945687215">Gmail</translation>
 <translation id="9033857511263905942">&amp;అతికించు</translation>
 <translation id="9037965129289936994">అసలైనది చూపు</translation>
 <translation id="9038649477754266430">పేజీలను మరింత త్వరగా లోడ్ చేయడానికి సూచన సేవను ఉపయోగించండి</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb
index bb17e1e..fb123b8 100644
--- a/chrome/app/resources/generated_resources_th.xtb
+++ b/chrome/app/resources/generated_resources_th.xtb
@@ -2012,6 +2012,7 @@
 <translation id="409579654357498729">เพิ่มไปยัง Cloud Print</translation>
 <translation id="4096508467498758490">ปิดส่วนขยายโหมดนักพัฒนาซอฟต์แวร์</translation>
 <translation id="4096824249111507322">กำลังจัดเตรียมโมดูลความปลอดภัย โปรดรอสักครู่ (ขั้นตอนนี้อาจใช้เวลา 2-3 นาที)...</translation>
+<translation id="4097560579602855702">ค้นหาใน Google</translation>
 <translation id="4099060993766194518">คืนค่าเป็นเครื่องมือค้นหาเริ่มต้นไหม</translation>
 <translation id="4099874310852108874">เกิดข้อผิดพลาดเกี่ยวกับเครือข่าย</translation>
 <translation id="4100733287846229632">พื้นที่ดิสก์เกือบเต็มแล้ว</translation>
@@ -2077,7 +2078,6 @@
 <translation id="42126664696688958">ส่งออก</translation>
 <translation id="42137655013211669">เซิร์ฟเวอร์ได้ห้ามการเข้าถึงทรัพยากรนี้</translation>
 <translation id="4215350869199060536">อ๊ะ มีสัญลักษณ์ที่ไม่ถูกต้องในชื่อ!</translation>
-<translation id="4222932583846282852">กำลังยกเลิก...</translation>
 <translation id="4225397296022057997">ในเว็บไซต์ทั้งหมด</translation>
 <translation id="4235200303672858594">ทั้งหน้าจอ</translation>
 <translation id="4235965441080806197">ยกเลิกการลงชื่อเข้าใช้</translation>
@@ -3830,7 +3830,6 @@
 <translation id="7017480957358237747">อนุญาตหรือห้ามบางเว็บไซต์</translation>
 <translation id="7018275672629230621">อ่านและเปลี่ยนแปลงประวัติการเข้าชม</translation>
 <translation id="7019805045859631636">เร็ว</translation>
-<translation id="702252130983202758">แอปของคุณ</translation>
 <translation id="7022562585984256452">ตั้งค่าหน้าแรกของคุณแล้ว</translation>
 <translation id="7025190659207909717">การจัดการบริการดาต้าบนมือถือ</translation>
 <translation id="7029809446516969842">รหัสผ่าน</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb
index 4470e38b..3a2a2d6 100644
--- a/chrome/app/resources/generated_resources_tr.xtb
+++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -2077,7 +2077,6 @@
 <translation id="42126664696688958">Dışa Aktar</translation>
 <translation id="42137655013211669">Bu kaynağa erişim sunucu tarafından yasaklandı.</translation>
 <translation id="4215350869199060536">Hata! Adda geçersiz simgeler var!</translation>
-<translation id="4222932583846282852">İptal ediliyor...</translation>
 <translation id="4225397296022057997">Tüm sitelerde</translation>
 <translation id="4235200303672858594">Tüm ekran</translation>
 <translation id="4235965441080806197">Oturum açmayı iptal et</translation>
@@ -3831,7 +3830,6 @@
 <translation id="7017480957358237747">çeşitli web sitelerine izin verebilir veya bu siteleri yasaklayabilir,</translation>
 <translation id="7018275672629230621">Göz atma geçmişinizi okuma ve değiştirme</translation>
 <translation id="7019805045859631636">Hızlı</translation>
-<translation id="702252130983202758">Uygulamalarınız</translation>
 <translation id="7022562585984256452">Ana sayfanız ayarlandı.</translation>
 <translation id="7025190659207909717">Mobil veri hizmeti yönetimi</translation>
 <translation id="7029809446516969842">Şifreler</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb
index 8842835c..eb5e804 100644
--- a/chrome/app/resources/generated_resources_uk.xtb
+++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -2012,6 +2012,7 @@
 <translation id="409579654357498729">Додати в Cloud Print</translation>
 <translation id="4096508467498758490">Вимкнути розширення в режимі розробника</translation>
 <translation id="4096824249111507322">Готується модуль безпеки. Зачекайте (це може зайняти кілька хвилин)…</translation>
+<translation id="4097560579602855702">Пошук у Google</translation>
 <translation id="4099060993766194518">Відновити пошукову систему за умовчанням?</translation>
 <translation id="4099874310852108874">Сталася помилка мережі.</translation>
 <translation id="4100733287846229632">На пристрої дуже мало вільного місця</translation>
@@ -2077,7 +2078,6 @@
 <translation id="42126664696688958">Експортувати</translation>
 <translation id="42137655013211669">Сервер заборонив доступ до цього ресурсу.</translation>
 <translation id="4215350869199060536">Помилка. Заборонені символи в імені.</translation>
-<translation id="4222932583846282852">Скасування…</translation>
 <translation id="4225397296022057997">На всіх сайтах</translation>
 <translation id="4235200303672858594">Увесь екран</translation>
 <translation id="4235965441080806197">Скасувати вхід</translation>
@@ -3830,7 +3830,6 @@
 <translation id="7017480957358237747">дозволяти чи забороняти певні веб-сайти;</translation>
 <translation id="7018275672629230621">Читати й змінювати історію веб-перегляду</translation>
 <translation id="7019805045859631636">Швидка</translation>
-<translation id="702252130983202758">Ваші додатки</translation>
 <translation id="7022562585984256452">Вашу домашню сторінку налаштовано.</translation>
 <translation id="7025190659207909717">Керування службою пересилання мобільних даних</translation>
 <translation id="7029809446516969842">Паролі</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb
index 322c3855..d1f59e4e 100644
--- a/chrome/app/resources/generated_resources_vi.xtb
+++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -2012,6 +2012,7 @@
 <translation id="409579654357498729">Thêm vào Cloud Print</translation>
 <translation id="4096508467498758490">Vô hiệu hóa tiện ích chế độ nhà phát triển</translation>
 <translation id="4096824249111507322">Đang chuẩn bị mô-đun an toàn, vui lòng đợi (việc này có thể mất vài phút)...</translation>
+<translation id="4097560579602855702">Tìm kiếm trên Google</translation>
 <translation id="4099060993766194518">Khôi phục công cụ tìm kiếm mặc định?</translation>
 <translation id="4099874310852108874">Đã xảy ra lỗi mạng.</translation>
 <translation id="4100733287846229632">Dung lượng của thiết bị quá thấp</translation>
@@ -2077,7 +2078,6 @@
 <translation id="42126664696688958">Xuất</translation>
 <translation id="42137655013211669">Máy chủ cấm truy cập vào tài nguyên này.</translation>
 <translation id="4215350869199060536">Rất tiếc, ký tự không hợp lệ trong tên!</translation>
-<translation id="4222932583846282852">Đang hủy...</translation>
 <translation id="4225397296022057997">Trên tất cả các trang web</translation>
 <translation id="4235200303672858594">Toàn màn hình</translation>
 <translation id="4235965441080806197">Hủy đăng nhập</translation>
@@ -3830,7 +3830,6 @@
 <translation id="7017480957358237747">cho phép hoặc cấm các trang web nhất định,</translation>
 <translation id="7018275672629230621">Đọc và thay đổi lịch sử duyệt web của bạn</translation>
 <translation id="7019805045859631636">Nhanh</translation>
-<translation id="702252130983202758">Ứng dụng của bạn</translation>
 <translation id="7022562585984256452">Trang chủ của bạn đã được đặt.</translation>
 <translation id="7025190659207909717">Quản lý dịch vụ dữ liệu di động</translation>
 <translation id="7029809446516969842">Mật khẩu</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb
index 5c22658d..1849f01 100644
--- a/chrome/app/resources/generated_resources_zh-CN.xtb
+++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -2069,7 +2069,6 @@
 <translation id="42126664696688958">导出</translation>
 <translation id="42137655013211669">服务器禁止访问此资源。</translation>
 <translation id="4215350869199060536">糟糕,名称中包含非法符号!</translation>
-<translation id="4222932583846282852">正在取消…</translation>
 <translation id="4225397296022057997">在所有网站上</translation>
 <translation id="4235200303672858594">整个屏幕</translation>
 <translation id="4235965441080806197">取消登录</translation>
@@ -3822,7 +3821,6 @@
 <translation id="7017480957358237747">允许或禁止访问某些网站;</translation>
 <translation id="7018275672629230621">读取和更改您的浏览记录</translation>
 <translation id="7019805045859631636">快</translation>
-<translation id="702252130983202758">您的应用</translation>
 <translation id="7022562585984256452">您的主页已设置。</translation>
 <translation id="7025190659207909717">移动数据服务管理</translation>
 <translation id="7029809446516969842">密码</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb
index 5cf0dc28..c39e7145 100644
--- a/chrome/app/resources/generated_resources_zh-TW.xtb
+++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -2010,6 +2010,7 @@
 <translation id="409579654357498729">新增至雲端列印</translation>
 <translation id="4096508467498758490">停用開發人員模式擴充功能</translation>
 <translation id="4096824249111507322">正在準備安全模組,請稍候 (這可能需要幾分鐘的時間)...</translation>
+<translation id="4097560579602855702">搜尋 Google</translation>
 <translation id="4099060993766194518">要還原預設搜尋引擎嗎?</translation>
 <translation id="4099874310852108874">網路發生錯誤。</translation>
 <translation id="4100733287846229632">裝置空間嚴重不足</translation>
@@ -2075,7 +2076,6 @@
 <translation id="42126664696688958">匯出</translation>
 <translation id="42137655013211669">伺服器禁止存取這個資源。</translation>
 <translation id="4215350869199060536">糟糕,名稱中有非法符號!</translation>
-<translation id="4222932583846282852">取消中…</translation>
 <translation id="4225397296022057997">在所有網站上</translation>
 <translation id="4235200303672858594">整個畫面</translation>
 <translation id="4235965441080806197">取消登入</translation>
@@ -3828,7 +3828,6 @@
 <translation id="7017480957358237747">允許/禁止特定網站;</translation>
 <translation id="7018275672629230621">讀取及變更你的瀏覽記錄</translation>
 <translation id="7019805045859631636">快</translation>
-<translation id="702252130983202758">你的應用程式</translation>
 <translation id="7022562585984256452">首頁已設定完成。</translation>
 <translation id="7025190659207909717">行動數據服務管理</translation>
 <translation id="7029809446516969842">密碼</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb
index 1d45d2b..0d8615bc 100644
--- a/chrome/app/resources/google_chrome_strings_es.xtb
+++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -176,6 +176,7 @@
 <translation id="5566025111015594046">Google Chrome (tráfico mDNS entrante)</translation>
 <translation id="565744775970812598">Es posible que <ph name="FILE_NAME" /> sea peligroso, por lo que Chrome lo ha bloqueado.</translation>
 <translation id="5686916850681061684">Personaliza y controla Google Chrome. Se requiere tu intervención. Haz clic aquí para obtener más información.</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5715063361988620182">{SECONDS,plural, =1{Google Chrome se reiniciará en 1 segundo}other{Google Chrome se reiniciará en # segundos}}</translation>
 <translation id="573759479754913123">Información de Chrome OS</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> ‑ Google Chrome Canary</translation>
@@ -268,6 +269,7 @@
 <translation id="8286862437124483331">Google Chrome está intentando mostrar contraseñas. Para permitirlo, escribe tu contraseña de Windows.</translation>
 <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="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Todos los derechos reservados.</translation>
 <translation id="8380166467911888159">Para corregir errores ortográficos, Chrome envía a Google el texto que escribes en los campos de texto</translation>
 <translation id="840084489713044809">Google Chrome quiere exportar tus contraseñas.</translation>
 <translation id="8406086379114794905">Ayuda a mejorar Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb
index 94d9f6b..ddd5686 100644
--- a/chrome/app/resources/google_chrome_strings_fil.xtb
+++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -176,6 +176,7 @@
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598">Maaaring mapanganib ang <ph name="FILE_NAME" />, kaya na-block ito ng Chrome.</translation>
 <translation id="5686916850681061684">I-customize at kontrolin ang Google Chrome. May kailangan kang pagtuunan ng pansin - mag-click para sa mga detalye.</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5715063361988620182">{SECONDS,plural, =1{Magre-restart ang Google Chrome pagkalipas ng 1 segundo}one{Magre-restart ang Google Chrome pagkalipas ng # segundo}other{Magre-restart ang Google Chrome pagkalipas ng # na segundo}}</translation>
 <translation id="573759479754913123">Tungkol sa Chrome OS</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
@@ -268,6 +269,7 @@
 <translation id="8286862437124483331">Sinusubukan ng Google Chrome na ipakita ang mga password. I-type ang iyong password sa Windows upang payagan ito.</translation>
 <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="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Nakalaan ang lahat ng karapatan.</translation>
 <translation id="8380166467911888159">Para maayos ang mga error sa pagbabaybay, ipinapadala ng Chrome sa Google ang text na na-type mo sa mga text field</translation>
 <translation id="840084489713044809">Gustong i-export ng Google Chrome ang iyong mga password.</translation>
 <translation id="8406086379114794905">Tulungang pahusayin ang Chrome</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb
index dc55c095..c1924a2 100644
--- a/chrome/app/resources/google_chrome_strings_hi.xtb
+++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -87,7 +87,7 @@
 <translation id="3080151273017101988">Google Chrome के बंद होने पर पृष्ठभूमि ऐप्स  चलाना जारी रखें</translation>
 <translation id="3089968997497233615">Google Chrome का एक नया, सुरक्षित वर्शन उपलब्‍ध है.</translation>
 <translation id="3149510190863420837">Chrome ऐप्स</translation>
-<translation id="3251381707915721925">यह सेट करने के लिए कि <ph name="NEW_PROFILE_NAME" /> द्वारा कौन सी वेबसाइट देखी जा सकती है, आप <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" /> पर जाकर प्रतिबंध और सेटिंग कॉन्फ़िगर कर सकते हैं. यदि आप डिफ़ॉल्ट सेटिंग नहीं बदलते हैं, तो <ph name="NEW_PROFILE_NAME" /> द्वारा वेब प्रोफ़ाइल पर सब कुछ ब्राउज़ किया जा सकता है.
+<translation id="3251381707915721925">यह सेट करने के लिए कि <ph name="NEW_PROFILE_NAME" /> द्वारा कौन सी वेबसाइट देखी जा सकती है, आप <ph name="BEGIN_LINK_1" /><ph name="DISPLAY_LINK" /><ph name="END_LINK_1" /> पर जाकर प्रतिबंध और सेटिंग कॉन्फ़िगर कर सकते हैं. अगर आप डिफ़ॉल्ट सेटिंग नहीं बदलते हैं, तो <ph name="NEW_PROFILE_NAME" /> द्वारा वेब प्रोफ़ाइल पर सब कुछ ब्राउज़ किया जा सकता है.
 
 <ph name="NEW_PROFILE_NAME" /> को अपना खाता एक्सेस करने से रोकने के लिए, जब आप क्रोमियम का उपयोग नहीं कर रहे हों तो अपनी प्रोफ़ाइल को अवश्य लॉक कर दें. ऐसा करने के लिए, ब्राउज़र के ऊपर-दाएं कोने में स्थित अपना प्रोफ़ाइल नाम क्लिक करें और "बाहर निकलें और चाइल्ड लॉक करें" चुनें.
 <ph name="BEGIN_LINK_2" />अधिक जानें<ph name="END_LINK_2" />
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb
index a7fff04..c7a5286 100644
--- a/chrome/app/resources/google_chrome_strings_ml.xtb
+++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -176,6 +176,7 @@
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> അപകടകരമാകാൻ ഇടയുള്ളതിനാൽ, Chrome ഇതിനെ ബ്ലോക്കുചെയ്‌തു.</translation>
 <translation id="5686916850681061684">Google Chrome ഇഷ്‌ടാനുസൃതമാക്കുക, നിയന്ത്രിക്കുക. എന്തോ ഒന്നിന് നിങ്ങളുടെ ശ്രദ്ധ വേണം -വിശദാംശങ്ങൾക്ക് ക്ലിക്ക് ചെയ്യുക.</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5715063361988620182">{SECONDS,plural, =1{Google Chrome ഒരു സെക്കൻഡിൽ പുനഃരാരംഭിക്കും}other{Google Chrome # സെക്കൻഡിൽ പുനഃരാരംഭിക്കും}}</translation>
 <translation id="573759479754913123">Chrome OS-നെക്കുറിച്ച്</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
@@ -268,6 +269,7 @@
 <translation id="8286862437124483331">Google Chrome പാസ്‌വേഡുകൾ ദൃശ്യമാക്കാൻ ശ്രമിക്കുന്നു. ഇത് അനുവദിക്കാൻ നിങ്ങളുടെ Windows പാസ്‌വേഡ് ടൈപ്പുചെയ്യുക.</translation>
 <translation id="8290100596633877290">ഓ! Google Chrome ക്രാഷുചെയ്തു. ഇപ്പോള്‍ വീണ്ടും സമാരംഭിക്കണോ?</translation>
 <translation id="8342675569599923794">ഈ ഫയൽ അപകടകരമായതിനാൽ Chrome ഇതിനെ ബ്ലോക്കുചെയ്‌തു.</translation>
+<translation id="8370517070665726704">പകർപ്പവകാശം <ph name="YEAR" /> Google LLC. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്‍തം.</translation>
 <translation id="8380166467911888159">അക്ഷരപ്പിശകുകൾ പരിഹരിക്കാൻ, ടെക്‌സ്‌റ്റ് ഫീൽഡുകളിൽ നിങ്ങൾ ടൈപ്പ് ചെയ്യുന്ന ടെക്‌സ്‌‌റ്റ് Chrome, Google-ന് അയയ്ക്കുന്നു</translation>
 <translation id="840084489713044809">നിങ്ങളുടെ പാസ്‌വേഡുകൾ എക്‌സ്‌പോർട്ട് ചെയ്യാൻ Google Chrome ആഗ്രഹിക്കുന്നു.</translation>
 <translation id="8406086379114794905">Chrome-നെ മികച്ചതാക്കാൻ സഹായിക്കുക</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb
index 1841f676..1553c97 100644
--- a/chrome/app/resources/google_chrome_strings_no.xtb
+++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -168,6 +168,7 @@
 <translation id="5566025111015594046">Google Chrome (mDNS-Inn)</translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> kan være farlig, så Chrome har blokkert den.</translation>
 <translation id="5686916850681061684">Tilpass og kontrollér Google Chrome. Det er noe du må se på – klikk for mer informasjon.</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5715063361988620182">{SECONDS,plural, =1{Google Chrome startes på nytt om 1 sekund}other{Google Chrome startes på nytt om # sekunder}}</translation>
 <translation id="573759479754913123">Om Chrome OS</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
@@ -260,6 +261,7 @@
 <translation id="8286862437124483331">Google Chrome forsøker å vise passord. Skriv inn Windows-passordet ditt for å tillate dette.</translation>
 <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="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Med enerett.</translation>
 <translation id="8380166467911888159">For å rette opp i skrivefeil sender Chrome sender tekst du skriver i tekstfelt, til Google</translation>
 <translation id="840084489713044809">Google Chrome forsøker å eksportere passordene dine.</translation>
 <translation id="8406086379114794905">Bidra til å gjøre Chrome bedre</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb
index 8ecf11a..07f05f0 100644
--- a/chrome/app/resources/google_chrome_strings_ru.xtb
+++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -168,6 +168,7 @@
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598">Chrome заблокировал файл <ph name="FILE_NAME" /> как потенциально опасный.</translation>
 <translation id="5686916850681061684">Настройка и управление Google Chrome Требуется ваше внимание. Нажмите, чтобы получить подробную информацию.</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5715063361988620182">{SECONDS,plural, =1{Google Chrome перезапустится через 1 секунду}one{Google Chrome перезапустится через # секунду}few{Google Chrome перезапустится через # секунды}many{Google Chrome перезапустится через # секунд}other{Google Chrome перезапустится через # секунды}}</translation>
 <translation id="573759479754913123">О Chrome OS</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> – Google Chrome Canary</translation>
@@ -260,6 +261,7 @@
 <translation id="8286862437124483331">Чтобы просмотреть пароли, введите пароль своего аккаунта Windows.</translation>
 <translation id="8290100596633877290">Произошел сбой Google Chrome. Перезапустить?</translation>
 <translation id="8342675569599923794">Chrome заблокировал этот файл как опасный.</translation>
+<translation id="8370517070665726704">© Google LLC, <ph name="YEAR" />. Все права защищены.</translation>
 <translation id="8380166467911888159">Отправлять введенный вами текст в Google для проверки правописания</translation>
 <translation id="840084489713044809">Вы собираетесь экспортировать пароли из Google Chrome.</translation>
 <translation id="8406086379114794905">Помогите сделать Chrome безопаснее</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb
index d8964f12..b84a95e2f 100644
--- a/chrome/app/resources/google_chrome_strings_te.xtb
+++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -168,6 +168,7 @@
 <translation id="5566025111015594046">Google Chrome (mDNS-In)</translation>
 <translation id="565744775970812598"><ph name="FILE_NAME" /> హానికరం కావచ్చు, కావున Chrome దాన్ని బ్లాక్ చేసింది.</translation>
 <translation id="5686916850681061684">Google Chromeను అనుకూలీకరించండి, నియంత్రించండి. మీరు గమనించాల్సిన విషయం ఒకటి ఉంది - వివరాల కోసం క్లిక్ చేయండి.</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5715063361988620182">{SECONDS,plural, =1{Google Chrome 1 సెకనులో పునఃప్రారంభమవుతుంది}other{Google Chrome # సెకన్లలో పునఃప్రారంభమవుతుంది}}</translation>
 <translation id="573759479754913123">Chrome OS గురించి</translation>
 <translation id="5795887333006832406"><ph name="PAGE_TITLE" /> - Google Chrome Canary</translation>
@@ -260,6 +261,7 @@
 <translation id="8286862437124483331">Google Chrome పాస్‌వర్డ్‌లను చూపడానికి ప్రయత్నిస్తోంది. దీన్ని అనుమతించడానికి మీ Windows పాస్‌వర్డ్‌ను టైప్ చేయండి.</translation>
 <translation id="8290100596633877290">ఆపండి! Google Chrome క్రాష్ అయ్యింది. ఇప్పుడు మళ్ళీ ప్రారంభించాల?</translation>
 <translation id="8342675569599923794">ఈ ఫైల్ అపాయకరమైనది, కాబట్టి Chrome దీన్ని బ్లాక్ చేసింది.</translation>
+<translation id="8370517070665726704">కాపీరైట్ <ph name="YEAR" /> Google LLC. సర్వ హక్కులు ప్రత్యేకించబడ్డాయి.</translation>
 <translation id="8380166467911888159">అక్షరక్రమ లోపాలను పరిష్కరించడానికి, Chrome మీరు వచన ఫీల్డ్‌లలో టైప్ చేసే వచనాన్ని Googleకి పంపుతుంది</translation>
 <translation id="840084489713044809">Google Chrome మీ పాస్‌వర్డ్‌లను ఎగుమతి చేయాలనుకుంటోంది.</translation>
 <translation id="8406086379114794905">Chromeను మెరుగుపరచడంలో సహాయపడండి</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index fd54901..77f4cf1 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1081,6 +1081,7 @@
     "performance_manager/graph/node_attached_data_impl.h",
     "performance_manager/graph/node_base.cc",
     "performance_manager/graph/node_base.h",
+    "performance_manager/graph/node_type.h",
     "performance_manager/graph/page_node_impl.cc",
     "performance_manager/graph/page_node_impl.h",
     "performance_manager/graph/process_node_impl.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 498c812a..71d9306 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -1644,6 +1644,11 @@
     {"enable-site-per-process", flag_descriptions::kStrictSiteIsolationName,
      flag_descriptions::kStrictSiteIsolationDescription, kOsAndroid,
      SINGLE_VALUE_TYPE(switches::kSitePerProcess)},
+    {"enable-process-sharing-with-strict-site-instances",
+     flag_descriptions::kProcessSharingWithStrictSiteInstancesName,
+     flag_descriptions::kProcessSharingWithStrictSiteInstancesDescription,
+     kOsAndroid,
+     FEATURE_VALUE_TYPE(features::kProcessSharingWithStrictSiteInstances)},
 #endif
     {"isolate-origins", flag_descriptions::kIsolateOriginsName,
      flag_descriptions::kIsolateOriginsDescription, kOsAll,
@@ -1813,6 +1818,9 @@
     {"webxr-hit-test", flag_descriptions::kWebXrHitTestName,
      flag_descriptions::kWebXrHitTestDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kWebXrHitTest)},
+    {"webxr-plane-detection", flag_descriptions::kWebXrPlaneDetectionName,
+     flag_descriptions::kWebXrPlaneDetectionDescription, kOsAll,
+     FEATURE_VALUE_TYPE(features::kWebXrPlaneDetection)},
 #if BUILDFLAG(ENABLE_VR)
     {"webxr-orientation-sensor-device",
      flag_descriptions::kWebXrOrientationSensorDeviceName,
@@ -3960,10 +3968,18 @@
      kOsDesktop,
      FEATURE_VALUE_TYPE(omnibox::kUIExperimentShowPlaceholderWhenCaretShowing)},
 
+#if !defined(OS_ANDROID)
+    {"enterprise-reporting-in-browser",
+     flag_descriptions::kEnterpriseReportingInBrowserName,
+     flag_descriptions::kEnterpriseReportingInBrowserDescription, kOsDesktop,
+     FEATURE_VALUE_TYPE(features::kEnterpriseReportingInBrowser)},
+#endif  // !defined(OS_ANDROID)
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
     // AboutFlagsHistogramTest unit test to verify this process).
+
 };
 
 class FlagsStateSingleton {
diff --git a/chrome/browser/android/download/available_offline_content_provider.cc b/chrome/browser/android/download/available_offline_content_provider.cc
index d84161b7..f5c3c68 100644
--- a/chrome/browser/android/download/available_offline_content_provider.cc
+++ b/chrome/browser/android/download/available_offline_content_provider.cc
@@ -19,6 +19,7 @@
 #include "chrome/common/chrome_features.h"
 #include "components/ntp_snippets/pref_names.h"
 #include "components/offline_items_collection/core/offline_content_aggregator.h"
+#include "components/offline_items_collection/core/offline_content_provider.h"
 #include "components/offline_items_collection/core/offline_item.h"
 #include "components/offline_items_collection/core/offline_item_state.h"
 #include "components/prefs/pref_service.h"
@@ -27,6 +28,8 @@
 
 namespace android {
 using chrome::mojom::AvailableContentType;
+using GetVisualsOptions =
+    offline_items_collection::OfflineContentProvider::GetVisualsOptions;
 using offline_items_collection::OfflineItem;
 using offline_items_collection::OfflineItemState;
 
@@ -126,7 +129,8 @@
     auto callback = base::BindRepeating(&ThumbnailFetch::VisualsReceived,
                                         base::Unretained(this));
     for (offline_items_collection::ContentId id : content_ids_) {
-      aggregator->GetVisualsForItem(id, callback);
+      aggregator->GetVisualsForItem(
+          id, GetVisualsOptions::IconAndCustomFavicon(), callback);
     }
   }
 
diff --git a/chrome/browser/background_fetch/background_fetch_browsertest.cc b/chrome/browser/background_fetch/background_fetch_browsertest.cc
index 8f8cb83..03ab326 100644
--- a/chrome/browser/background_fetch/background_fetch_browsertest.cc
+++ b/chrome/browser/background_fetch/background_fetch_browsertest.cc
@@ -42,6 +42,8 @@
 
 using offline_items_collection::ContentId;
 using offline_items_collection::OfflineContentProvider;
+using GetVisualsOptions =
+    offline_items_collection::OfflineContentProvider::GetVisualsOptions;
 using offline_items_collection::OfflineItem;
 using offline_items_collection::OfflineItemFilter;
 using offline_items_collection::OfflineItemProgressUnit;
@@ -318,9 +320,10 @@
     base::RunLoop run_loop;
 
     delegate_->GetVisualsForItem(
-        offline_item_id, base::Bind(&BackgroundFetchBrowserTest::DidGetVisuals,
-                                    base::Unretained(this),
-                                    run_loop.QuitClosure(), out_visuals));
+        offline_item_id, GetVisualsOptions::IconOnly(),
+        base::BindOnce(&BackgroundFetchBrowserTest::DidGetVisuals,
+                       base::Unretained(this), run_loop.QuitClosure(),
+                       out_visuals));
     run_loop.Run();
   }
 
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
index f5b5a3cd..134e92d 100644
--- a/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
+++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.cc
@@ -787,7 +787,13 @@
 
 void BackgroundFetchDelegateImpl::GetVisualsForItem(
     const offline_items_collection::ContentId& id,
+    GetVisualsOptions options,
     VisualsCallback callback) {
+  if (!options.get_icon) {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback), id, nullptr));
+    return;
+  }
   // GetVisualsForItem mustn't be called directly since offline_items_collection
   // is not re-entrant and it must be called even if there are no visuals.
   auto visuals =
diff --git a/chrome/browser/background_fetch/background_fetch_delegate_impl.h b/chrome/browser/background_fetch/background_fetch_delegate_impl.h
index f52f9e1..020a325 100644
--- a/chrome/browser/background_fetch/background_fetch_delegate_impl.h
+++ b/chrome/browser/background_fetch/background_fetch_delegate_impl.h
@@ -105,6 +105,7 @@
                    SingleItemCallback callback) override;
   void GetAllItems(MultipleItemCallback callback) override;
   void GetVisualsForItem(const offline_items_collection::ContentId& id,
+                         GetVisualsOptions options,
                          VisualsCallback callback) override;
   void GetShareInfoForItem(const offline_items_collection::ContentId& id,
                            ShareCallback callback) override;
diff --git a/chrome/browser/background_fetch/background_fetch_download_client.cc b/chrome/browser/background_fetch/background_fetch_download_client.cc
index e434ac0..c455b885 100644
--- a/chrome/browser/background_fetch/background_fetch_download_client.cc
+++ b/chrome/browser/background_fetch/background_fetch_download_client.cc
@@ -89,17 +89,15 @@
 
 void BackgroundFetchDownloadClient::OnServiceUnavailable() {}
 
-download::Client::ShouldDownload
-BackgroundFetchDownloadClient::OnDownloadStarted(
+void BackgroundFetchDownloadClient::OnDownloadStarted(
     const std::string& guid,
     const std::vector<GURL>& url_chain,
     const scoped_refptr<const net::HttpResponseHeaders>& headers) {
+  // TODO(crbug.com/884672): Validate the chain/headers and cancel the download
+  // if invalid.
   auto response =
       std::make_unique<content::BackgroundFetchResponse>(url_chain, headers);
   GetDelegate()->OnDownloadStarted(guid, std::move(response));
-
-  // TODO(crbug.com/884672): Validate the chain/headers before continuing.
-  return download::Client::ShouldDownload::CONTINUE;
 }
 
 void BackgroundFetchDownloadClient::OnDownloadUpdated(
diff --git a/chrome/browser/background_fetch/background_fetch_download_client.h b/chrome/browser/background_fetch/background_fetch_download_client.h
index be84bdb..8ca9bff 100644
--- a/chrome/browser/background_fetch/background_fetch_download_client.h
+++ b/chrome/browser/background_fetch/background_fetch_download_client.h
@@ -34,7 +34,7 @@
       bool state_lost,
       const std::vector<download::DownloadMetaData>& downloads) override;
   void OnServiceUnavailable() override;
-  download::Client::ShouldDownload OnDownloadStarted(
+  void OnDownloadStarted(
       const std::string& guid,
       const std::vector<GURL>& url_chain,
       const scoped_refptr<const net::HttpResponseHeaders>& headers) override;
diff --git a/chrome/browser/chromeos/arc/arc_session_manager.cc b/chrome/browser/chromeos/arc/arc_session_manager.cc
index e90a15872..a73c1d8 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager.cc
+++ b/chrome/browser/chromeos/arc/arc_session_manager.cc
@@ -65,6 +65,10 @@
 // Allows the session manager to skip creating UI in unit tests.
 bool g_ui_enabled = true;
 
+// Allows the session manager to create ArcTermsOfServiceOobeNegotiator in
+// tests, even when the tests are set to skip creating UI.
+bool g_enable_arc_terms_of_service_oobe_negotiator_in_tests = false;
+
 base::Optional<bool> g_enable_check_android_management_in_tests;
 
 // Maximum amount of time we'll wait for ARC to finish booting up. Once this
@@ -91,7 +95,7 @@
 //   kiosk app and device is not needed for opt-in;
 // * In Public Session mode, because Play Store will be hidden from users
 //   and only apps configured by policy should be installed.
-// * When ARC is managed and all OptIn preferences are managed/unused, too,
+// * When ARC is managed, and user does not go through OOBE opt-in,
 //   because the whole OptIn flow should happen as seamless as possible for
 //   the user.
 // For Active Directory users we always show a page notifying them that they
@@ -116,10 +120,8 @@
   if (IsArcOptInVerificationDisabled())
     return false;
 
-  if (IsArcPlayStoreEnabledPreferenceManagedForProfile(profile) &&
-      AreArcAllOptInPreferencesIgnorableForProfile(profile)) {
+  if (ShouldStartArcSilentlyForManagedProfile(profile))
     return false;
-  }
 
   return true;
 }
@@ -239,6 +241,12 @@
 }
 
 // static
+void ArcSessionManager::SetArcTermsOfServiceOobeNegotiatorEnabledForTesting(
+    bool enable) {
+  g_enable_arc_terms_of_service_oobe_negotiator_in_tests = enable;
+}
+
+// static
 void ArcSessionManager::EnableCheckAndroidManagementForTesting(bool enable) {
   g_enable_check_android_management_in_tests = enable;
 }
@@ -811,9 +819,12 @@
   }
 
   if (IsArcOobeOptInActive()) {
-    VLOG(1) << "Use OOBE negotiator.";
-    terms_of_service_negotiator_ =
-        std::make_unique<ArcTermsOfServiceOobeNegotiator>();
+    if (g_enable_arc_terms_of_service_oobe_negotiator_in_tests ||
+        g_ui_enabled) {
+      VLOG(1) << "Use OOBE negotiator.";
+      terms_of_service_negotiator_ =
+          std::make_unique<ArcTermsOfServiceOobeNegotiator>();
+    }
   } else if (support_host_) {
     VLOG(1) << "Use default negotiator.";
     terms_of_service_negotiator_ =
@@ -822,9 +833,18 @@
   }
 
   if (!terms_of_service_negotiator_) {
-    // The only case reached here is when g_ui_enabled is false so ARC support
-    // host is not created in SetProfile(), for testing purpose.
-    DCHECK(!g_ui_enabled) << "Negotiator is not created on production.";
+    // The only case reached here is when g_ui_enabled is false so
+    // 1. ARC support host is not created in SetProfile(), and
+    // 2. ArcTermsOfServiceOobeNegotiator is not created with OOBE test setup
+    // unless test explicitly called
+    // SetArcTermsOfServiceOobeNegotiatorEnabledForTesting(true).
+    if (IsArcOobeOptInActive()) {
+      DCHECK(!g_enable_arc_terms_of_service_oobe_negotiator_in_tests &&
+             !g_ui_enabled)
+          << "OOBE negotiator is not created on production.";
+    } else {
+      DCHECK(!g_ui_enabled) << "Negotiator is not created on production.";
+    }
     return;
   }
 
diff --git a/chrome/browser/chromeos/arc/arc_session_manager.h b/chrome/browser/chromeos/arc/arc_session_manager.h
index 6979182..0ef6c4a 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager.h
+++ b/chrome/browser/chromeos/arc/arc_session_manager.h
@@ -143,6 +143,7 @@
   static ArcSessionManager* Get();
 
   static void SetUiEnabledForTesting(bool enabled);
+  static void SetArcTermsOfServiceOobeNegotiatorEnabledForTesting(bool enabled);
   static void EnableCheckAndroidManagementForTesting(bool enable);
 
   // Returns true if ARC is allowed to run for the current session.
diff --git a/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc b/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc
index ccb406c..23bc070 100644
--- a/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc
+++ b/chrome/browser/chromeos/arc/arc_session_manager_unittest.cc
@@ -945,7 +945,8 @@
 
 class ArcSessionManagerPolicyTest
     : public ArcSessionManagerTestBase,
-      public testing::WithParamInterface<std::tuple<bool, bool, int, int>> {
+      public testing::WithParamInterface<
+          std::tuple<bool, bool, bool, int, int>> {
  public:
   void SetUp() override {
     ArcSessionManagerTestBase::SetUp();
@@ -959,14 +960,28 @@
     }
     GetFakeUserManager()->AddUser(account_id);
     GetFakeUserManager()->LoginUser(account_id);
+    // Mocks OOBE environment so that IsArcOobeOptInActive() returns true.
+    if (is_oobe_optin()) {
+      GetFakeUserManager()->set_current_user_new(true);
+      CreateLoginDisplayHost();
+    }
+  }
+
+  void TearDown() override {
+    if (is_oobe_optin()) {
+      fake_login_display_host_.reset();
+    }
+    ArcSessionManagerTestBase::TearDown();
   }
 
   bool arc_enabled_pref_managed() const { return std::get<0>(GetParam()); }
 
   bool is_active_directory_user() const { return std::get<1>(GetParam()); }
 
+  bool is_oobe_optin() const { return std::get<2>(GetParam()); }
+
   base::Value backup_restore_pref_value() const {
-    switch (std::get<2>(GetParam())) {
+    switch (std::get<3>(GetParam())) {
       case 0:
         return base::Value();
       case 1:
@@ -979,7 +994,7 @@
   }
 
   base::Value location_service_pref_value() const {
-    switch (std::get<3>(GetParam())) {
+    switch (std::get<4>(GetParam())) {
       case 0:
         return base::Value();
       case 1:
@@ -990,6 +1005,14 @@
     NOTREACHED();
     return base::Value();
   }
+
+ private:
+  void CreateLoginDisplayHost() {
+    fake_login_display_host_ =
+        std::make_unique<chromeos::FakeLoginDisplayHost>();
+  }
+
+  std::unique_ptr<chromeos::FakeLoginDisplayHost> fake_login_display_host_;
 };
 
 TEST_P(ArcSessionManagerPolicyTest, SkippingTerms) {
@@ -1025,32 +1048,46 @@
   arc_session_manager()->Initialize();
   arc_session_manager()->RequestEnable();
 
-  // Terms of Service are skipped iff ARC is enabled by policy and both policies
+  // Terms of Service are skipped if ARC is enabled by policy and both policies
   // are either managed or unused (for Active Directory users a LaForge
   // account is created, not a full Dasher account, where the policies have no
   // meaning).
+  // Terms of Service are skipped if ARC is enabled by policy and if it's in
+  // session opt-in.
   const bool prefs_unused = is_active_directory_user();
   const bool backup_managed = backup_restore_pref_value().is_bool();
   const bool location_managed = location_service_pref_value().is_bool();
+  const bool is_arc_oobe_optin = is_oobe_optin();
   const bool expected_terms_skipping =
-      (arc_enabled_pref_managed() &&
-       ((backup_managed && location_managed) || prefs_unused));
+      arc_enabled_pref_managed() && ((backup_managed && location_managed) ||
+                                     prefs_unused || !is_arc_oobe_optin);
   EXPECT_EQ(expected_terms_skipping
                 ? ArcSessionManager::State::CHECKING_ANDROID_MANAGEMENT
                 : ArcSessionManager::State::NEGOTIATING_TERMS_OF_SERVICE,
             arc_session_manager()->state());
+  EXPECT_EQ(IsArcOobeOptInActive(), is_arc_oobe_optin);
 
   // Complete provisioning if it's not done yet.
   if (!expected_terms_skipping)
     arc_session_manager()->OnTermsOfServiceNegotiatedForTesting(true);
+
   arc_session_manager()->StartArcForTesting();
   EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager()->state());
   arc_session_manager()->OnProvisioningFinished(ProvisioningResult::SUCCESS);
 
-  // Play Store app is launched unless the Terms screen was suppressed.
-  EXPECT_NE(expected_terms_skipping,
+  // Play Store app is launched unless the Terms screen was suppressed or Tos is
+  // accepted during OOBE.
+  EXPECT_NE(expected_terms_skipping || is_arc_oobe_optin,
             arc_session_manager()->IsPlaystoreLaunchRequestedForTesting());
 
+  // In case Tos is skipped, B&R and GLS should not be set if not managed.
+  if (expected_terms_skipping) {
+    if (!backup_managed)
+      EXPECT_FALSE(prefs->GetBoolean(prefs::kArcBackupRestoreEnabled));
+    if (!location_managed)
+      EXPECT_FALSE(prefs->GetBoolean(prefs::kArcLocationServiceEnabled));
+  }
+
   // Managed values for the prefs are unset.
   prefs->RemoveManagedPref(prefs::kArcBackupRestoreEnabled);
   prefs->RemoveManagedPref(prefs::kArcLocationServiceEnabled);
@@ -1066,33 +1103,6 @@
   arc_session_manager()->Shutdown();
 }
 
-TEST_P(ArcSessionManagerPolicyTest, ReenableManagedArc) {
-  sync_preferences::TestingPrefServiceSyncable* const prefs =
-      profile()->GetTestingPrefService();
-
-  // Set ARC to be managed.
-  prefs->SetManagedPref(prefs::kArcEnabled,
-                        std::make_unique<base::Value>(true));
-  EXPECT_TRUE(arc::IsArcPlayStoreEnabledForProfile(profile()));
-
-  arc_session_manager()->SetProfile(profile());
-  arc_session_manager()->Initialize();
-  arc_session_manager()->RequestEnable();
-  EXPECT_TRUE(arc_session_manager()->enable_requested());
-
-  // Simulate close OptIn. Session manager should stop.
-  SetArcPlayStoreEnabledForProfile(profile(), false);
-  EXPECT_TRUE(arc::IsArcPlayStoreEnabledForProfile(profile()));
-  EXPECT_FALSE(arc_session_manager()->enable_requested());
-
-  // Restart ARC again
-  SetArcPlayStoreEnabledForProfile(profile(), true);
-  EXPECT_TRUE(arc::IsArcPlayStoreEnabledForProfile(profile()));
-  EXPECT_TRUE(arc_session_manager()->enable_requested());
-
-  arc_session_manager()->Shutdown();
-}
-
 INSTANTIATE_TEST_SUITE_P(
     ,
     ArcSessionManagerPolicyTest,
@@ -1100,6 +1110,7 @@
     // as a proxy for base::Value.
     testing::Combine(testing::Bool() /* arc_enabled_pref_managed */,
                      testing::Bool() /* is_active_directory_user */,
+                     testing::Bool() /* is_oobe_optin */,
                      /* backup_restore_pref_value */
                      testing::Values(0,   // base::Value()
                                      1,   // base::Value(false)
@@ -1191,6 +1202,8 @@
   void SetUp() override {
     ArcSessionManagerTest::SetUp();
 
+    ArcSessionManager::SetArcTermsOfServiceOobeNegotiatorEnabledForTesting(
+        true);
     ArcTermsOfServiceOobeNegotiator::SetArcTermsOfServiceScreenViewForTesting(
         this);
 
@@ -1221,6 +1234,8 @@
 
     ArcTermsOfServiceOobeNegotiator::SetArcTermsOfServiceScreenViewForTesting(
         nullptr);
+    ArcSessionManager::SetArcTermsOfServiceOobeNegotiatorEnabledForTesting(
+        false);
 
     ArcSessionManagerTest::TearDown();
   }
diff --git a/chrome/browser/chromeos/arc/arc_util.cc b/chrome/browser/chromeos/arc/arc_util.cc
index 021aff4..efa3df92 100644
--- a/chrome/browser/chromeos/arc/arc_util.cc
+++ b/chrome/browser/chromeos/arc/arc_util.cc
@@ -443,15 +443,16 @@
 
 bool IsArcTermsOfServiceNegotiationNeeded(const Profile* profile) {
   DCHECK(profile);
-
+  // Don't show in session ARC OptIn dialog for managed user.
+  // For more info see crbug/950013.
   // Skip to show UI asking users to set up ARC OptIn preferences, if all of
   // them are managed by the admin policy. Note that the ToS agreement is anyway
   // not shown in the case of the managed ARC.
-  if (IsArcPlayStoreEnabledPreferenceManagedForProfile(profile) &&
-      AreArcAllOptInPreferencesIgnorableForProfile(profile) &&
+  if (ShouldStartArcSilentlyForManagedProfile(profile) &&
       !ShouldShowOptInForTesting()) {
-    VLOG(1) << "All opt-in preferences are under managed. "
-            << "Skip ARC Terms of Service negotiation.";
+    VLOG(1) << "Skip ARC Terms of Service negotiation for managed user. "
+            << "Don't record B&R and GLS if admin leave it as user to decide "
+            << "and user sikps the opt-in dialog.";
     return false;
   }
 
@@ -603,4 +604,10 @@
          chromeos::switches::ShouldShowPlayStoreInDemoMode();
 }
 
+bool ShouldStartArcSilentlyForManagedProfile(const Profile* profile) {
+  return IsArcPlayStoreEnabledPreferenceManagedForProfile(profile) &&
+         (AreArcAllOptInPreferencesIgnorableForProfile(profile) ||
+          !IsArcOobeOptInActive());
+}
+
 }  // namespace arc
diff --git a/chrome/browser/chromeos/arc/arc_util.h b/chrome/browser/chromeos/arc/arc_util.h
index 7de817d..c90b0d0c 100644
--- a/chrome/browser/chromeos/arc/arc_util.h
+++ b/chrome/browser/chromeos/arc/arc_util.h
@@ -169,6 +169,13 @@
 // session.
 bool IsPlayStoreAvailable();
 
+// Skip to show OOBE/in sesion UI asking users to set up ARC OptIn preferences,
+// iff all of them are managed by the admin policy.
+// Skips in session play terms of service for managed user and starts ARC
+// directly. Leaves B&R/GLS off if not set by admin since users don't see
+// the Tos page.
+bool ShouldStartArcSilentlyForManagedProfile(const Profile* profile);
+
 }  // namespace arc
 
 #endif  // CHROME_BROWSER_CHROMEOS_ARC_ARC_UTIL_H_
diff --git a/chrome/browser/chromeos/arc/arc_util_unittest.cc b/chrome/browser/chromeos/arc/arc_util_unittest.cc
index 29ce444..f89d4cf 100644
--- a/chrome/browser/chromeos/arc/arc_util_unittest.cc
+++ b/chrome/browser/chromeos/arc/arc_util_unittest.cc
@@ -610,6 +610,8 @@
   EXPECT_FALSE(IsArcTermsOfServiceOobeNegotiationNeeded());
 }
 
+// For managed user, generally no opt-in dialog is shown.
+// For OOBE user, see TermsOfServiceOobeNegotiationNeededForManagedUser test.
 TEST_F(ChromeArcUtilTest, TermsOfServiceNegotiationNeededForManagedUser) {
   base::CommandLine::ForCurrentProcess()->InitFromArgv(
       {"", "--arc-availability=officially-supported"});
@@ -617,37 +619,15 @@
   ScopedLogIn login(GetFakeUserManager(),
                     AccountId::FromUserEmailGaiaId(
                         profile()->GetProfileUserName(), kTestGaiaId));
+
+  EXPECT_TRUE(IsArcTermsOfServiceNegotiationNeeded(profile()));
+
   SetProfileIsManagedForTesting(profile());
+
   profile()->GetTestingPrefService()->SetManagedPref(
       prefs::kArcEnabled, std::make_unique<base::Value>(true));
-  EXPECT_TRUE(IsArcTermsOfServiceNegotiationNeeded(profile()));
-  EXPECT_TRUE(IsArcTermsOfServiceOobeNegotiationNeeded());
-  profile()->GetTestingPrefService()->SetManagedPref(
-      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(false));
-  EXPECT_TRUE(IsArcTermsOfServiceNegotiationNeeded(profile()));
-  EXPECT_TRUE(IsArcTermsOfServiceOobeNegotiationNeeded());
-  profile()->GetTestingPrefService()->SetManagedPref(
-      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(false));
+  EXPECT_TRUE(ShouldStartArcSilentlyForManagedProfile(profile()));
   EXPECT_FALSE(IsArcTermsOfServiceNegotiationNeeded(profile()));
-  EXPECT_FALSE(IsArcTermsOfServiceOobeNegotiationNeeded());
-  profile()->GetTestingPrefService()->SetManagedPref(
-      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(true));
-  profile()->GetTestingPrefService()->SetManagedPref(
-      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(false));
-  EXPECT_FALSE(IsArcTermsOfServiceNegotiationNeeded(profile()));
-  EXPECT_FALSE(IsArcTermsOfServiceOobeNegotiationNeeded());
-  profile()->GetTestingPrefService()->SetManagedPref(
-      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(false));
-  profile()->GetTestingPrefService()->SetManagedPref(
-      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(true));
-  EXPECT_FALSE(IsArcTermsOfServiceNegotiationNeeded(profile()));
-  EXPECT_FALSE(IsArcTermsOfServiceOobeNegotiationNeeded());
-  profile()->GetTestingPrefService()->SetManagedPref(
-      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(true));
-  profile()->GetTestingPrefService()->SetManagedPref(
-      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(true));
-  EXPECT_FALSE(IsArcTermsOfServiceNegotiationNeeded(profile()));
-  EXPECT_FALSE(IsArcTermsOfServiceOobeNegotiationNeeded());
 }
 
 TEST_F(ChromeArcUtilTest, TermsOfServiceOobeNegotiationNeededNoLogin) {
@@ -888,6 +868,100 @@
   DISALLOW_COPY_AND_ASSIGN(ArcOobeTest);
 };
 
+TEST_F(ArcOobeTest, TermsOfServiceOobeNegotiationNeededForManagedUser) {
+  base::CommandLine::ForCurrentProcess()->InitFromArgv(
+      {"", "--arc-availability=officially-supported"});
+  DisableDBusForProfileManager();
+  ScopedLogIn login(GetFakeUserManager(),
+                    AccountId::FromUserEmailGaiaId(
+                        profile()->GetProfileUserName(), kTestGaiaId));
+
+  GetFakeUserManager()->set_current_user_new(true);
+  CreateLoginDisplayHost();
+  EXPECT_TRUE(IsArcOobeOptInActive());
+
+  SetProfileIsManagedForTesting(profile());
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcEnabled, std::make_unique<base::Value>(true));
+  EXPECT_TRUE(IsArcTermsOfServiceNegotiationNeeded(profile()));
+  EXPECT_TRUE(IsArcTermsOfServiceOobeNegotiationNeeded());
+
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(false));
+  EXPECT_TRUE(IsArcTermsOfServiceNegotiationNeeded(profile()));
+  EXPECT_TRUE(IsArcTermsOfServiceOobeNegotiationNeeded());
+
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(false));
+  EXPECT_FALSE(IsArcTermsOfServiceNegotiationNeeded(profile()));
+  EXPECT_FALSE(IsArcTermsOfServiceOobeNegotiationNeeded());
+
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(true));
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(false));
+  EXPECT_FALSE(IsArcTermsOfServiceNegotiationNeeded(profile()));
+  EXPECT_FALSE(IsArcTermsOfServiceOobeNegotiationNeeded());
+
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(false));
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(true));
+  EXPECT_FALSE(IsArcTermsOfServiceNegotiationNeeded(profile()));
+  EXPECT_FALSE(IsArcTermsOfServiceOobeNegotiationNeeded());
+
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(true));
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(true));
+  EXPECT_FALSE(IsArcTermsOfServiceNegotiationNeeded(profile()));
+  EXPECT_FALSE(IsArcTermsOfServiceOobeNegotiationNeeded());
+}
+
+TEST_F(ArcOobeTest, ShouldStartArcSilentlyForManagedProfile) {
+  base::CommandLine::ForCurrentProcess()->InitFromArgv(
+      {"", "--arc-availability=officially-supported"});
+  DisableDBusForProfileManager();
+  ScopedLogIn login(GetFakeUserManager(),
+                    AccountId::FromUserEmailGaiaId(
+                        profile()->GetProfileUserName(), kTestGaiaId));
+
+  GetFakeUserManager()->set_current_user_new(true);
+  CreateLoginDisplayHost();
+  EXPECT_TRUE(IsArcOobeOptInActive());
+
+  SetProfileIsManagedForTesting(profile());
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcEnabled, std::make_unique<base::Value>(true));
+  EXPECT_FALSE(ShouldStartArcSilentlyForManagedProfile(profile()));
+
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(false));
+  EXPECT_FALSE(ShouldStartArcSilentlyForManagedProfile(profile()));
+
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(false));
+  EXPECT_TRUE(ShouldStartArcSilentlyForManagedProfile(profile()));
+
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(true));
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(false));
+  EXPECT_TRUE(ShouldStartArcSilentlyForManagedProfile(profile()));
+
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(false));
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(true));
+  EXPECT_TRUE(ShouldStartArcSilentlyForManagedProfile(profile()));
+
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcBackupRestoreEnabled, std::make_unique<base::Value>(true));
+  profile()->GetTestingPrefService()->SetManagedPref(
+      prefs::kArcLocationServiceEnabled, std::make_unique<base::Value>(true));
+  EXPECT_TRUE(ShouldStartArcSilentlyForManagedProfile(profile()));
+}
+
 using ArcOobeOpaOptInActiveInTest = ArcOobeTest;
 
 TEST_F(ArcOobeOpaOptInActiveInTest, OobeOptInActive) {
diff --git a/chrome/browser/chromeos/arc/notification/arc_provision_notification_service.cc b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service.cc
index ea7ed4b..f3723c9 100644
--- a/chrome/browser/chromeos/arc/notification/arc_provision_notification_service.cc
+++ b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service.cc
@@ -128,8 +128,7 @@
   // showing the notification if the opt-in flow happens silently (due to the
   // managed prefs), or ensure that no notification is shown otherwise.
   Profile* profile = Profile::FromBrowserContext(context_);
-  if (IsArcPlayStoreEnabledPreferenceManagedForProfile(profile) &&
-      AreArcAllOptInPreferencesIgnorableForProfile(profile)) {
+  if (ShouldStartArcSilentlyForManagedProfile(profile)) {
     ShowNotification();
   } else {
     HideNotification();
diff --git a/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
index b0b9798..bed021a 100644
--- a/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
+++ b/chrome/browser/chromeos/arc/notification/arc_provision_notification_service_unittest.cc
@@ -12,6 +12,8 @@
 #include "base/values.h"
 #include "chrome/browser/chromeos/arc/arc_optin_uma.h"
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/arc/arc_util.h"
+#include "chrome/browser/chromeos/login/ui/fake_login_display_host.h"
 #include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
 #include "chrome/browser/notifications/notification_display_service_tester.h"
 #include "chrome/test/base/browser_with_test_window_test.h"
@@ -217,12 +219,73 @@
       display_service_->GetNotification(kArcManagedProvisionNotificationId));
 }
 
-// The managed provision notification is not displayed when opt-in prefs are not
-// managed.
+// The unmanaged provision notification is not displayed.
 TEST_F(ArcProvisionNotificationServiceTest,
+       UnmanagedProvisionNotification_NotSilent) {
+  // No notifications are expected to be shown in this test.
+
+  // Set ARC to be unmanaged.
+  SetArcPlayStoreEnabledForProfile(profile(), true);
+
+  arc_session_manager_->SetProfile(profile());
+  arc_session_manager_->Initialize();
+
+  // Trigger opt-in flow. The notification is not shown.
+  arc_session_manager_->RequestEnable();
+  EXPECT_FALSE(
+      display_service_->GetNotification(kArcManagedProvisionNotificationId));
+  EXPECT_EQ(ArcSessionManager::State::NEGOTIATING_TERMS_OF_SERVICE,
+            arc_session_manager_->state());
+
+  // Emulate accepting the terms of service.
+  arc_session_manager_->OnTermsOfServiceNegotiatedForTesting(true);
+  arc_session_manager_->StartArcForTesting();
+  EXPECT_EQ(ArcSessionManager::State::ACTIVE, arc_session_manager_->state());
+
+  // Emulate successful provisioning.
+  EXPECT_FALSE(
+      display_service_->GetNotification(kArcManagedProvisionNotificationId));
+  arc_session_manager_->OnProvisioningFinished(ProvisioningResult::SUCCESS);
+  EXPECT_FALSE(
+      display_service_->GetNotification(kArcManagedProvisionNotificationId));
+}
+
+class ArcProvisionNotificationServiceOobeTest
+    : public ArcProvisionNotificationServiceTest {
+ protected:
+  ArcProvisionNotificationServiceOobeTest() = default;
+  void SetUp() override {
+    ArcProvisionNotificationServiceTest::SetUp();
+
+    GetFakeUserManager()->set_current_user_new(true);
+    CreateLoginDisplayHost();
+  }
+
+  void TearDown() override {
+    fake_login_display_host_.reset();
+    ArcProvisionNotificationServiceTest::TearDown();
+  }
+
+  void CreateLoginDisplayHost() {
+    fake_login_display_host_ =
+        std::make_unique<chromeos::FakeLoginDisplayHost>();
+  }
+
+ private:
+  std::unique_ptr<chromeos::FakeLoginDisplayHost> fake_login_display_host_;
+
+  DISALLOW_COPY_AND_ASSIGN(ArcProvisionNotificationServiceOobeTest);
+};
+
+// For mananged user whose B&R or GLS is not managed, Arc Tos is shown during
+// OOBE and no provision notification is expected.
+// For the cases B&R or GLS are both managed, OOBE opt-in and in-session opt-in
+// have no difference behavior for Arc provision notification.
+TEST_F(ArcProvisionNotificationServiceOobeTest,
        ManagedProvisionNotification_NotSilent) {
   // No notifications are expected to be shown in this test.
 
+  EXPECT_TRUE(IsArcOobeOptInActive());
   // Set ARC to be managed.
   profile()->GetTestingPrefService()->SetManagedPref(
       prefs::kArcEnabled, std::make_unique<base::Value>(true));
diff --git a/chrome/browser/chromeos/arc/print/arc_print_service.cc b/chrome/browser/chromeos/arc/print/arc_print_service.cc
index a54ff537..3b390ec 100644
--- a/chrome/browser/chromeos/arc/print/arc_print_service.cc
+++ b/chrome/browser/chromeos/arc/print/arc_print_service.cc
@@ -15,6 +15,7 @@
 #include "base/bind_helpers.h"
 #include "base/memory/singleton.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
 #include "chrome/browser/chrome_notification_types.h"
@@ -51,6 +52,12 @@
 class PrintJobHostImpl;
 class PrinterDiscoverySessionHostImpl;
 
+constexpr chromeos::CupsPrintersManager::PrinterClass kClassesToFetch[] = {
+    chromeos::CupsPrintersManager::kEnterprise,
+    chromeos::CupsPrintersManager::kSaved,
+    chromeos::CupsPrintersManager::kAutomatic,
+};
+
 class ArcPrintServiceImpl : public ArcPrintService,
                             public chromeos::CupsPrintJobManager::Observer,
                             public KeyedService {
@@ -218,13 +225,14 @@
   void StartPrinterDiscovery(
       const std::vector<std::string>& printer_ids) override {
     std::vector<mojom::PrinterInfoPtr> arc_printers;
-    for (size_t i = 0; i < chromeos::CupsPrintersManager::kNumPrinterClasses;
-         i++) {
-      std::vector<chromeos::Printer> printers = printers_manager_->GetPrinters(
-          static_cast<chromeos::CupsPrintersManager::PrinterClass>(i));
+
+    for (size_t i = 0; i < base::size(kClassesToFetch); ++i) {
+      auto printer_class = kClassesToFetch[i];
+      const auto& printers = printers_manager_->GetPrinters(printer_class);
       for (const auto& printer : printers)
-        arc_printers.emplace_back(ToArcPrinter(printer, nullptr));
+        arc_printers.push_back(ToArcPrinter(printer, nullptr));
     }
+
     if (!arc_printers.empty())
       instance_->AddPrinters(std::move(arc_printers));
   }
diff --git a/chrome/browser/chromeos/login/login_ui_shelf_visibility_browsertest.cc b/chrome/browser/chromeos/login/login_ui_shelf_visibility_browsertest.cc
index 27ecad1..ef2de1fb 100644
--- a/chrome/browser/chromeos/login/login_ui_shelf_visibility_browsertest.cc
+++ b/chrome/browser/chromeos/login/login_ui_shelf_visibility_browsertest.cc
@@ -69,7 +69,7 @@
   test::OobeGaiaPageWaiter().WaitUntilReady();
   LoginDisplayHost::default_host()
       ->GetOobeUI()
-      ->GetGaiaScreenView()
+      ->GetView<GaiaScreenHandler>()
       ->ShowSigninScreenForTest(kNewUserEmail, kNewUserGaiaId,
                                 FakeGaiaMixin::kEmptyUserServices);
 
diff --git a/chrome/browser/chromeos/login/login_utils_browsertest.cc b/chrome/browser/chromeos/login/login_utils_browsertest.cc
index 8912db3..e18ae5f 100644
--- a/chrome/browser/chromeos/login/login_utils_browsertest.cc
+++ b/chrome/browser/chromeos/login/login_utils_browsertest.cc
@@ -69,7 +69,7 @@
 
     LoginDisplayHost::default_host()
         ->GetOobeUI()
-        ->GetGaiaScreenView()
+        ->GetView<GaiaScreenHandler>()
         ->ShowSigninScreenForTest(username, "password", "[]");
 
     // Wait for the session to start after submitting the credentials. This
diff --git a/chrome/browser/chromeos/login/oobe_browsertest.cc b/chrome/browser/chromeos/login/oobe_browsertest.cc
index ff629b95..cd0f620 100644
--- a/chrome/browser/chromeos/login/oobe_browsertest.cc
+++ b/chrome/browser/chromeos/login/oobe_browsertest.cc
@@ -79,7 +79,7 @@
 
   LoginDisplayHost::default_host()
       ->GetOobeUI()
-      ->GetGaiaScreenView()
+      ->GetView<GaiaScreenHandler>()
       ->ShowSigninScreenForTest(FakeGaiaMixin::kFakeUserEmail,
                                 FakeGaiaMixin::kFakeUserPassword,
                                 FakeGaiaMixin::kEmptyUserServices);
diff --git a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
index acff0e9..8481897 100644
--- a/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
+++ b/chrome/browser/chromeos/login/oobe_interactive_ui_test.cc
@@ -223,7 +223,7 @@
   void LogInAsRegularUser() {
     LoginDisplayHost::default_host()
         ->GetOobeUI()
-        ->GetGaiaScreenView()
+        ->GetView<GaiaScreenHandler>()
         ->ShowSigninScreenForTest(FakeGaiaMixin::kFakeUserEmail,
                                   FakeGaiaMixin::kFakeUserPassword,
                                   FakeGaiaMixin::kEmptyUserServices);
diff --git a/chrome/browser/chromeos/login/saml/saml_browsertest.cc b/chrome/browser/chromeos/login/saml/saml_browsertest.cc
index 7f38642..52c0246 100644
--- a/chrome/browser/chromeos/login/saml/saml_browsertest.cc
+++ b/chrome/browser/chromeos/login/saml/saml_browsertest.cc
@@ -409,7 +409,7 @@
     SetupAuthFlowChangeListener();
     LoginDisplayHost::default_host()
         ->GetOobeUI()
-        ->GetGaiaScreenView()
+        ->GetView<GaiaScreenHandler>()
         ->ShowSigninScreenForTest(gaia_email, "", "[]");
 
     std::string message;
@@ -769,7 +769,7 @@
   WaitForSigninScreen();
   LoginDisplayHost::default_host()
       ->GetOobeUI()
-      ->GetGaiaScreenView()
+      ->GetView<GaiaScreenHandler>()
       ->ShowSigninScreenForTest(kHTTPSAMLUserEmail, "", "[]");
 
   const GURL url = embedded_test_server()->base_url().Resolve("/SAML");
@@ -789,7 +789,7 @@
   WaitForSigninScreen();
   LoginDisplayHost::default_host()
       ->GetOobeUI()
-      ->GetGaiaScreenView()
+      ->GetView<GaiaScreenHandler>()
       ->ShowSigninScreenForTest(kFirstSAMLUserEmail, "", "[]");
 
   EXPECT_EQ(l10n_util::GetStringFUTF8(IDS_LOGIN_FATAL_ERROR_TEXT_INSECURE_URL,
@@ -1224,7 +1224,7 @@
   // Log in without SAML.
   LoginDisplayHost::default_host()
       ->GetOobeUI()
-      ->GetGaiaScreenView()
+      ->GetView<GaiaScreenHandler>()
       ->ShowSigninScreenForTest(kNonSAMLUserEmail, "password", "[]");
 
   content::WindowedNotificationObserver(
diff --git a/chrome/browser/chromeos/login/session/chrome_session_manager_browsertest.cc b/chrome/browser/chromeos/login/session/chrome_session_manager_browsertest.cc
index a2476149..1565a2f 100644
--- a/chrome/browser/chromeos/login/session/chrome_session_manager_browsertest.cc
+++ b/chrome/browser/chromeos/login/session/chrome_session_manager_browsertest.cc
@@ -121,7 +121,7 @@
 
   LoginDisplayHost::default_host()
       ->GetOobeUI()
-      ->GetGaiaScreenView()
+      ->GetView<GaiaScreenHandler>()
       ->ShowSigninScreenForTest(kTestUsers[0].email, "fake_password", "[]");
 
   session_start_waiter.Wait();
@@ -209,7 +209,7 @@
 
     LoginDisplayHost::default_host()
         ->GetOobeUI()
-        ->GetGaiaScreenView()
+        ->GetView<GaiaScreenHandler>()
         ->ShowSigninScreenForTest(kTestUsers[0].email, "fake_password", "[]");
 
     session_start_waiter.Wait();
diff --git a/chrome/browser/chromeos/login/signin/device_id_browsertest.cc b/chrome/browser/chromeos/login/signin/device_id_browsertest.cc
index af1c42d8..514c2c2 100644
--- a/chrome/browser/chromeos/login/signin/device_id_browsertest.cc
+++ b/chrome/browser/chromeos/login/signin/device_id_browsertest.cc
@@ -117,7 +117,7 @@
 
     LoginDisplayHost::default_host()
         ->GetOobeUI()
-        ->GetGaiaScreenView()
+        ->GetView<GaiaScreenHandler>()
         ->ShowSigninScreenForTest(user_id, password, "[]");
 
     WaitForSessionStart();
diff --git a/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc b/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc
index e25da87..564443e 100644
--- a/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc
+++ b/chrome/browser/chromeos/login/signin/oauth2_browsertest.cc
@@ -437,7 +437,7 @@
     // our email normalization kicks in.
     LoginDisplayHost::default_host()
         ->GetOobeUI()
-        ->GetGaiaScreenView()
+        ->GetView<GaiaScreenHandler>()
         ->ShowSigninScreenForTest(kTestRawEmail, kTestAccountPassword,
                                   kTestAccountServices);
     session_start_waiter.Wait();
@@ -678,7 +678,7 @@
   // Simulate an online sign-in.
   LoginDisplayHost::default_host()
       ->GetOobeUI()
-      ->GetGaiaScreenView()
+      ->GetView<GaiaScreenHandler>()
       ->ShowSigninScreenForTest(kTestRawEmail, kTestAccountPassword,
                                 kTestAccountServices);
 
diff --git a/chrome/browser/chromeos/login/signin_screen_controller.cc b/chrome/browser/chromeos/login/signin_screen_controller.cc
index 8381ca00..c6ccede3 100644
--- a/chrome/browser/chromeos/login/signin_screen_controller.cc
+++ b/chrome/browser/chromeos/login/signin_screen_controller.cc
@@ -8,8 +8,10 @@
 #include "chrome/browser/chromeos/login/lock/screen_locker.h"
 #include "chrome/browser/chromeos/login/screens/chrome_user_selection_screen.h"
 #include "chrome/browser/chromeos/login/ui/views/user_board_view.h"
+#include "chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
+#include "chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h"
 
 namespace chromeos {
 
@@ -20,11 +22,11 @@
   DCHECK(!instance_);
   instance_ = this;
 
-  gaia_screen_->set_view(oobe_ui_->GetGaiaScreenView());
+  gaia_screen_->set_view(oobe_ui_->GetView<GaiaScreenHandler>());
   std::string display_type = oobe_ui->display_type();
   user_selection_screen_.reset(new ChromeUserSelectionScreen(display_type));
 
-  user_board_view_ = oobe_ui_->GetUserBoardView()->GetWeakPtr();
+  user_board_view_ = oobe_ui_->GetView<UserBoardScreenHandler>()->GetWeakPtr();
   user_selection_screen_->SetView(user_board_view_.get());
   // TODO(jdufault): Bind and Unbind should be controlled by either the
   // Model/View which are then each responsible for automatically unbinding the
diff --git a/chrome/browser/chromeos/login/sync_consent_interactive_ui_test.cc b/chrome/browser/chromeos/login/sync_consent_interactive_ui_test.cc
index a95e7d2..75ecdb7 100644
--- a/chrome/browser/chromeos/login/sync_consent_interactive_ui_test.cc
+++ b/chrome/browser/chromeos/login/sync_consent_interactive_ui_test.cc
@@ -133,7 +133,7 @@
     WaitForGaiaPageEvent("ready");
     LoginDisplayHost::default_host()
         ->GetOobeUI()
-        ->GetGaiaScreenView()
+        ->GetView<GaiaScreenHandler>()
         ->ShowSigninScreenForTest(FakeGaiaMixin::kFakeUserEmail,
                                   FakeGaiaMixin::kFakeUserPassword,
                                   FakeGaiaMixin::kEmptyUserServices);
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_common.cc b/chrome/browser/chromeos/login/ui/login_display_host_common.cc
index f7e17be..f641c78 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_common.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_common.cc
@@ -278,13 +278,14 @@
 
   if (prefilled_account) {
     // Make sure gaia displays |account| if requested.
-    if (!GetLoginDisplay()->delegate()->IsSigninInProgress())
-      GetOobeUI()->GetGaiaScreenView()->ShowGaiaAsync(prefilled_account);
+    if (!GetLoginDisplay()->delegate()->IsSigninInProgress()) {
+      GetOobeUI()->GetView<GaiaScreenHandler>()->ShowGaiaAsync(
+          prefilled_account);
+    }
     LoadWallpaper(*prefilled_account);
   } else {
-    if (GetOobeUI()->current_screen() != OobeScreen::SCREEN_GAIA_SIGNIN) {
-      GetOobeUI()->GetGaiaScreenView()->ShowGaiaAsync(base::nullopt);
-    }
+    if (GetOobeUI()->current_screen() != OobeScreen::SCREEN_GAIA_SIGNIN)
+      GetOobeUI()->GetView<GaiaScreenHandler>()->ShowGaiaAsync(base::nullopt);
     LoadSigninWallpaper();
   }
 }
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
index f29b22d..bfb739a2 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
@@ -192,7 +192,7 @@
     // If we already have a signin screen instance, just reset the state of the
     // oobe dialog.
     HideOobeDialog();
-    GetOobeUI()->GetGaiaScreenView()->ShowGaiaAsync(base::nullopt);
+    GetOobeUI()->GetView<GaiaScreenHandler>()->ShowGaiaAsync(base::nullopt);
     return;
   }
 
@@ -221,7 +221,7 @@
     dialog_->Hide();
     // Reset accelerator will not work properly if OOBE UI stays in reset
     // dialog state, so make sure the curren dialog screen changes.
-    GetOobeUI()->GetGaiaScreenView()->ShowGaiaAsync(base::nullopt);
+    GetOobeUI()->GetView<GaiaScreenHandler>()->ShowGaiaAsync(base::nullopt);
     start_delayed_for_oobe_dialog_ = false;
   }
 
@@ -286,7 +286,7 @@
   // The dialog can not be hidden if there are no users on the login screen.
   // Reload it instead.
   if (!login_display_->IsSigninInProgress() && users_.empty()) {
-    GetOobeUI()->GetGaiaScreenView()->ShowGaiaAsync(base::nullopt);
+    GetOobeUI()->GetView<GaiaScreenHandler>()->ShowGaiaAsync(base::nullopt);
     return;
   }
 
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
index 2894dc87..f9e8397 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -1072,7 +1072,7 @@
   if (default_host() && default_host()->GetOobeUI()) {
     default_host()
         ->GetOobeUI()
-        ->GetGaiaScreenView()
+        ->GetView<GaiaScreenHandler>()
         ->DisableRestrictiveProxyCheckForTest();
     disable_restrictive_proxy_check_for_test_ = false;
   } else {
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.cc b/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.cc
index 41a86d7d..320c16d 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.cc
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.cc
@@ -43,22 +43,21 @@
   VLOG(1) << __func__ << " called";
 }
 
-download::Client::ShouldDownload PluginVmImageDownloadClient::OnDownloadStarted(
+void PluginVmImageDownloadClient::OnDownloadStarted(
     const std::string& guid,
     const std::vector<GURL>& url_chain,
     const scoped_refptr<const net::HttpResponseHeaders>& headers) {
   VLOG(1) << __func__ << " called";
   // We do not want downloads that are tracked by download service from its
   // initialization to proceed.
-  if (old_downloads_.find(guid) != old_downloads_.end())
-    return download::Client::ShouldDownload::ABORT;
+  if (old_downloads_.find(guid) != old_downloads_.end()) {
+    DownloadServiceFactory::GetForBrowserContext(profile_)->CancelDownload(
+        guid);
+    return;
+  }
 
-  if (headers)
-    content_length_ = headers->GetContentLength();
-  else
-    content_length_ = -1;
+  content_length_ = headers ? headers->GetContentLength() : -1;
   GetManager()->OnDownloadStarted();
-  return download::Client::ShouldDownload::CONTINUE;
 }
 
 void PluginVmImageDownloadClient::OnDownloadUpdated(const std::string& guid,
diff --git a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.h b/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.h
index 8bccffe..5b1f6f86 100644
--- a/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.h
+++ b/chrome/browser/chromeos/plugin_vm/plugin_vm_image_download_client.h
@@ -39,7 +39,7 @@
       bool state_lost,
       const std::vector<download::DownloadMetaData>& downloads) override;
   void OnServiceUnavailable() override;
-  download::Client::ShouldDownload OnDownloadStarted(
+  void OnDownloadStarted(
       const std::string& guid,
       const std::vector<GURL>& url_chain,
       const scoped_refptr<const net::HttpResponseHeaders>& headers) override;
diff --git a/chrome/browser/chromeos/policy/blocking_login_browsertest.cc b/chrome/browser/chromeos/policy/blocking_login_browsertest.cc
index 7b67402..3d6151b4 100644
--- a/chrome/browser/chromeos/policy/blocking_login_browsertest.cc
+++ b/chrome/browser/chromeos/policy/blocking_login_browsertest.cc
@@ -150,7 +150,7 @@
 
     LoginDisplayHost::default_host()
         ->GetOobeUI()
-        ->GetGaiaScreenView()
+        ->GetView<GaiaScreenHandler>()
         ->ShowSigninScreenForTest(username, "password", "[]");
 
     // Wait for the session to start after submitting the credentials. This
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
index 765dfc69..4011865 100644
--- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -7,6 +7,7 @@
 #include <limits>
 #include <memory>
 #include <string>
+#include <utility>
 
 #include "base/callback.h"
 #include "base/json/json_reader.h"
@@ -745,6 +746,16 @@
                     nullptr);
     }
   }
+
+  if (policy.has_device_scheduled_update_check()) {
+    const em::DeviceScheduledUpdateCheckProto& container(
+        policy.device_scheduled_update_check());
+    if (container.has_device_scheduled_update_check_settings()) {
+      SetJsonDevicePolicy(key::kDeviceScheduledUpdateCheck,
+                          container.device_scheduled_update_check_settings(),
+                          policies);
+    }
+  }
 }
 
 void DecodeAccessibilityPolicies(const em::ChromeDeviceSettingsProto& policy,
diff --git a/chrome/browser/chromeos/policy/login_policy_test_base.cc b/chrome/browser/chromeos/policy/login_policy_test_base.cc
index 6a24fd4..afdb76f 100644
--- a/chrome/browser/chromeos/policy/login_policy_test_base.cc
+++ b/chrome/browser/chromeos/policy/login_policy_test_base.cc
@@ -116,7 +116,7 @@
                                 const std::string& services) {
   chromeos::LoginDisplayHost::default_host()
       ->GetOobeUI()
-      ->GetGaiaScreenView()
+      ->GetView<chromeos::GaiaScreenHandler>()
       ->ShowSigninScreenForTest(user_id, password, services);
 
   content::WindowedNotificationObserver(
diff --git a/chrome/browser/chromeos/policy/site_isolation_flag_handling_browsertest.cc b/chrome/browser/chromeos/policy/site_isolation_flag_handling_browsertest.cc
index 3af697a0..4460fff 100644
--- a/chrome/browser/chromeos/policy/site_isolation_flag_handling_browsertest.cc
+++ b/chrome/browser/chromeos/policy/site_isolation_flag_handling_browsertest.cc
@@ -388,7 +388,7 @@
   SkipToLoginScreen();
   LoginDisplayHost::default_host()
       ->GetOobeUI()
-      ->GetGaiaScreenView()
+      ->GetView<GaiaScreenHandler>()
       ->ShowSigninScreenForTest(kAccountId, kAccountPassword, kEmptyServices);
 
   // Wait for either the user session to start, or for restart to be requested
diff --git a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_browsertest.cc b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_browsertest.cc
index afd1afa..e837e9ad 100644
--- a/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_browsertest.cc
+++ b/chrome/browser/chromeos/policy/user_cloud_policy_manager_chromeos_browsertest.cc
@@ -162,7 +162,7 @@
       content::NotificationService::AllSources());
   chromeos::LoginDisplayHost::default_host()
       ->GetOobeUI()
-      ->GetGaiaScreenView()
+      ->GetView<chromeos::GaiaScreenHandler>()
       ->ShowSigninScreenForTest(kAccountId, kAccountPassword, kEmptyServices);
   RunUntilBrowserProcessQuits();
   // Should not receive a SESSION_STARTED notification.
diff --git a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory_browsertest.cc b/chrome/browser/chromeos/policy/user_network_configuration_updater_factory_browsertest.cc
index d54233d2..709d632c 100644
--- a/chrome/browser/chromeos/policy/user_network_configuration_updater_factory_browsertest.cc
+++ b/chrome/browser/chromeos/policy/user_network_configuration_updater_factory_browsertest.cc
@@ -581,7 +581,7 @@
   void TriggerLogIn() {
     chromeos::LoginDisplayHost::default_host()
         ->GetOobeUI()
-        ->GetGaiaScreenView()
+        ->GetView<chromeos::GaiaScreenHandler>()
         ->ShowSigninScreenForTest(kAccountId, kAccountPassword, kEmptyServices);
   }
 
diff --git a/chrome/browser/chromeos/printing/cups_printers_manager.cc b/chrome/browser/chromeos/printing/cups_printers_manager.cc
index ff54b43..a6dc267 100644
--- a/chrome/browser/chromeos/printing/cups_printers_manager.cc
+++ b/chrome/browser/chromeos/printing/cups_printers_manager.cc
@@ -379,6 +379,10 @@
           if (!printer.supports_ippusb()) {
             // We couldn't figure out this printer, so it's in the discovered
             // class.
+            if (printer.IsUsbProtocol()) {
+              printer.set_manufacturer(
+                  ppd_resolution_tracker_.GetManufacturer(detected_printer_id));
+            }
             printers_[kDiscovered].push_back(printer);
             continue;
           }
@@ -404,7 +408,6 @@
         // PpdReference.  If there's not already an outstanding request for one,
         // start one.  When the request comes back, we'll rerun classification
         // and then should be able to figure out where this printer belongs.
-
         if (!ppd_resolution_tracker_.IsResolutionPending(detected_printer_id)) {
           ppd_resolution_tracker_.MarkResolutionPending(detected_printer_id);
           ppd_provider_->ResolvePpdReference(
@@ -449,12 +452,16 @@
   // Callback invoked on completion of PpdProvider::ResolvePpdReference.
   void ResolvePpdReferenceDone(const std::string& printer_id,
                                PpdProvider::CallbackResultCode code,
-                               const Printer::PpdReference& ref) {
+                               const Printer::PpdReference& ref,
+                               const std::string& usb_manufacturer) {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_);
     if (code == PpdProvider::SUCCESS) {
       ppd_resolution_tracker_.MarkResolutionSuccessful(printer_id, ref);
     } else {
       ppd_resolution_tracker_.MarkResolutionFailed(printer_id);
+      if (!usb_manufacturer.empty()) {
+        ppd_resolution_tracker_.SetManufacturer(printer_id, usb_manufacturer);
+      }
     }
     RebuildDetectedLists();
   }
diff --git a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
index 60fafc4..dda7f74 100644
--- a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
+++ b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
@@ -207,16 +207,22 @@
                            ResolvePpdReferenceCallback cb) override {
     if (search_data.make_and_model.empty()) {
       base::SequencedTaskRunnerHandle::Get()->PostTask(
-          FROM_HERE, base::BindOnce(std::move(cb), PpdProvider::NOT_FOUND,
-                                    Printer::PpdReference()));
+          FROM_HERE,
+          base::BindOnce(std::move(cb), PpdProvider::NOT_FOUND,
+                         Printer::PpdReference(), usb_manufacturer_));
     } else {
       Printer::PpdReference ret;
       ret.effective_make_and_model = search_data.make_and_model[0];
       base::SequencedTaskRunnerHandle::Get()->PostTask(
-          FROM_HERE, base::BindOnce(std::move(cb), PpdProvider::SUCCESS, ret));
+          FROM_HERE, base::BindOnce(std::move(cb), PpdProvider::SUCCESS, ret,
+                                    "" /* usb_manufacturer */));
     }
   }
 
+  void SetUsbManufacturer(const std::string& manufacturer) {
+    usb_manufacturer_ = manufacturer;
+  }
+
   // These three functions are not used by CupsPrintersManager.
   void ResolvePpd(const Printer::PpdReference& reference,
                   ResolvePpdCallback cb) override {}
@@ -228,6 +234,7 @@
 
  private:
   ~FakePpdProvider() override {}
+  std::string usb_manufacturer_;
 };
 
 // Expect that the printers in printers have the given ids, without
@@ -318,12 +325,25 @@
 // this test) be handled as a Discovered printer (because it has no make and
 // model information, and that's now the FakePpdProvider is set up to determine
 // whether or not something has a Ppd available).
-PrinterDetector::DetectedPrinter MakeDiscoveredPrinter(const std::string& id) {
+PrinterDetector::DetectedPrinter MakeDiscoveredPrinter(const std::string& id,
+                                                       const std::string& uri) {
   PrinterDetector::DetectedPrinter ret;
   ret.printer.set_id(id);
+  ret.printer.set_uri(uri);
   return ret;
 }
 
+// Calls MakeDiscoveredPrinter with empty uri.
+PrinterDetector::DetectedPrinter MakeDiscoveredPrinter(const std::string& id) {
+  return MakeDiscoveredPrinter(id, "" /* uri */);
+}
+
+// Calls MakeDiscoveredPrinter with the USB protocol as the uri.
+PrinterDetector::DetectedPrinter MakeUsbDiscoveredPrinter(
+    const std::string& id) {
+  return MakeDiscoveredPrinter(id, "usb:");
+}
+
 // Pseudo-constructor for inline creation of a DetectedPrinter that should (in
 // this test) be handled as an Automatic printer (because it has a make and
 // model string).
@@ -586,5 +606,29 @@
   EXPECT_EQ(enterprise_printer->id(), "Enterprise");
 }
 
+TEST_F(CupsPrintersManagerTest, SetUsbManufacturer) {
+  const std::string& expected_manufacturer = "HP";
+  ppd_provider_->SetUsbManufacturer(expected_manufacturer);
+  usb_detector_->AddDetections({MakeUsbDiscoveredPrinter("DiscoveredPrinter")});
+  scoped_task_environment_.RunUntilIdle();
+
+  ExpectPrintersInClassAre(CupsPrintersManager::kDiscovered,
+                           {"DiscoveredPrinter"});
+
+  EXPECT_EQ(expected_manufacturer,
+            manager_->GetPrinter("DiscoveredPrinter")->manufacturer());
+}
+
+TEST_F(CupsPrintersManagerTest, EmptyUsbManufacturer) {
+  usb_detector_->AddDetections({MakeUsbDiscoveredPrinter("DiscoveredPrinter")});
+  scoped_task_environment_.RunUntilIdle();
+
+  ExpectPrintersInClassAre(CupsPrintersManager::kDiscovered,
+                           {"DiscoveredPrinter"});
+
+  EXPECT_TRUE(
+      manager_->GetPrinter("DiscoveredPrinter")->manufacturer().empty());
+}
+
 }  // namespace
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
index 4408e38..46650a74 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -6,6 +6,7 @@
 
 #include <memory.h>
 #include <stddef.h>
+
 #include <memory>
 #include <utility>
 
@@ -86,6 +87,7 @@
     kDeviceNativePrintersWhitelist,
     kDeviceQuirksDownloadEnabled,
     kDeviceRebootOnUserSignout,
+    kDeviceScheduledUpdateCheck,
     kDeviceUnaffiliatedCrostiniAllowed,
     kDeviceWiFiAllowed,
     kDeviceWilcoDtcAllowed,
@@ -150,7 +152,8 @@
   }
 }
 
-// Puts the policy value into the settings store if only it matches the regex pattern.
+// Puts the policy value into the settings store if only it matches the regex
+// pattern.
 void SetSettingWithValidatingRegex(const std::string& policy_name,
                                    const std::string& policy_value,
                                    const std::string& pattern,
@@ -188,33 +191,33 @@
   new_values_cache->SetBoolean(
       kRebootOnShutdown,
       policy.has_reboot_on_shutdown() &&
-      policy.reboot_on_shutdown().has_reboot_on_shutdown() &&
-      policy.reboot_on_shutdown().reboot_on_shutdown());
+          policy.reboot_on_shutdown().has_reboot_on_shutdown() &&
+          policy.reboot_on_shutdown().reboot_on_shutdown());
 
   new_values_cache->SetBoolean(
       kAccountsPrefAllowGuest,
       !policy.has_guest_mode_enabled() ||
-      !policy.guest_mode_enabled().has_guest_mode_enabled() ||
-      policy.guest_mode_enabled().guest_mode_enabled());
+          !policy.guest_mode_enabled().has_guest_mode_enabled() ||
+          policy.guest_mode_enabled().guest_mode_enabled());
 
   bool supervised_users_enabled = false;
   if (!InstallAttributes::Get()->IsEnterpriseManaged()) {
     supervised_users_enabled = true;
   }
-  new_values_cache->SetBoolean(
-      kAccountsPrefSupervisedUsersEnabled, supervised_users_enabled);
+  new_values_cache->SetBoolean(kAccountsPrefSupervisedUsersEnabled,
+                               supervised_users_enabled);
 
   new_values_cache->SetBoolean(
       kAccountsPrefShowUserNamesOnSignIn,
       !policy.has_show_user_names() ||
-      !policy.show_user_names().has_show_user_names() ||
-      policy.show_user_names().show_user_names());
+          !policy.show_user_names().has_show_user_names() ||
+          policy.show_user_names().show_user_names());
 
   new_values_cache->SetBoolean(
       kAccountsPrefEphemeralUsersEnabled,
       policy.has_ephemeral_users_enabled() &&
-      policy.ephemeral_users_enabled().has_ephemeral_users_enabled() &&
-      policy.ephemeral_users_enabled().ephemeral_users_enabled());
+          policy.ephemeral_users_enabled().has_ephemeral_users_enabled() &&
+          policy.ephemeral_users_enabled().ephemeral_users_enabled());
 
   std::vector<base::Value> list;
   const em::UserWhitelistProto& whitelist_proto = policy.user_whitelist();
@@ -394,20 +397,18 @@
   }
 }
 
-void DecodeNetworkPolicies(
-    const em::ChromeDeviceSettingsProto& policy,
-    PrefValueMap* new_values_cache) {
+void DecodeNetworkPolicies(const em::ChromeDeviceSettingsProto& policy,
+                           PrefValueMap* new_values_cache) {
   // kSignedDataRoamingEnabled has a default value of false.
   new_values_cache->SetBoolean(
       kSignedDataRoamingEnabled,
       policy.has_data_roaming_enabled() &&
-      policy.data_roaming_enabled().has_data_roaming_enabled() &&
-      policy.data_roaming_enabled().data_roaming_enabled());
+          policy.data_roaming_enabled().has_data_roaming_enabled() &&
+          policy.data_roaming_enabled().data_roaming_enabled());
 }
 
-void DecodeAutoUpdatePolicies(
-    const em::ChromeDeviceSettingsProto& policy,
-    PrefValueMap* new_values_cache) {
+void DecodeAutoUpdatePolicies(const em::ChromeDeviceSettingsProto& policy,
+                              PrefValueMap* new_values_cache) {
   if (policy.has_auto_update_settings()) {
     const em::AutoUpdateSettingsProto& au_settings_proto =
         policy.auto_update_settings();
@@ -439,28 +440,37 @@
                            new_values_cache);
     }
   }
+
+  if (policy.has_device_scheduled_update_check()) {
+    const em::DeviceScheduledUpdateCheckProto& scheduled_update_check_policy =
+        policy.device_scheduled_update_check();
+    if (scheduled_update_check_policy
+            .has_device_scheduled_update_check_settings()) {
+      SetJsonDeviceSetting(kDeviceScheduledUpdateCheck,
+                           policy::key::kDeviceScheduledUpdateCheck,
+                           scheduled_update_check_policy
+                               .device_scheduled_update_check_settings(),
+                           new_values_cache);
+    }
+  }
 }
 
-void DecodeReportingPolicies(
-    const em::ChromeDeviceSettingsProto& policy,
-    PrefValueMap* new_values_cache) {
+void DecodeReportingPolicies(const em::ChromeDeviceSettingsProto& policy,
+                             PrefValueMap* new_values_cache) {
   if (policy.has_device_reporting()) {
     const em::DeviceReportingProto& reporting_policy =
         policy.device_reporting();
     if (reporting_policy.has_report_version_info()) {
-      new_values_cache->SetBoolean(
-          kReportDeviceVersionInfo,
-          reporting_policy.report_version_info());
+      new_values_cache->SetBoolean(kReportDeviceVersionInfo,
+                                   reporting_policy.report_version_info());
     }
     if (reporting_policy.has_report_activity_times()) {
-      new_values_cache->SetBoolean(
-          kReportDeviceActivityTimes,
-          reporting_policy.report_activity_times());
+      new_values_cache->SetBoolean(kReportDeviceActivityTimes,
+                                   reporting_policy.report_activity_times());
     }
     if (reporting_policy.has_report_boot_mode()) {
-      new_values_cache->SetBoolean(
-          kReportDeviceBootMode,
-          reporting_policy.report_boot_mode());
+      new_values_cache->SetBoolean(kReportDeviceBootMode,
+                                   reporting_policy.report_boot_mode());
     }
     if (reporting_policy.has_report_network_interfaces()) {
       new_values_cache->SetBoolean(
@@ -468,19 +478,16 @@
           reporting_policy.report_network_interfaces());
     }
     if (reporting_policy.has_report_users()) {
-      new_values_cache->SetBoolean(
-          kReportDeviceUsers,
-          reporting_policy.report_users());
+      new_values_cache->SetBoolean(kReportDeviceUsers,
+                                   reporting_policy.report_users());
     }
     if (reporting_policy.has_report_hardware_status()) {
-      new_values_cache->SetBoolean(
-          kReportDeviceHardwareStatus,
-          reporting_policy.report_hardware_status());
+      new_values_cache->SetBoolean(kReportDeviceHardwareStatus,
+                                   reporting_policy.report_hardware_status());
     }
     if (reporting_policy.has_report_session_status()) {
-      new_values_cache->SetBoolean(
-          kReportDeviceSessionStatus,
-          reporting_policy.report_session_status());
+      new_values_cache->SetBoolean(kReportDeviceSessionStatus,
+                                   reporting_policy.report_session_status());
     }
     if (reporting_policy.has_report_os_update_status()) {
       new_values_cache->SetBoolean(kReportOsUpdateStatus,
@@ -503,30 +510,26 @@
                                    reporting_policy.report_board_status());
     }
     if (reporting_policy.has_device_status_frequency()) {
-      new_values_cache->SetInteger(
-          kReportUploadFrequency,
-          reporting_policy.device_status_frequency());
+      new_values_cache->SetInteger(kReportUploadFrequency,
+                                   reporting_policy.device_status_frequency());
     }
   }
 }
 
-void DecodeHeartbeatPolicies(
-    const em::ChromeDeviceSettingsProto& policy,
-    PrefValueMap* new_values_cache) {
+void DecodeHeartbeatPolicies(const em::ChromeDeviceSettingsProto& policy,
+                             PrefValueMap* new_values_cache) {
   if (!policy.has_device_heartbeat_settings())
     return;
 
   const em::DeviceHeartbeatSettingsProto& heartbeat_policy =
       policy.device_heartbeat_settings();
   if (heartbeat_policy.has_heartbeat_enabled()) {
-    new_values_cache->SetBoolean(
-        kHeartbeatEnabled,
-        heartbeat_policy.heartbeat_enabled());
+    new_values_cache->SetBoolean(kHeartbeatEnabled,
+                                 heartbeat_policy.heartbeat_enabled());
   }
   if (heartbeat_policy.has_heartbeat_frequency()) {
-    new_values_cache->SetInteger(
-        kHeartbeatFrequency,
-        heartbeat_policy.heartbeat_frequency());
+    new_values_cache->SetInteger(kHeartbeatFrequency,
+                                 heartbeat_policy.heartbeat_frequency());
   }
 }
 
@@ -560,9 +563,8 @@
 
   if (policy.has_system_timezone()) {
     if (policy.system_timezone().has_timezone()) {
-      new_values_cache->SetString(
-          kSystemTimezonePolicy,
-          policy.system_timezone().timezone());
+      new_values_cache->SetString(kSystemTimezonePolicy,
+                                  policy.system_timezone().timezone());
     }
   }
 
@@ -579,15 +581,12 @@
         kAllowRedeemChromeOsRegistrationOffers,
         policy.allow_redeem_offers().allow_redeem_offers());
   } else {
-    new_values_cache->SetBoolean(
-        kAllowRedeemChromeOsRegistrationOffers,
-        true);
+    new_values_cache->SetBoolean(kAllowRedeemChromeOsRegistrationOffers, true);
   }
 
   if (policy.has_variations_parameter()) {
-    new_values_cache->SetString(
-        kVariationsRestrictParameter,
-        policy.variations_parameter().parameter());
+    new_values_cache->SetString(kVariationsRestrictParameter,
+                                policy.variations_parameter().parameter());
   }
 
   new_values_cache->SetBoolean(
@@ -906,8 +905,8 @@
     // Temporary store new setting in
     // |device_settings_|. |device_settings_| will be stored on a disk
     // as soon as an ownership of device the will be taken.
-    OwnerSettingsServiceChromeOS::UpdateDeviceSettings(
-        path, in_value, device_settings_);
+    OwnerSettingsServiceChromeOS::UpdateDeviceSettings(path, in_value,
+                                                       device_settings_);
     em::PolicyData data;
     data.set_username(device_settings_service_->GetUsername());
     CHECK(device_settings_.SerializeToString(data.mutable_policy_value()));
@@ -1094,7 +1093,7 @@
 }
 
 DeviceSettingsProvider::TrustedStatus
-    DeviceSettingsProvider::PrepareTrustedValues(const base::Closure& cb) {
+DeviceSettingsProvider::PrepareTrustedValues(const base::Closure& cb) {
   TrustedStatus status = RequestTrustedEntity();
   if (status == TEMPORARILY_UNTRUSTED && !cb.is_null())
     callbacks_.push_back(cb);
@@ -1106,7 +1105,7 @@
 }
 
 DeviceSettingsProvider::TrustedStatus
-    DeviceSettingsProvider::RequestTrustedEntity() {
+DeviceSettingsProvider::RequestTrustedEntity() {
   if (ownership_status_ == DeviceSettingsService::OWNERSHIP_NONE)
     return TRUSTED;
   return trusted_status_;
diff --git a/chrome/browser/download/download_offline_content_provider.cc b/chrome/browser/download/download_offline_content_provider.cc
index ad28b7ed..eac5366 100644
--- a/chrome/browser/download/download_offline_content_provider.cc
+++ b/chrome/browser/download/download_offline_content_provider.cc
@@ -149,11 +149,16 @@
 
 void DownloadOfflineContentProvider::GetVisualsForItem(
     const ContentId& id,
+    GetVisualsOptions options,
     VisualsCallback callback) {
   // TODO(crbug.com/855330) Supply thumbnail if item is visible.
   DownloadItem* item = GetDownload(id.id);
-  if (!item)
+  if (!item || !options.get_icon) {
+    // No favicon is available; run the callback without visuals.
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(callback), id, nullptr));
     return;
+  }
 
   display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay();
   int icon_size = kThumbnailSizeInDP * display.device_scale_factor();
diff --git a/chrome/browser/download/download_offline_content_provider.h b/chrome/browser/download/download_offline_content_provider.h
index 009401c..2ae6bd68 100644
--- a/chrome/browser/download/download_offline_content_provider.h
+++ b/chrome/browser/download/download_offline_content_provider.h
@@ -52,6 +52,7 @@
       OfflineContentProvider::MultipleItemCallback callback) override;
   void GetVisualsForItem(
       const ContentId& id,
+      GetVisualsOptions options,
       OfflineContentProvider::VisualsCallback callback) override;
   void GetShareInfoForItem(const ContentId& id,
                            ShareCallback callback) override;
diff --git a/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc b/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc
index e3c8e69..2e601f54 100644
--- a/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc
+++ b/chrome/browser/extensions/api/cast_streaming/cast_streaming_apitest.cc
@@ -8,10 +8,10 @@
 #include <algorithm>
 #include <cmath>
 #include <memory>
+#include <utility>
 #include <vector>
 
 #include "base/bind.h"
-#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
@@ -152,7 +152,7 @@
     if (done_callback_.is_null())
       return;
     if (expected_tones_.empty() && expected_yuv_colors_.empty()) {
-      base::ResetAndReturn(&done_callback_).Run();
+      std::move(done_callback_).Run();
     } else {
       LOG(INFO) << "Waiting to encounter " << expected_tones_.size()
                 << " more tone(s) and " << expected_yuv_colors_.size()
diff --git a/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc b/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc
index e01e92e..9c392de8 100644
--- a/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc
+++ b/chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.cc
@@ -5,9 +5,9 @@
 #include "chrome/browser/extensions/api/debugger/extension_dev_tools_infobar.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/bind.h"
-#include "base/callback_helpers.h"
 #include "base/lazy_instance.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/devtools/global_confirm_info_bar.h"
@@ -65,7 +65,7 @@
 void ExtensionDevToolsInfoBarDelegate::InfoBarDismissed() {
   DCHECK(!dismissed_callback_.is_null());
   // Use ResetAndReturn() since running the callback may delete |this|.
-  base::ResetAndReturn(&dismissed_callback_).Run();
+  std::move(dismissed_callback_).Run();
 }
 
 base::string16 ExtensionDevToolsInfoBarDelegate::GetMessageText() const {
diff --git a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
index 2e5b7499..c885dc1a 100644
--- a/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
+++ b/chrome/browser/extensions/api/developer_private/extension_info_generator.cc
@@ -12,7 +12,6 @@
 
 #include "base/base64.h"
 #include "base/bind.h"
-#include "base/callback_helpers.h"
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
 #include "base/stl_util.h"
@@ -781,7 +780,7 @@
   if (pending_image_loads_ == 0) {  // All done!
     ExtensionInfoList list = std::move(list_);
     list_.clear();
-    base::ResetAndReturn(&callback_).Run(std::move(list));
+    std::move(callback_).Run(std::move(list));
     // WARNING: |this| is possibly deleted after this line!
   }
 }
diff --git a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
index c4d58486..d0999fd 100644
--- a/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
+++ b/chrome/browser/extensions/api/management/chrome_management_api_delegate.cc
@@ -5,9 +5,9 @@
 #include "chrome/browser/extensions/api/management/chrome_management_api_delegate.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/bind.h"
-#include "base/callback_helpers.h"
 #include "base/macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
diff --git a/chrome/browser/extensions/clipboard_extension_helper_chromeos.cc b/chrome/browser/extensions/clipboard_extension_helper_chromeos.cc
index 4118050..a7e8139 100644
--- a/chrome/browser/extensions/clipboard_extension_helper_chromeos.cc
+++ b/chrome/browser/extensions/clipboard_extension_helper_chromeos.cc
@@ -4,7 +4,8 @@
 
 #include "chrome/browser/extensions/clipboard_extension_helper_chromeos.h"
 
-#include "base/callback_helpers.h"
+#include <utility>
+
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/string_util.h"
@@ -104,8 +105,7 @@
 }
 
 void ClipboardExtensionHelper::OnImageDecodeFailure() {
-  base::ResetAndReturn(&image_save_error_callback_)
-      .Run("Image data decoding failed.");
+  std::move(image_save_error_callback_).Run("Image data decoding failed.");
 }
 
 void ClipboardExtensionHelper::OnImageDecoded(const SkBitmap& bitmap) {
@@ -122,11 +122,11 @@
         scw.WriteHTML(base::UTF8ToUTF16(item.data), std::string());
     }
   }
-  base::ResetAndReturn(&image_save_success_callback_).Run();
+  std::move(image_save_success_callback_).Run();
 }
 
 void ClipboardExtensionHelper::OnImageDecodeCancel() {
-  base::ResetAndReturn(&image_save_error_callback_).Run("Request canceled.");
+  std::move(image_save_error_callback_).Run("Request canceled.");
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc
index c445a39..ef0f7fb 100644
--- a/chrome/browser/extensions/extension_install_prompt.cc
+++ b/chrome/browser/extensions/extension_install_prompt.cc
@@ -7,7 +7,6 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/callback_helpers.h"
 #include "base/location.h"
 #include "base/single_thread_task_runner.h"
 #include "base/strings/string_number_conversions.h"
@@ -574,7 +573,7 @@
   // immediately installed, and then we show an infobar (see OnInstallSuccess)
   // to allow the user to revert if they don't like it.
   if (extension->is_theme() && extension->from_webstore()) {
-    base::ResetAndReturn(&done_callback_).Run(Result::ACCEPTED);
+    std::move(done_callback_).Run(Result::ACCEPTED);
     return;
   }
 
@@ -679,7 +678,7 @@
   prompt_->set_icon(gfx::Image::CreateFrom1xBitmap(icon_));
 
   if (show_params_->WasParentDestroyed()) {
-    base::ResetAndReturn(&done_callback_).Run(Result::ABORTED);
+    std::move(done_callback_).Run(Result::ABORTED);
     return;
   }
 
@@ -691,7 +690,6 @@
 
   if (show_dialog_callback_.is_null())
     show_dialog_callback_ = GetDefaultShowDialogCallback();
-  base::ResetAndReturn(&show_dialog_callback_)
-      .Run(show_params_.get(), base::ResetAndReturn(&done_callback_),
-           std::move(prompt_));
+  std::move(show_dialog_callback_)
+      .Run(show_params_.get(), std::move(done_callback_), std::move(prompt_));
 }
diff --git a/chrome/browser/extensions/extension_message_bubble_controller.cc b/chrome/browser/extensions/extension_message_bubble_controller.cc
index b321c50..d965c45 100644
--- a/chrome/browser/extensions/extension_message_bubble_controller.cc
+++ b/chrome/browser/extensions/extension_message_bubble_controller.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/extensions/extension_message_bubble_controller.h"
 
 #include <memory>
+#include <utility>
 
 #include "base/bind.h"
 #include "base/lazy_instance.h"
@@ -281,7 +282,7 @@
   // If the callback is set, then that means that OnShown() was called, and the
   // bubble was displayed.
   if (close_bubble_callback_ && GetExtensionIdList().empty()) {
-    base::ResetAndReturn(&close_bubble_callback_).Run();
+    std::move(close_bubble_callback_).Run();
   }
   // If the bubble refers to multiple extensions, we do not close the bubble.
 }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index f952b3340..f32f4eb 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1476,6 +1476,11 @@
     "expiry_milestone": 76
   },
   {
+    "name": "enable-process-sharing-with-strict-site-instances",
+    "owners": [ "japhet" ],
+    "expiry_milestone": 80
+  },
+  {
     "name": "enable-query-in-omnibox",
     "owners": [ "tommycli", "chrome-omnibox-team@google.com" ],
     "expiry_milestone": 76
@@ -1921,7 +1926,7 @@
   {
     "name": "enable-webvr",
     "owners": [ "//third_party/blink/renderer/modules/vr/OWNERS", "xr-dev@chromium.org" ],
-    "expiry_milestone": 76
+    "expiry_milestone": 79
   },
   {
     "name": "enable-zero-copy",
@@ -1964,6 +1969,11 @@
     "expiry_milestone": 76
   },
   {
+    "name": "enterprise-reporting-in-browser",
+    "owners": [ "pastarmovj", "zmin" ],
+    "expiry_milestone": 79
+  },
+  {
     "name": "expensive-background-timer-throttling",
     "owners": [ "altimin" ],
     "expiry_milestone": 76
@@ -2008,7 +2018,7 @@
   {
     "name": "fill-on-account-select",
     "owners": [ "jdoerrie" ],
-    "expiry_milestone": 76
+    "expiry_milestone": 80
   },
   {
     "name": "fill-on-account-select-http",
@@ -2341,7 +2351,7 @@
   {
     "name": "oculus-vr",
     "owners": [ "//device/vr/OWNERS", "xr-dev@chromium.org" ],
-    "expiry_milestone": 76
+    "expiry_milestone": 79
   },
   {
     "name": "offline-indicator-always-http-probe",
@@ -2601,7 +2611,7 @@
   {
     "name": "openvr",
     "owners": [ "//device/vr/OWNERS", "xr-dev@chromium.org" ],
-    "expiry_milestone": 76
+    "expiry_milestone": 79
   },
   {
     "name": "out-of-blink-cors",
@@ -3085,22 +3095,27 @@
   {
     "name": "webxr-hit-test",
     "owners": [ "//third_party/blink/renderer/modules/xr/OWNERS", "xr-dev@chromium.org" ],
-    "expiry_milestone": 76
+    "expiry_milestone": 79
   },
   {
     "name": "webxr-orientation-sensor-device",
     "owners": [ "//device/vr/OWNERS", "xr-dev@chromium.org" ],
-    "expiry_milestone": 76
+    "expiry_milestone": 79
+  },
+  {
+    "name": "webxr-plane-detection",
+    "owners": [ "//third_party/blink/renderer/modules/xr/OWNERS", "xr-dev@chromium.org" ],
+    "expiry_milestone": 79
   },
   {
     "name": "windows-mixed-reality",
     "owners": [ "//device/vr/OWNERS", "xr-dev@chromium.org" ],
-    "expiry_milestone": 76
+    "expiry_milestone": 79
   },
   {
     "name": "xr-sandbox",
     "owners": [ "//chrome/services/isolated_xr_device/OWNERS", "xr-dev@chromium.org" ],
-    "expiry_milestone": 76
+    "expiry_milestone": 79
   },
   {
     "name": "enable-streamlined-usb-printer-setup",
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 2f1bf23..53d055b 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -2156,6 +2156,10 @@
 const char kWebXrHitTestDescription[] =
     "Enables access to raycasting against estimated XR scene geometry.";
 
+const char kWebXrPlaneDetectionName[] = "WebXR Plane Detection";
+const char kWebXrPlaneDetectionDescription[] =
+    "Enables access to planes detected in the user's environment.";
+
 const char kZeroCopyName[] = "Zero-copy rasterizer";
 const char kZeroCopyDescription[] =
     "Raster threads write directly to GPU memory associated with tiles.";
@@ -2623,6 +2627,18 @@
     "#site-isolation-trial-opt-out for how to disable site isolation for "
     "testing.";
 
+extern const char kProcessSharingWithStrictSiteInstancesName[] =
+    "Process sharing with strict site instances";
+extern const char kProcessSharingWithStrictSiteInstancesDescription[] =
+    "When site isolation is disabled, this mode changes how sites are lumped "
+    "in to a shared process. Process selection is usually controlled with "
+    "site instances. With strict site isolation, each site on a page gets its "
+    "own site instance and process. With site isolation disabled and without "
+    "this mode, all sites that share a process are put into the same site "
+    "instance. This mode adds a third way: site instances are strictly "
+    "separated like strict site isolation, but process selection puts multiple "
+    "site instances in a single process.";
+
 const char kTranslateAndroidManualTriggerName[] =
     "Enable manual translate trigger";
 const char kTranslateAndroidManualTriggerDescription[] =
@@ -2719,6 +2735,13 @@
     "implementation from the real world, and allows configuring virtual "
     "authenticator devices for testing";
 
+const char kEnterpriseReportingInBrowserName[] =
+    "Enterprise cloud reporting in browser";
+const char kEnterpriseReportingInBrowserDescription[] =
+    "Enable the enterprise cloud reporting in browser without installing the "
+    "reporting companion extension. This feautre requires device level cloud "
+    "mangement.";
+
 const char kHappinessTrackingSurveysForDesktopName[] =
     "Happiness Tracking Surveys";
 const char kHappinessTrackingSurveysForDesktopDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 4d78110..0dddb17 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1285,6 +1285,9 @@
 extern const char kWebXrHitTestName[];
 extern const char kWebXrHitTestDescription[];
 
+extern const char kWebXrPlaneDetectionName[];
+extern const char kWebXrPlaneDetectionDescription[];
+
 extern const char kZeroCopyName[];
 extern const char kZeroCopyDescription[];
 
@@ -1560,6 +1563,9 @@
 extern const char kStrictSiteIsolationName[];
 extern const char kStrictSiteIsolationDescription[];
 
+extern const char kProcessSharingWithStrictSiteInstancesName[];
+extern const char kProcessSharingWithStrictSiteInstancesDescription[];
+
 extern const char kTranslateAndroidManualTriggerName[];
 extern const char kTranslateAndroidManualTriggerDescription[];
 
@@ -1621,6 +1627,9 @@
 extern const char kEnableWebAuthenticationTestingAPIName[];
 extern const char kEnableWebAuthenticationTestingAPIDescription[];
 
+extern const char kEnterpriseReportingInBrowserName[];
+extern const char kEnterpriseReportingInBrowserDescription[];
+
 extern const char kHappinessTrackingSurveysForDesktopName[];
 extern const char kHappinessTrackingSurveysForDesktopDescription[];
 
diff --git a/chrome/browser/memory/memory_pressure_monitor_utils.cc b/chrome/browser/memory/memory_pressure_monitor_utils.cc
index 79f9fbc..b98e563 100644
--- a/chrome/browser/memory/memory_pressure_monitor_utils.cc
+++ b/chrome/browser/memory/memory_pressure_monitor_utils.cc
@@ -15,11 +15,11 @@
 
 FreeMemoryObservationWindow::~FreeMemoryObservationWindow() = default;
 
-bool FreeMemoryObservationWindow::MemoryIsUnderEarlyLimit() {
+bool FreeMemoryObservationWindow::MemoryIsUnderEarlyLimit() const {
   return MemoryIsUnderLimitImpl(sample_below_early_limit_count_);
 }
 
-bool FreeMemoryObservationWindow::MemoryIsUnderCriticalLimit() {
+bool FreeMemoryObservationWindow::MemoryIsUnderCriticalLimit() const {
   return MemoryIsUnderLimitImpl(sample_below_critical_limit_count_);
 }
 
@@ -38,7 +38,7 @@
 }
 
 bool FreeMemoryObservationWindow::MemoryIsUnderLimitImpl(
-    size_t sample_under_limit_cnt) {
+    size_t sample_under_limit_cnt) const {
   size_t sample_count = SampleCount();
   if (sample_count < config_.min_sample_count)
     return false;
@@ -56,7 +56,7 @@
 
 DiskIdleTimeObservationWindow::~DiskIdleTimeObservationWindow() = default;
 
-bool DiskIdleTimeObservationWindow::DiskIdleTimeIsLow() {
+bool DiskIdleTimeObservationWindow::DiskIdleTimeIsLow() const {
   if (SampleCount() == 0)
     return false;
   DCHECK_GE(sum_, 0.0);
diff --git a/chrome/browser/memory/memory_pressure_monitor_utils.h b/chrome/browser/memory/memory_pressure_monitor_utils.h
index c43c3be..eea4d49 100644
--- a/chrome/browser/memory/memory_pressure_monitor_utils.h
+++ b/chrome/browser/memory/memory_pressure_monitor_utils.h
@@ -37,7 +37,7 @@
   void OnSample(const T sample);
 
   // Returns the number of samples in this window.
-  size_t SampleCount() { return observations_.size(); }
+  size_t SampleCount() const { return observations_.size(); }
 
  protected:
   using Observation = std::pair<const base::TimeTicks, const T>;
@@ -109,8 +109,10 @@
   ~FreeMemoryObservationWindow() override;
 
   // Check if the memory is under one of the limits.
-  bool MemoryIsUnderEarlyLimit();
-  bool MemoryIsUnderCriticalLimit();
+  bool MemoryIsUnderEarlyLimit() const;
+  bool MemoryIsUnderCriticalLimit() const;
+
+  const Config& config_for_testing() const { return config_; }
 
  private:
   FRIEND_TEST_ALL_PREFIXES(ObservationWindowTest, FreeMemoryObservationWindow);
@@ -119,7 +121,7 @@
   void OnSampleAdded(const int& sample) override;
   void OnSampleRemoved(const int& sample) override;
 
-  bool MemoryIsUnderLimitImpl(size_t sample_under_limit_cnt);
+  bool MemoryIsUnderLimitImpl(size_t sample_under_limit_cnt) const;
 
   // The current number of samples that are below each threshold.
   size_t sample_below_early_limit_count_ = 0;
@@ -151,7 +153,7 @@
   ~DiskIdleTimeObservationWindow() override;
 
   // Check if the disk idle time was low over the observation period.
-  bool DiskIdleTimeIsLow();
+  bool DiskIdleTimeIsLow() const;
 
  private:
   FRIEND_TEST_ALL_PREFIXES(ObservationWindowTest,
diff --git a/chrome/browser/memory/memory_pressure_monitor_win.cc b/chrome/browser/memory/memory_pressure_monitor_win.cc
index 984fa69..00d4d48 100644
--- a/chrome/browser/memory/memory_pressure_monitor_win.cc
+++ b/chrome/browser/memory/memory_pressure_monitor_win.cc
@@ -4,12 +4,193 @@
 
 #include "chrome/browser/memory/memory_pressure_monitor_win.h"
 
+#include <windows.h>
+
 #include "base/logging.h"
+#include "base/time/time.h"
 
 namespace memory {
 
-MemoryPressureMonitorWin::MemoryPressureMonitorWin() = default;
+namespace {
+
+using SamplingFrequency = performance_monitor::SystemMonitor::SamplingFrequency;
+
+const DWORDLONG kMBBytes = 1024 * 1024;
+
+// TODO(sebmarchand): Turn all these constants into base::FeatureParam and run
+// some experiments to find the best values.
+
+// Disk idle time is usually almost null (according to the
+// 'PerformanceMonitor.SystemMonitor.DiskIdleTime' metric) when the system is
+// under memory pressure, and it's usually at 100% the rest of the time. Using a
+// threshold of 30% should be a good indicator that there's a lot of I/O
+// activity that might be caused by memory pressure if the free physical memory
+// is low.
+const float kDiskIdleTimeLowThreshold = 0.3;
+
+// A disk idle time observation window of 6 seconds combined with the threshold
+// specified above should be sufficient to determine that there's a high and
+// sustained I/O activity.
+constexpr base::TimeDelta kDiskIdleTimeWindowLength =
+    base::TimeDelta::FromSeconds(6);
+
+// A system is considered 'high memory' if it has more than 1.5GB of system
+// memory available for use by the memory manager (not reserved for hardware
+// and drivers). This is a fuzzy version of the ~2GB discussed below.
+const int kLargeMemoryThresholdMb = 1536;
+
+// The limits below have been lifted from similar values in the
+// base::MemoryPressureMonitor code. They have been slightly increased to
+// account for the fact that the memory pressure signal aren't based solely on
+// these values.
+
+// These are the default thresholds used for systems with < ~2GB of physical
+// memory. Such systems have been observed to always maintain ~100MB of
+// available memory, paging until that is the case. To try to avoid paging a
+// threshold slightly above this is chosen. The early threshold is slightly less
+// grounded in reality and chosen as 2x critical.
+const int kSmallMemoryDefaultEarlyThresholdMb = 600;
+const int kSmallMemoryDefaultCriticalThresholdMb = 300;
+
+// These are the default thresholds used for systems with >= ~2GB of physical
+// memory. Such systems have been observed to always maintain ~300MB of
+// available memory, paging until that is the case.
+const int kLargeMemoryDefaultEarlyThresholdMb = 1000;
+const int kLargeMemoryDefaultCriticalThresholdMb = 500;
+
+// A window length of 10 seconds should be sufficient to determine that the
+// system is under pressure. A shorter window will lead to too many false
+// positives (e.g. a brief memory spike will be treated as a memory pressure
+// event) and a longer one will delay the response to memory pressure.
+constexpr base::TimeDelta kFreeMemoryWindowLength =
+    base::TimeDelta::FromSeconds(10);
+
+// If 40% of the samples in the free physical memory observation window have a
+// value lower than one of the threshold then the window will consider that the
+// memory is under this limit. This makes this signal more stable if the memory
+// varies a lot (which can happen if the system is actively trying to free some
+// memory).
+const float kFreeMemorySampleRatioToBePositive = 0.4;
+
+FreeMemoryObservationWindow::Config GetFreeMemoryWindowConfig() {
+  // Default to a 'high' memory situation, which uses more conservative
+  // thresholds.
+  bool high_memory = true;
+  MEMORYSTATUSEX mem_status = {};
+  mem_status.dwLength = sizeof(mem_status);
+  if (::GlobalMemoryStatusEx(&mem_status)) {
+    static const DWORDLONG kLargeMemoryThresholdBytes =
+        static_cast<DWORDLONG>(kLargeMemoryThresholdMb) * kMBBytes;
+    high_memory = mem_status.ullTotalPhys >= kLargeMemoryThresholdBytes;
+  }
+
+  int low_memory_early_limit_mb = kSmallMemoryDefaultEarlyThresholdMb;
+  int low_memory_critical_limit_mb = kSmallMemoryDefaultCriticalThresholdMb;
+
+  if (high_memory) {
+    low_memory_early_limit_mb = kLargeMemoryDefaultEarlyThresholdMb;
+    low_memory_critical_limit_mb = kLargeMemoryDefaultCriticalThresholdMb;
+  }
+
+  return {
+      .low_memory_early_limit_mb = low_memory_early_limit_mb,
+      .low_memory_critical_limit_mb = low_memory_critical_limit_mb,
+      .sample_ratio_to_be_positive = kFreeMemorySampleRatioToBePositive,
+  };
+}
+
+}  // namespace
+
+MemoryPressureMonitorWin::MemoryPressureMonitorWin()
+    : free_memory_obs_window_(kFreeMemoryWindowLength,
+                              GetFreeMemoryWindowConfig()),
+      disk_idle_time_obs_window_(kDiskIdleTimeWindowLength,
+                                 kDiskIdleTimeLowThreshold) {
+  // The amount of free memory is always tracked.
+  refresh_frequencies_ = {
+      .free_phys_memory_mb_frequency = SamplingFrequency::kDefaultFrequency,
+  };
+  performance_monitor::SystemMonitor::Get()->AddOrUpdateObserver(
+      this, refresh_frequencies_);
+}
 
 MemoryPressureMonitorWin::~MemoryPressureMonitorWin() = default;
 
+void MemoryPressureMonitorWin::OnFreePhysicalMemoryMbSample(
+    int free_phys_memory_mb) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  free_memory_obs_window_.OnSample(free_phys_memory_mb);
+  OnObservationWindowUpdate();
+}
+
+void MemoryPressureMonitorWin::OnDiskIdleTimePercent(
+    float disk_idle_time_percent) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  disk_idle_time_obs_window_.OnSample(disk_idle_time_percent);
+  OnObservationWindowUpdate();
+}
+
+void MemoryPressureMonitorWin::OnObservationWindowUpdate() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  base::MemoryPressureListener::MemoryPressureLevel new_level =
+      MemoryPressureMonitorWin::CheckObservationWindowsAndComputeLevel();
+
+  if (new_level != memory_pressure_level_) {
+    // TODO(sebmarchand): Implement
+    // MemoryPressureMonitor::OnMemoryPressureLevelChange and call it here.
+    memory_pressure_level_ = new_level;
+  }
+}
+
+base::MemoryPressureListener::MemoryPressureLevel
+MemoryPressureMonitorWin::CheckObservationWindowsAndComputeLevel() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (free_memory_obs_window_.MemoryIsUnderEarlyLimit()) {
+    // Enable the tracking of the disk idle time if needed.
+    if (refresh_frequencies_.disk_idle_time_percent_frequency ==
+        SamplingFrequency::kNoSampling) {
+      refresh_frequencies_.disk_idle_time_percent_frequency =
+          SamplingFrequency::kDefaultFrequency;
+      performance_monitor::SystemMonitor::Get()->AddOrUpdateObserver(
+          this, refresh_frequencies_);
+      // Don't return here, the disk idle time observation window might already
+      // contain enough recent samples to make a decision.
+      //
+      // TODO(sebmarchand): Maybe set the memory pressure level as moderate?
+      // It's not clear of what moderate will mean with the new signal yet (it
+      // might simply go away) but it could maybe be used as an internal level
+      // anyway.
+    }
+  } else {
+    // Disable the tracking of the disk idle time if it's enabled.
+    if (refresh_frequencies_.disk_idle_time_percent_frequency !=
+        SamplingFrequency::kNoSampling) {
+      refresh_frequencies_.disk_idle_time_percent_frequency =
+          SamplingFrequency::kNoSampling;
+      performance_monitor::SystemMonitor::Get()->AddOrUpdateObserver(
+          this, refresh_frequencies_);
+      // No need to continue after this.
+      return base::MemoryPressureListener::MemoryPressureLevel::
+          MEMORY_PRESSURE_LEVEL_NONE;
+    }
+  }
+
+  // Check all the conditions one by one, if they're all true then the system is
+  // under pressure.
+
+  if (!free_memory_obs_window_.MemoryIsUnderCriticalLimit()) {
+    return base::MemoryPressureListener::MemoryPressureLevel::
+        MEMORY_PRESSURE_LEVEL_NONE;
+  }
+
+  if (!disk_idle_time_obs_window_.DiskIdleTimeIsLow()) {
+    return base::MemoryPressureListener::MemoryPressureLevel::
+        MEMORY_PRESSURE_LEVEL_NONE;
+  }
+
+  // The system is under memory pressure.
+  return base::MemoryPressureListener::MemoryPressureLevel::
+      MEMORY_PRESSURE_LEVEL_CRITICAL;
+}
+
 }  // namespace memory
diff --git a/chrome/browser/memory/memory_pressure_monitor_win.h b/chrome/browser/memory/memory_pressure_monitor_win.h
index b4c211b..5863ab00 100644
--- a/chrome/browser/memory/memory_pressure_monitor_win.h
+++ b/chrome/browser/memory/memory_pressure_monitor_win.h
@@ -7,21 +7,71 @@
 
 #include "base/macros.h"
 #include "chrome/browser/memory/memory_pressure_monitor.h"
+#include "chrome/browser/memory/memory_pressure_monitor_utils.h"
+#include "chrome/browser/performance_monitor/system_monitor.h"
 
 namespace memory {
 
 // Windows implementation of the memory pressure monitor.
-class MemoryPressureMonitorWin : public MemoryPressureMonitor {
+class MemoryPressureMonitorWin
+    : public MemoryPressureMonitor,
+      public performance_monitor::SystemMonitor::SystemObserver {
  public:
   ~MemoryPressureMonitorWin() override;
 
+  base::MemoryPressureListener::MemoryPressureLevel
+  memory_pressure_level_for_testing() const {
+    return memory_pressure_level_;
+  }
+
+  const FreeMemoryObservationWindow& free_memory_obs_window_for_testing()
+      const {
+    return free_memory_obs_window_;
+  }
+
+  const DiskIdleTimeObservationWindow& disk_idle_time_obs_window_for_testing()
+      const {
+    return disk_idle_time_obs_window_;
+  }
+
  protected:
   // This object is expected to be created via MemoryPressureMonitor::Create.
   friend class MemoryPressureMonitor;
+  friend class MemoryPressureMonitorWinTest;
 
   MemoryPressureMonitorWin();
 
+  // performance_monitor::SystemMonitor::SystemObserver:
+  void OnFreePhysicalMemoryMbSample(int free_phys_memory_mb) override;
+  void OnDiskIdleTimePercent(float disk_idle_time_percent) override;
+
+  // Should be called each time one of the observation windows gets updated,
+  // this will check if the system is under memory pressure.
+  void OnObservationWindowUpdate();
+
+  // Check the observations windows and returns the current memory pressure
+  // level.
+  base::MemoryPressureListener::MemoryPressureLevel
+  CheckObservationWindowsAndComputeLevel();
+
+  // The free memory observation window.
+  FreeMemoryObservationWindow free_memory_obs_window_;
+
+  // The disk idle time observation window.
+  DiskIdleTimeObservationWindow disk_idle_time_obs_window_;
+
+  // The refresh frequency of the various metrics tracked by this class.
+  performance_monitor::SystemMonitor::SystemObserver::MetricRefreshFrequencies
+      refresh_frequencies_;
+
+  // The last observed memory pressure level.
+  base::MemoryPressureListener::MemoryPressureLevel memory_pressure_level_ =
+      base::MemoryPressureListener::MemoryPressureLevel::
+          MEMORY_PRESSURE_LEVEL_NONE;
+
  private:
+  SEQUENCE_CHECKER(sequence_checker_);
+
   DISALLOW_COPY_AND_ASSIGN(MemoryPressureMonitorWin);
 };
 
diff --git a/chrome/browser/memory/memory_pressure_monitor_win_unittest.cc b/chrome/browser/memory/memory_pressure_monitor_win_unittest.cc
new file mode 100644
index 0000000..047eaee
--- /dev/null
+++ b/chrome/browser/memory/memory_pressure_monitor_win_unittest.cc
@@ -0,0 +1,196 @@
+// 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/memory/memory_pressure_monitor_win.h"
+
+#include <memory>
+
+#include "base/memory/ptr_util.h"
+#include "base/test/scoped_task_environment.h"
+#include "base/time/time.h"
+#include "chrome/browser/performance_monitor/system_monitor.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace memory {
+namespace {
+
+using SamplingFrequency = performance_monitor::SystemMonitor::SamplingFrequency;
+
+// Mock MetricEvaluatorsHelper that will be used to send some test system metric
+// values to SystemMonitor.
+class LenientMockMetricEvaluatorsHelper
+    : public performance_monitor::MetricEvaluatorsHelper {
+ public:
+  ~LenientMockMetricEvaluatorsHelper() override {}
+  MOCK_METHOD0(GetFreePhysicalMemoryMb, base::Optional<int>());
+  MOCK_METHOD0(GetDiskIdleTimePercent, base::Optional<float>());
+};
+using MockMetricHelper =
+    ::testing::StrictMock<LenientMockMetricEvaluatorsHelper>;
+
+}  // namespace
+
+class MemoryPressureMonitorWinTest : public testing::Test {
+ public:
+  MemoryPressureMonitorWinTest()
+      : scoped_task_environment_(
+            base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
+        tick_clock_(scoped_task_environment_.GetMockTickClock()) {}
+  ~MemoryPressureMonitorWinTest() override = default;
+
+  void SetUp() override {
+    EXPECT_EQ(nullptr, performance_monitor::SystemMonitor::Get());
+
+    mock_helper_ = new MockMetricHelper();
+
+    system_monitor_ = performance_monitor::SystemMonitor::CreateForTesting(
+        base::WrapUnique(mock_helper_));
+
+    pressure_monitor_.reset(new MemoryPressureMonitorWin());
+  }
+
+  void TearDown() override {
+    mock_helper_ = nullptr;
+    system_monitor_.reset(nullptr);
+  }
+
+ protected:
+  void CheckMonitorRefreshFrequencies(
+      SamplingFrequency expected_free_mem_freq,
+      SamplingFrequency expected_disk_idle_time_freq) const {
+    EXPECT_EQ(
+        expected_free_mem_freq,
+        pressure_monitor_->refresh_frequencies_.free_phys_memory_mb_frequency);
+    EXPECT_EQ(expected_disk_idle_time_freq,
+              pressure_monitor_->refresh_frequencies_
+                  .disk_idle_time_percent_frequency);
+  }
+
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  const base::TickClock* tick_clock_;
+  std::unique_ptr<performance_monitor::SystemMonitor> system_monitor_;
+
+  // The mock metric helper, owned by |system_monitor_|.
+  MockMetricHelper* mock_helper_;
+
+  // This needs to be created after |system_monitor_|.
+  std::unique_ptr<MemoryPressureMonitorWin> pressure_monitor_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(MemoryPressureMonitorWinTest);
+};
+
+// Test the transition from MEMORY_PRESSURE_LEVEL_NONE to
+// MEMORY_PRESSURE_LEVEL_CRITICAL and vice versa.
+TEST_F(MemoryPressureMonitorWinTest, MemoryPressureChanges) {
+  const auto& free_mem_window_config =
+      pressure_monitor_->free_memory_obs_window_for_testing()
+          .config_for_testing();
+
+  CheckMonitorRefreshFrequencies(SamplingFrequency::kDefaultFrequency,
+                                 SamplingFrequency::kNoSampling);
+
+  // Wait for the memory to be under the early limit.
+  EXPECT_FALSE(pressure_monitor_->free_memory_obs_window_for_testing()
+                   .MemoryIsUnderEarlyLimit());
+  while (!pressure_monitor_->free_memory_obs_window_for_testing()
+              .MemoryIsUnderEarlyLimit()) {
+    // Make the helper return an amount of free physical memory slightly under
+    // the early limit.
+    EXPECT_CALL(*mock_helper_, GetFreePhysicalMemoryMb())
+        .Times(1)
+        .WillOnce(::testing::Return(
+            free_mem_window_config.low_memory_early_limit_mb - 1));
+
+    // Fast forward to the next sample notification.
+    EXPECT_TRUE(system_monitor_->refresh_timer_for_testing().IsRunning());
+    scoped_task_environment_.FastForwardBy(
+        system_monitor_->refresh_timer_for_testing().GetCurrentDelay());
+    scoped_task_environment_.RunUntilIdle();
+    ::testing::Mock::VerifyAndClear(mock_helper_);
+  }
+
+  EXPECT_EQ(base::MemoryPressureListener::MemoryPressureLevel::
+                MEMORY_PRESSURE_LEVEL_NONE,
+            pressure_monitor_->memory_pressure_level_for_testing());
+
+  CheckMonitorRefreshFrequencies(SamplingFrequency::kDefaultFrequency,
+                                 SamplingFrequency::kDefaultFrequency);
+
+  // Make the helper return an amount of free physical memory slightly under
+  // the critical limit and a disk idle time of 100%.
+  EXPECT_CALL(*mock_helper_, GetFreePhysicalMemoryMb())
+      .Times(::testing::AtLeast(1))
+      .WillRepeatedly(::testing::Return(
+          free_mem_window_config.low_memory_critical_limit_mb - 1));
+  EXPECT_CALL(*mock_helper_, GetDiskIdleTimePercent())
+      .Times(::testing::AtLeast(1))
+      .WillRepeatedly(::testing::Return(1.0));
+
+  EXPECT_FALSE(pressure_monitor_->free_memory_obs_window_for_testing()
+                   .MemoryIsUnderCriticalLimit());
+
+  while (!pressure_monitor_->free_memory_obs_window_for_testing()
+              .MemoryIsUnderCriticalLimit()) {
+    // Fast forward to the next sample notification.
+    EXPECT_TRUE(system_monitor_->refresh_timer_for_testing().IsRunning());
+    scoped_task_environment_.FastForwardBy(
+        system_monitor_->refresh_timer_for_testing().GetCurrentDelay());
+    scoped_task_environment_.RunUntilIdle();
+  }
+
+  // The disk idle time is at 100%, there's no memory pressure.
+  EXPECT_EQ(base::MemoryPressureListener::MemoryPressureLevel::
+                MEMORY_PRESSURE_LEVEL_NONE,
+            pressure_monitor_->memory_pressure_level_for_testing());
+
+  // The helper will now return an idle time of 0% and an amount of free memory
+  // that's under the critical threshold, this should lead to memory pressure.
+  EXPECT_CALL(*mock_helper_, GetDiskIdleTimePercent())
+      .Times(::testing::AtLeast(1))
+      .WillRepeatedly(::testing::Return(0.0));
+
+  while (!pressure_monitor_->disk_idle_time_obs_window_for_testing()
+              .DiskIdleTimeIsLow()) {
+    // Fast forward to the next sample notification.
+    EXPECT_TRUE(system_monitor_->refresh_timer_for_testing().IsRunning());
+    scoped_task_environment_.FastForwardBy(
+        system_monitor_->refresh_timer_for_testing().GetCurrentDelay());
+    scoped_task_environment_.RunUntilIdle();
+  }
+
+  EXPECT_EQ(base::MemoryPressureListener::MemoryPressureLevel::
+                MEMORY_PRESSURE_LEVEL_CRITICAL,
+            pressure_monitor_->memory_pressure_level_for_testing());
+
+  // Make the helper return an amount of free physical memory greater than the
+  // early limit, the memory pressure should go back to the
+  // MEMORY_PRESSURE_LEVEL_NONE level and the monitor should stop observing the
+  // disk idle time.
+  EXPECT_CALL(*mock_helper_, GetFreePhysicalMemoryMb())
+      .Times(::testing::AtLeast(1))
+      .WillRepeatedly(::testing::Return(
+          free_mem_window_config.low_memory_early_limit_mb + 1));
+
+  while (pressure_monitor_->free_memory_obs_window_for_testing()
+             .MemoryIsUnderEarlyLimit()) {
+    // Fast forward to the next sample notification.
+    EXPECT_TRUE(system_monitor_->refresh_timer_for_testing().IsRunning());
+    scoped_task_environment_.FastForwardBy(
+        system_monitor_->refresh_timer_for_testing().GetCurrentDelay());
+    scoped_task_environment_.RunUntilIdle();
+  }
+
+  CheckMonitorRefreshFrequencies(SamplingFrequency::kDefaultFrequency,
+                                 SamplingFrequency::kNoSampling);
+
+  EXPECT_EQ(base::MemoryPressureListener::MemoryPressureLevel::
+                MEMORY_PRESSURE_LEVEL_NONE,
+            pressure_monitor_->memory_pressure_level_for_testing());
+
+  ::testing::Mock::VerifyAndClear(mock_helper_);
+}
+
+}  // namespace memory
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter.cc b/chrome/browser/metrics/process_memory_metrics_emitter.cc
index 7827333b..a41b6dd 100644
--- a/chrome/browser/metrics/process_memory_metrics_emitter.cc
+++ b/chrome/browser/metrics/process_memory_metrics_emitter.cc
@@ -800,7 +800,8 @@
 
       PageInfo page_info;
       page_info.ukm_source_id = page_node->ukm_source_id();
-      page_info.tab_id = page_node->id().id;
+      page_info.tab_id =
+          performance_manager::NodeBase::GetSerializationId(page_node);
       page_info.hosts_main_frame = HostsMainFrame(process_node, page_node);
       page_info.is_visible = page_node->is_visible();
       page_info.time_since_last_visibility_change =
diff --git a/chrome/browser/metrics/tab_footprint_aggregator.h b/chrome/browser/metrics/tab_footprint_aggregator.h
index 7411eea..56cdc667 100644
--- a/chrome/browser/metrics/tab_footprint_aggregator.h
+++ b/chrome/browser/metrics/tab_footprint_aggregator.h
@@ -10,7 +10,6 @@
 
 #include "base/process/process_handle.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
 
 namespace ukm {
 class UkmRecorder;
@@ -26,8 +25,7 @@
   TabFootprintAggregator();
   ~TabFootprintAggregator();
 
-  typedef resource_coordinator::CoordinationUnitID::CoordinationUnitTypeId
-      PageId;
+  typedef uint64_t PageId;
 
   // Tracks the process identified by |pid| as the host of the main-frame for
   // the tab identified by |page_id|. |pmf_kb| should be the private memory
diff --git a/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.cc b/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.cc
index ab3f2e8b..233eea4 100644
--- a/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.cc
+++ b/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.cc
@@ -61,19 +61,6 @@
     downloader->OnDownloadServiceUnavailable();
 }
 
-download::Client::ShouldDownload
-OfflinePrefetchDownloadClient::OnDownloadStarted(
-    const std::string& guid,
-    const std::vector<GURL>& url_chain,
-    const scoped_refptr<const net::HttpResponseHeaders>& headers) {
-  return download::Client::ShouldDownload::CONTINUE;
-}
-
-void OfflinePrefetchDownloadClient::OnDownloadUpdated(
-    const std::string& guid,
-    uint64_t bytes_uploaded,
-    uint64_t bytes_downloaded) {}
-
 void OfflinePrefetchDownloadClient::OnDownloadFailed(
     const std::string& guid,
     const download::CompletionInfo& completion_info,
diff --git a/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.h b/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.h
index 0e55a16..5c4193d8a 100644
--- a/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.h
+++ b/chrome/browser/offline_pages/prefetch/offline_prefetch_download_client.h
@@ -32,13 +32,6 @@
       bool state_lost,
       const std::vector<download::DownloadMetaData>& downloads) override;
   void OnServiceUnavailable() override;
-  download::Client::ShouldDownload OnDownloadStarted(
-      const std::string& guid,
-      const std::vector<GURL>& url_chain,
-      const scoped_refptr<const net::HttpResponseHeaders>& headers) override;
-  void OnDownloadUpdated(const std::string& guid,
-                         uint64_t bytes_uploaded,
-                         uint64_t bytes_downloaded) override;
   void OnDownloadFailed(const std::string& guid,
                         const download::CompletionInfo& completion_info,
                         download::Client::FailureReason reason) override;
diff --git a/chrome/browser/performance_manager/decorators/frozen_frame_aggregator.cc b/chrome/browser/performance_manager/decorators/frozen_frame_aggregator.cc
index 6d040eb..311ce43 100644
--- a/chrome/browser/performance_manager/decorators/frozen_frame_aggregator.cc
+++ b/chrome/browser/performance_manager/decorators/frozen_frame_aggregator.cc
@@ -119,11 +119,11 @@
 bool FrozenFrameAggregator::ShouldObserve(const NodeBase* node) {
   // Use the ShouldObserve hook to ensure page and process node attached data
   // is initialized. There's no need to observe these nodes beyond that.
-  switch (node->id().type) {
-    case resource_coordinator::CoordinationUnitType::kFrame:
+  switch (node->type()) {
+    case FrameNodeImpl::Type():
       return true;
 
-    case resource_coordinator::CoordinationUnitType::kPage: {
+    case PageNodeImpl::Type(): {
       auto* page_node = PageNodeImpl::FromNodeBase(node);
       // Expect a page to always start in the running state.
       DCHECK_EQ(LifecycleState::kRunning, page_node->lifecycle_state());
@@ -131,7 +131,7 @@
       return false;
     }
 
-    case resource_coordinator::CoordinationUnitType::kProcess: {
+    case ProcessNodeImpl::Type(): {
       FrozenDataImpl::GetOrCreate(ProcessNodeImpl::FromNodeBase(node));
       return false;
     }
@@ -144,8 +144,7 @@
 
 void FrozenFrameAggregator::OnNodeAdded(NodeBase* node) {
   // We only observe frame nodes.
-  DCHECK_EQ(resource_coordinator::CoordinationUnitType::kFrame,
-            node->id().type);
+  DCHECK_EQ(FrameNodeImpl::Type(), node->type());
 
   auto* frame_node = FrameNodeImpl::FromNodeBase(node);
   DCHECK(!IsFrozen(frame_node));  // A newly created node can never be frozen.
@@ -153,7 +152,7 @@
 }
 
 void FrozenFrameAggregator::OnBeforeNodeRemoved(NodeBase* node) {
-  if (node->id().type != resource_coordinator::CoordinationUnitType::kFrame)
+  if (node->type() != FrameNodeImpl::Type())
     return;
 
   auto* frame_node = FrameNodeImpl::FromNodeBase(node);
diff --git a/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc b/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc
index 863ae72..58adba3 100644
--- a/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc
+++ b/chrome/browser/performance_manager/decorators/page_almost_idle_decorator.cc
@@ -68,10 +68,10 @@
 }
 
 bool PageAlmostIdleDecorator::ShouldObserve(const NodeBase* node) {
-  switch (node->id().type) {
-    case resource_coordinator::CoordinationUnitType::kFrame:
-    case resource_coordinator::CoordinationUnitType::kPage:
-    case resource_coordinator::CoordinationUnitType::kProcess:
+  switch (node->type()) {
+    case FrameNodeImpl::Type():
+    case PageNodeImpl::Type():
+    case ProcessNodeImpl::Type():
       return true;
 
     default:
diff --git a/chrome/browser/performance_manager/graph/frame_node_impl.cc b/chrome/browser/performance_manager/graph/frame_node_impl.cc
index 77eca8b..4eea18f 100644
--- a/chrome/browser/performance_manager/graph/frame_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/frame_node_impl.cc
@@ -216,7 +216,7 @@
   DCHECK(child_frame_node);
   DCHECK_EQ(this, child_frame_node->parent_frame_node());
   DCHECK_NE(this, child_frame_node);
-  DCHECK(NodeInGraph(child_frame_node));
+  DCHECK(graph()->NodeInGraph(child_frame_node));
   DCHECK(!HasFrameNodeInAncestors(child_frame_node) &&
          !child_frame_node->HasFrameNodeInDescendants(this));
 
@@ -229,7 +229,7 @@
   DCHECK(child_frame_node);
   DCHECK_EQ(this, child_frame_node->parent_frame_node());
   DCHECK_NE(this, child_frame_node);
-  DCHECK(NodeInGraph(child_frame_node));
+  DCHECK(graph()->NodeInGraph(child_frame_node));
 
   size_t removed = child_frame_nodes_.erase(child_frame_node);
   DCHECK_EQ(1u, removed);
@@ -258,17 +258,17 @@
   DCHECK(child_frame_nodes_.empty());
 
   // Leave the page.
-  DCHECK(NodeInGraph(page_node_));
+  DCHECK(graph()->NodeInGraph(page_node_));
   page_node_->RemoveFrame(this);
 
   // Leave the frame hierarchy.
   if (parent_frame_node_) {
-    DCHECK(NodeInGraph(parent_frame_node_));
+    DCHECK(graph()->NodeInGraph(parent_frame_node_));
     parent_frame_node_->RemoveChildFrame(this);
   }
 
   // And leave the process.
-  DCHECK(NodeInGraph(process_node_));
+  DCHECK(graph()->NodeInGraph(process_node_));
   process_node_->RemoveFrame(this);
 }
 
diff --git a/chrome/browser/performance_manager/graph/frame_node_impl.h b/chrome/browser/performance_manager/graph/frame_node_impl.h
index 02a29d45..5168449 100644
--- a/chrome/browser/performance_manager/graph/frame_node_impl.h
+++ b/chrome/browser/performance_manager/graph/frame_node_impl.h
@@ -47,9 +47,7 @@
           resource_coordinator::mojom::DocumentCoordinationUnit,
           resource_coordinator::mojom::DocumentCoordinationUnitRequest> {
  public:
-  static constexpr resource_coordinator::CoordinationUnitType Type() {
-    return resource_coordinator::CoordinationUnitType::kFrame;
-  }
+  static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kFrame; }
 
   // Construct a frame node associated with a |process_node|, a |page_node| and
   // optionally with a |parent_frame_node|. For the main frame of |page_node|
diff --git a/chrome/browser/performance_manager/graph/graph.cc b/chrome/browser/performance_manager/graph/graph.cc
index 31d594d..3e5a63c 100644
--- a/chrome/browser/performance_manager/graph/graph.cc
+++ b/chrome/browser/performance_manager/graph/graph.cc
@@ -15,7 +15,6 @@
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 #include "chrome/browser/performance_manager/graph/system_node_impl.h"
 #include "chrome/browser/performance_manager/observers/graph_observer.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_types.h"
 
 namespace ukm {
 class UkmEntryBuilder;
@@ -80,6 +79,10 @@
   node->LeaveGraph();
 }
 
+int64_t Graph::GetNextNodeSerializationId() {
+  return ++current_node_serialization_id_;
+}
+
 SystemNodeImpl* Graph::FindOrCreateSystemNode() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (!system_node_) {
@@ -91,13 +94,10 @@
   return system_node_.get();
 }
 
-NodeBase* Graph::GetNodeByID(
-    const resource_coordinator::CoordinationUnitID cu_id) {
+bool Graph::NodeInGraph(const NodeBase* node) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  const auto& it = nodes_.find(cu_id);
-  if (it == nodes_.end())
-    return nullptr;
-  return it->second;
+  const auto& it = nodes_.find(const_cast<NodeBase*>(node));
+  return it != nodes_.end();
 }
 
 ProcessNodeImpl* Graph::GetProcessNodeByPid(base::ProcessId pid) {
@@ -141,7 +141,7 @@
 
 void Graph::AddNewNode(NodeBase* new_node) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  auto it = nodes_.emplace(new_node->id(), new_node);
+  auto it = nodes_.insert(new_node);
   DCHECK(it.second);  // Inserted successfully
 
   // Allow the node to initialize itself now that it's been added.
@@ -161,7 +161,7 @@
   node_attached_data_map_.erase(lower, upper);
 
   // Before removing the node itself.
-  size_t erased = nodes_.erase(node->id());
+  size_t erased = nodes_.erase(node);
   DCHECK_EQ(1u, erased);
 }
 
@@ -182,14 +182,14 @@
     processes_by_pid_[new_pid] = process;
 }
 
-template <typename CUType>
-std::vector<CUType*> Graph::GetAllNodesOfType() {
+template <typename NodeType>
+std::vector<NodeType*> Graph::GetAllNodesOfType() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  const auto type = CUType::Type();
-  std::vector<CUType*> ret;
-  for (const auto& el : nodes_) {
-    if (el.first.type == type)
-      ret.push_back(CUType::FromNodeBase(el.second));
+  const auto type = NodeType::Type();
+  std::vector<NodeType*> ret;
+  for (auto* node : nodes_) {
+    if (node->type() == type)
+      ret.push_back(NodeType::FromNodeBase(node));
   }
   return ret;
 }
diff --git a/chrome/browser/performance_manager/graph/graph.h b/chrome/browser/performance_manager/graph/graph.h
index c721ddb..02b0d9b3 100644
--- a/chrome/browser/performance_manager/graph/graph.h
+++ b/chrome/browser/performance_manager/graph/graph.h
@@ -9,7 +9,7 @@
 
 #include <map>
 #include <memory>
-#include <unordered_map>
+#include <unordered_set>
 #include <utility>
 #include <vector>
 
@@ -19,8 +19,6 @@
 #include "chrome/browser/performance_manager/graph/node_attached_data.h"
 #include "services/metrics/public/cpp/mojo_ukm_recorder.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_types.h"
 
 namespace performance_manager {
 
@@ -31,14 +29,12 @@
 class ProcessNodeImpl;
 class SystemNodeImpl;
 
-// The Graph represents a graph of the coordination units
-// representing a single system. It vends out new instances of coordination
-// units and indexes them by ID. It also fires the creation and pre-destruction
-// notifications for all coordination units.
+// Represents a graph of the nodes representing a single browser. Maintains a
+// set of nodes that can be retrieved in different ways, some indexed. Keeps
+// a list of observers that are notified of node addition and removal.
 class Graph {
  public:
-  using CUIDMap =
-      std::unordered_map<resource_coordinator::CoordinationUnitID, NodeBase*>;
+  using NodeSet = std::unordered_set<NodeBase*>;
 
   Graph();
   ~Graph();
@@ -59,11 +55,13 @@
   std::vector<ProcessNodeImpl*> GetAllProcessNodes();
   std::vector<FrameNodeImpl*> GetAllFrameNodes();
   std::vector<PageNodeImpl*> GetAllPageNodes();
-  const CUIDMap& nodes() { return nodes_; }
+  const NodeSet& nodes() { return nodes_; }
 
-  // Retrieves the process CU with PID |pid|, if any.
+  // Retrieves the process node with PID |pid|, if any.
   ProcessNodeImpl* GetProcessNodeByPid(base::ProcessId pid);
-  NodeBase* GetNodeByID(const resource_coordinator::CoordinationUnitID cu_id);
+
+  // Returns true if |node| is in this graph.
+  bool NodeInGraph(const NodeBase* node);
 
   std::vector<GraphObserver*>& observers_for_testing() { return observers_; }
 
@@ -84,16 +82,20 @@
   void OnNodeAdded(NodeBase* node);
   void OnBeforeNodeRemoved(NodeBase* node);
 
+  // Returns a new serialization ID.
+  friend class NodeBase;
+  int64_t GetNextNodeSerializationId();
+
   // Process PID map for use by ProcessNodeImpl.
   friend class ProcessNodeImpl;
   void BeforeProcessPidChange(ProcessNodeImpl* process,
                               base::ProcessId new_pid);
 
-  template <typename CUType>
-  std::vector<CUType*> GetAllNodesOfType();
+  template <typename NodeType>
+  std::vector<NodeType*> GetAllNodesOfType();
 
   std::unique_ptr<SystemNodeImpl> system_node_;
-  CUIDMap nodes_;
+  NodeSet nodes_;
   ProcessByPidMap processes_by_pid_;
   std::vector<GraphObserver*> observers_;
   ukm::UkmRecorder* ukm_recorder_ = nullptr;
@@ -105,6 +107,9 @@
       std::map<NodeAttachedDataKey, std::unique_ptr<NodeAttachedData>>;
   NodeAttachedDataMap node_attached_data_map_;
 
+  // The most recently assigned serialization ID.
+  int64_t current_node_serialization_id_ = 0u;
+
   SEQUENCE_CHECKER(sequence_checker_);
   DISALLOW_COPY_AND_ASSIGN(Graph);
 };
diff --git a/chrome/browser/performance_manager/graph/graph_test_harness.h b/chrome/browser/performance_manager/graph/graph_test_harness.h
index f597fda..7cbd322 100644
--- a/chrome/browser/performance_manager/graph/graph_test_harness.h
+++ b/chrome/browser/performance_manager/graph/graph_test_harness.h
@@ -131,7 +131,7 @@
                                               std::forward<Args>(args)...);
   }
 
-  TestNodeWrapper<SystemNodeImpl> GetSystemCoordinationUnit() {
+  TestNodeWrapper<SystemNodeImpl> GetSystemNode() {
     return TestNodeWrapper<SystemNodeImpl>(graph()->FindOrCreateSystemNode());
   }
 
diff --git a/chrome/browser/performance_manager/graph/graph_unittest.cc b/chrome/browser/performance_manager/graph/graph_unittest.cc
index 91efb4a..133318b 100644
--- a/chrome/browser/performance_manager/graph/graph_unittest.cc
+++ b/chrome/browser/performance_manager/graph/graph_unittest.cc
@@ -100,4 +100,27 @@
   EXPECT_NE(nullptr, pages[1]);
 }
 
+TEST(GraphTest, SerializationId) {
+  Graph graph;
+
+  EXPECT_EQ(0u, NodeBase::GetSerializationId(nullptr));
+
+  TestNodeWrapper<ProcessNodeImpl> process =
+      TestNodeWrapper<ProcessNodeImpl>::Create(&graph);
+
+  // The serialization ID should be non-zero, and should be stable for a given
+  // node.
+  auto id = NodeBase::GetSerializationId(process.get());
+  EXPECT_NE(0u, id);
+  EXPECT_EQ(id, NodeBase::GetSerializationId(process.get()));
+
+  SystemNodeImpl* system = graph.FindOrCreateSystemNode();
+
+  // Different nodes should be assigned different IDs.
+  EXPECT_NE(id, NodeBase::GetSerializationId(system));
+  EXPECT_NE(0, NodeBase::GetSerializationId(system));
+  EXPECT_EQ(NodeBase::GetSerializationId(system),
+            NodeBase::GetSerializationId(system));
+}
+
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/graph/mock_graphs.cc b/chrome/browser/performance_manager/graph/mock_graphs.cc
index c179bb7..bf5a503 100644
--- a/chrome/browser/performance_manager/graph/mock_graphs.cc
+++ b/chrome/browser/performance_manager/graph/mock_graphs.cc
@@ -13,8 +13,6 @@
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 #include "chrome/browser/performance_manager/graph/system_node_impl.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_types.h"
 
 namespace performance_manager {
 
diff --git a/chrome/browser/performance_manager/graph/node_attached_data.cc b/chrome/browser/performance_manager/graph/node_attached_data.cc
index 9e8223d..7f76d75c 100644
--- a/chrome/browser/performance_manager/graph/node_attached_data.cc
+++ b/chrome/browser/performance_manager/graph/node_attached_data.cc
@@ -16,13 +16,13 @@
 NodeAttachedData::~NodeAttachedData() = default;
 
 bool NodeAttachedData::CanAttach(const NodeBase* node) const {
-  return CanAttach(node->id().type);
+  return CanAttach(node->type());
 }
 
 // static
 void NodeAttachedData::AttachInMap(const NodeBase* node,
                                    std::unique_ptr<NodeAttachedData> data) {
-  CHECK(data->CanAttach(node->id().type));
+  CHECK(data->CanAttach(node->type()));
   Graph::NodeAttachedDataKey data_key = std::make_pair(node, data->key());
   auto& map = node->graph()->node_attached_data_map_;
   DCHECK(!base::ContainsKey(map, data_key));
@@ -53,7 +53,7 @@
   if (it != map.end()) {
     data = std::move(it->second);
     map.erase(it);
-    DCHECK(data->CanAttach(node->id().type));
+    DCHECK(data->CanAttach(node->type()));
   }
 
   return data;
diff --git a/chrome/browser/performance_manager/graph/node_attached_data.h b/chrome/browser/performance_manager/graph/node_attached_data.h
index 8cd5f41..cc0eeb5 100644
--- a/chrome/browser/performance_manager/graph/node_attached_data.h
+++ b/chrome/browser/performance_manager/graph/node_attached_data.h
@@ -9,7 +9,7 @@
 
 #include "base/logging.h"
 #include "base/macros.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_types.h"
+#include "chrome/browser/performance_manager/graph/node_type.h"
 
 namespace performance_manager {
 
@@ -29,8 +29,7 @@
 
   // Returns true if the implementation is able to be attached to a node of the
   // given type.
-  virtual bool CanAttach(
-      resource_coordinator::CoordinationUnitType node_type) const = 0;
+  virtual bool CanAttach(NodeTypeEnum node_type) const = 0;
   bool CanAttach(const NodeBase* node) const;
 
  protected:
diff --git a/chrome/browser/performance_manager/graph/node_attached_data_impl.h b/chrome/browser/performance_manager/graph/node_attached_data_impl.h
index ec2c96d..64a2aba1 100644
--- a/chrome/browser/performance_manager/graph/node_attached_data_impl.h
+++ b/chrome/browser/performance_manager/graph/node_attached_data_impl.h
@@ -12,7 +12,6 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "chrome/browser/performance_manager/graph/node_attached_data.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_types.h"
 
 namespace performance_manager {
 
@@ -112,8 +111,6 @@
 // DCHECK(Foo::Destroy(page_node));
 // -- user_of_foo.cc --
 
-using NodeTypeEnum = resource_coordinator::CoordinationUnitType;
-
 // Implementation of NodeAttachedData intended to be used as the base class for
 // derived types. Provides the basic plumbing for accessing the node attached
 // data in a strongly typed manner, while enforcing node type bindings.
@@ -186,8 +183,7 @@
 
   static const void* UserDataKey() { return &DataType::kUserDataKey; }
 
-  static bool CanAttachToNodeType(
-      resource_coordinator::CoordinationUnitType node_type);
+  static bool CanAttachToNodeType(NodeTypeEnum node_type);
 
   template <typename NodeType>
   static bool CanAttachToNodeType() {
@@ -198,8 +194,7 @@
 
   // NodeAttachedData implementation:
   const void* key() const override { return UserDataKey(); }
-  bool CanAttach(
-      resource_coordinator::CoordinationUnitType node_type) const override {
+  bool CanAttach(NodeTypeEnum node_type) const override {
     return CanAttachToNodeType(node_type);
   }
 
@@ -261,7 +256,7 @@
 // static
 template <typename DataType>
 bool NodeAttachedDataImpl<DataType>::CanAttachToNodeType(
-    resource_coordinator::CoordinationUnitType node_type) {
+    NodeTypeEnum node_type) {
   switch (node_type) {
     case NodeTypeEnum::kInvalidType: {
       return false;
diff --git a/chrome/browser/performance_manager/graph/node_attached_data_unittest.cc b/chrome/browser/performance_manager/graph/node_attached_data_unittest.cc
index cb57cd03..91c6b4e 100644
--- a/chrome/browser/performance_manager/graph/node_attached_data_unittest.cc
+++ b/chrome/browser/performance_manager/graph/node_attached_data_unittest.cc
@@ -30,14 +30,11 @@
 class DummyNode : public NodeBase {
  public:
   explicit DummyNode(Graph* graph)
-      : NodeBase(resource_coordinator::CoordinationUnitType::kInvalidType,
-                 graph) {}
+      : NodeBase(NodeTypeEnum::kInvalidType, graph) {}
 
   ~DummyNode() override = default;
 
-  static constexpr resource_coordinator::CoordinationUnitType Type() {
-    return resource_coordinator::CoordinationUnitType::kInvalidType;
-  }
+  static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kInvalidType; }
 
   // Internal storage for DummyData and FooData types. These would normally be
   // protected and the data classes friended, but we also want to access these
@@ -127,28 +124,18 @@
   EXPECT_TRUE(DummyData::CanAttachToNodeType<ProcessNodeImpl>());
   EXPECT_FALSE(DummyData::CanAttachToNodeType<SystemNodeImpl>());
 
-  EXPECT_FALSE(DummyData::CanAttachToNodeType(
-      resource_coordinator::CoordinationUnitType::kInvalidType));
-  EXPECT_FALSE(DummyData::CanAttachToNodeType(
-      resource_coordinator::CoordinationUnitType::kFrame));
-  EXPECT_TRUE(DummyData::CanAttachToNodeType(
-      resource_coordinator::CoordinationUnitType::kPage));
-  EXPECT_TRUE(DummyData::CanAttachToNodeType(
-      resource_coordinator::CoordinationUnitType::kProcess));
-  EXPECT_FALSE(DummyData::CanAttachToNodeType(
-      resource_coordinator::CoordinationUnitType::kSystem));
+  EXPECT_FALSE(DummyData::CanAttachToNodeType(NodeTypeEnum::kInvalidType));
+  EXPECT_FALSE(DummyData::CanAttachToNodeType(FrameNodeImpl::Type()));
+  EXPECT_TRUE(DummyData::CanAttachToNodeType(PageNodeImpl::Type()));
+  EXPECT_TRUE(DummyData::CanAttachToNodeType(ProcessNodeImpl::Type()));
+  EXPECT_FALSE(DummyData::CanAttachToNodeType(SystemNodeImpl::Type()));
 
   std::unique_ptr<NodeAttachedData> data = std::make_unique<DummyData>();
-  EXPECT_FALSE(data->CanAttach(
-      resource_coordinator::CoordinationUnitType::kInvalidType));
-  EXPECT_FALSE(
-      data->CanAttach(resource_coordinator::CoordinationUnitType::kFrame));
-  EXPECT_TRUE(
-      data->CanAttach(resource_coordinator::CoordinationUnitType::kPage));
-  EXPECT_TRUE(
-      data->CanAttach(resource_coordinator::CoordinationUnitType::kProcess));
-  EXPECT_FALSE(
-      data->CanAttach(resource_coordinator::CoordinationUnitType::kSystem));
+  EXPECT_FALSE(data->CanAttach(NodeTypeEnum::kInvalidType));
+  EXPECT_FALSE(data->CanAttach(FrameNodeImpl::Type()));
+  EXPECT_TRUE(data->CanAttach(PageNodeImpl::Type()));
+  EXPECT_TRUE(data->CanAttach(ProcessNodeImpl::Type()));
+  EXPECT_FALSE(data->CanAttach(SystemNodeImpl::Type()));
 }
 
 TEST_F(NodeAttachedDataTest, RawAttachDetach) {
diff --git a/chrome/browser/performance_manager/graph/node_base.cc b/chrome/browser/performance_manager/graph/node_base.cc
index b7c70a23..ecf7061 100644
--- a/chrome/browser/performance_manager/graph/node_base.cc
+++ b/chrome/browser/performance_manager/graph/node_base.cc
@@ -8,28 +8,29 @@
 
 #include "chrome/browser/performance_manager/graph/graph.h"
 #include "chrome/browser/performance_manager/observers/graph_observer.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
 
 namespace performance_manager {
 
-NodeBase::NodeBase(resource_coordinator::CoordinationUnitType node_type,
-                   Graph* graph)
-    : graph_(graph),
-      id_(node_type, resource_coordinator::CoordinationUnitID::RANDOM_ID) {}
+NodeBase::NodeBase(NodeTypeEnum node_type, Graph* graph)
+    : graph_(graph), type_(node_type) {}
 
 NodeBase::~NodeBase() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // The node must have been removed from the graph before destruction.
-  DCHECK(!NodeInGraph(this));
+  DCHECK(!graph_->NodeInGraph(this));
 }
 
-void NodeBase::JoinGraph() {}
+// static
+int64_t NodeBase::GetSerializationId(NodeBase* node) {
+  if (!node)
+    return 0u;
 
-void NodeBase::LeaveGraph() {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  for (auto& observer : observers_)
-    observer.OnBeforeNodeRemoved(this);
+  if (!node->serialization_id_)
+    node->serialization_id_ = node->graph()->GetNextNodeSerializationId();
+
+  DCHECK_NE(0u, node->serialization_id_);
+  return node->serialization_id_;
 }
 
 void NodeBase::AddObserver(GraphObserver* observer) {
@@ -42,8 +43,16 @@
   observers_.RemoveObserver(observer);
 }
 
-bool NodeBase::NodeInGraph(const NodeBase* other_node) const {
-  return graph_->GetNodeByID(other_node->id()) == other_node;
+void NodeBase::JoinGraph() {
+  DCHECK(graph_->NodeInGraph(this));
+}
+
+void NodeBase::LeaveGraph() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(graph_->NodeInGraph(this));
+
+  for (auto& observer : observers_)
+    observer.OnBeforeNodeRemoved(this);
 }
 
 }  // namespace performance_manager
diff --git a/chrome/browser/performance_manager/graph/node_base.h b/chrome/browser/performance_manager/graph/node_base.h
index e58aa5e..3841924d 100644
--- a/chrome/browser/performance_manager/graph/node_base.h
+++ b/chrome/browser/performance_manager/graph/node_base.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_NODE_BASE_H_
 #define CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_NODE_BASE_H_
 
+#include <stdint.h>
 #include <map>
 #include <memory>
 #include <utility>
@@ -14,12 +15,12 @@
 #include "base/observer_list.h"
 #include "base/sequence_checker.h"
 #include "chrome/browser/performance_manager/graph/graph.h"
+#include "chrome/browser/performance_manager/graph/node_type.h"
 #include "chrome/browser/performance_manager/graph/properties.h"
 #include "chrome/browser/performance_manager/observers/graph_observer.h"
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_types.h"
 #include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h"
 
 namespace performance_manager {
@@ -34,14 +35,17 @@
 // All methods not documented otherwise are single-threaded.
 class NodeBase {
  public:
-  NodeBase(resource_coordinator::CoordinationUnitType type, Graph* graph);
+  // TODO(siggi): Don't store the node type, expose it on a virtual function
+  //    instead.
+  NodeBase(NodeTypeEnum type, Graph* graph);
   virtual ~NodeBase();
 
   void AddObserver(GraphObserver* observer);
   void RemoveObserver(GraphObserver* observer);
 
   // May be called on any sequence.
-  const resource_coordinator::CoordinationUnitID& id() const { return id_; }
+  NodeTypeEnum type() const { return type_; }
+
   // May be called on any sequence.
   Graph* graph() const { return graph_; }
 
@@ -49,6 +53,11 @@
     return observers_;
   }
 
+  // Returns an opaque ID for |node|, unique across all nodes in the same graph,
+  // zero for nullptr. This should never be used to look up nodes, only to
+  // provide a stable ID for serialization.
+  static int64_t GetSerializationId(NodeBase* node);
+
  protected:
   friend class Graph;
 
@@ -59,11 +68,11 @@
   // node state.
   virtual void LeaveGraph();
 
-  // Returns true if |other_node| is in the same graph.
-  bool NodeInGraph(const NodeBase* other_node) const;
-
   Graph* const graph_;
-  const resource_coordinator::CoordinationUnitID id_;
+  const NodeTypeEnum type_;
+
+  // Assigned on first use, immutable from that point forward.
+  int64_t serialization_id_ = 0u;
 
   SEQUENCE_CHECKER(sequence_checker_);
 
@@ -81,24 +90,12 @@
   explicit TypedNodeBase(Graph* graph) : NodeBase(NodeClass::Type(), graph) {}
 
   static const NodeClass* FromNodeBase(const NodeBase* cu) {
-    DCHECK(cu->id().type == NodeClass::Type());
+    DCHECK_EQ(cu->type(), NodeClass::Type());
     return static_cast<const NodeClass*>(cu);
   }
 
   static NodeClass* FromNodeBase(NodeBase* cu) {
-    DCHECK(cu->id().type == NodeClass::Type());
-    return static_cast<NodeClass*>(cu);
-  }
-
-  static NodeClass* GetNodeByID(
-      Graph* graph,
-      const resource_coordinator::CoordinationUnitID cu_id) {
-    DCHECK(cu_id.type == NodeClass::Type());
-    auto* cu = graph->GetNodeByID(cu_id);
-    if (!cu)
-      return nullptr;
-
-    CHECK_EQ(cu->id().type, NodeClass::Type());
+    DCHECK(cu->type() == NodeClass::Type());
     return static_cast<NodeClass*>(cu);
   }
 };
diff --git a/chrome/browser/performance_manager/graph/node_type.h b/chrome/browser/performance_manager/graph/node_type.h
new file mode 100644
index 0000000..6209588
--- /dev/null
+++ b/chrome/browser/performance_manager/graph/node_type.h
@@ -0,0 +1,22 @@
+// Copyright 2019 The Chromium 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_PERFORMANCE_MANAGER_GRAPH_NODE_TYPE_H_
+#define CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_NODE_TYPE_H_
+
+#include <stdint.h>
+
+namespace performance_manager {
+
+enum class NodeTypeEnum : uint8_t {
+  kInvalidType,
+  kFrame,
+  kPage,
+  kProcess,
+  kSystem,
+};
+
+}  // namespace performance_manager
+
+#endif  // CHROME_BROWSER_PERFORMANCE_MANAGER_GRAPH_NODE_TYPE_H_
diff --git a/chrome/browser/performance_manager/graph/page_node_impl.cc b/chrome/browser/performance_manager/graph/page_node_impl.cc
index 64c5a89cd..4ed8a84 100644
--- a/chrome/browser/performance_manager/graph/page_node_impl.cc
+++ b/chrome/browser/performance_manager/graph/page_node_impl.cc
@@ -62,7 +62,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(frame_node);
   DCHECK_EQ(this, frame_node->page_node());
-  DCHECK(NodeInGraph(frame_node));
+  DCHECK(graph()->NodeInGraph(frame_node));
 
   ++frame_node_count_;
   if (frame_node->parent_frame_node() == nullptr)
@@ -75,7 +75,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK(frame_node);
   DCHECK_EQ(this, frame_node->page_node());
-  DCHECK(NodeInGraph(frame_node));
+  DCHECK(graph()->NodeInGraph(frame_node));
 
   --frame_node_count_;
   if (frame_node->parent_frame_node() == nullptr) {
diff --git a/chrome/browser/performance_manager/graph/page_node_impl.h b/chrome/browser/performance_manager/graph/page_node_impl.h
index 77a5019..7f6fb9f 100644
--- a/chrome/browser/performance_manager/graph/page_node_impl.h
+++ b/chrome/browser/performance_manager/graph/page_node_impl.h
@@ -27,9 +27,7 @@
  public:
   using LifecycleState = resource_coordinator::mojom::LifecycleState;
 
-  static constexpr resource_coordinator::CoordinationUnitType Type() {
-    return resource_coordinator::CoordinationUnitType::kPage;
-  }
+  static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kPage; }
 
   explicit PageNodeImpl(Graph* graph,
                         const base::WeakPtr<WebContentsProxy>& contents_proxy);
diff --git a/chrome/browser/performance_manager/graph/process_node_impl.h b/chrome/browser/performance_manager/graph/process_node_impl.h
index c95d009..1537ea6 100644
--- a/chrome/browser/performance_manager/graph/process_node_impl.h
+++ b/chrome/browser/performance_manager/graph/process_node_impl.h
@@ -36,9 +36,7 @@
           resource_coordinator::mojom::ProcessCoordinationUnit,
           resource_coordinator::mojom::ProcessCoordinationUnitRequest> {
  public:
-  static constexpr resource_coordinator::CoordinationUnitType Type() {
-    return resource_coordinator::CoordinationUnitType::kProcess;
-  }
+  static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kProcess; }
 
   explicit ProcessNodeImpl(Graph* graph);
   ~ProcessNodeImpl() override;
diff --git a/chrome/browser/performance_manager/graph/system_node_impl.h b/chrome/browser/performance_manager/graph/system_node_impl.h
index 27f62a7..99b6f5f 100644
--- a/chrome/browser/performance_manager/graph/system_node_impl.h
+++ b/chrome/browser/performance_manager/graph/system_node_impl.h
@@ -47,9 +47,7 @@
 
 class SystemNodeImpl : public TypedNodeBase<SystemNodeImpl> {
  public:
-  static constexpr resource_coordinator::CoordinationUnitType Type() {
-    return resource_coordinator::CoordinationUnitType::kSystem;
-  }
+  static constexpr NodeTypeEnum Type() { return NodeTypeEnum::kSystem; }
 
   explicit SystemNodeImpl(Graph* graph);
   ~SystemNodeImpl() override;
diff --git a/chrome/browser/performance_manager/graph/system_node_impl_unittest.cc b/chrome/browser/performance_manager/graph/system_node_impl_unittest.cc
index eb7a977..b6e61e1 100644
--- a/chrome/browser/performance_manager/graph/system_node_impl_unittest.cc
+++ b/chrome/browser/performance_manager/graph/system_node_impl_unittest.cc
@@ -24,8 +24,7 @@
  public:
   // GraphObserver implementation:
   bool ShouldObserve(const NodeBase* node) override {
-    auto cu_type = node->id().type;
-    return cu_type == resource_coordinator::CoordinationUnitType::kSystem;
+    return node->type() == SystemNodeImpl::Type();
   }
 
   void OnProcessCPUUsageReady(SystemNodeImpl* system_node) override {
diff --git a/chrome/browser/performance_manager/observers/graph_observer_unittest.cc b/chrome/browser/performance_manager/observers/graph_observer_unittest.cc
index 81cb1ef3..a5088833 100644
--- a/chrome/browser/performance_manager/observers/graph_observer_unittest.cc
+++ b/chrome/browser/performance_manager/observers/graph_observer_unittest.cc
@@ -11,8 +11,6 @@
 #include "chrome/browser/performance_manager/graph/graph.h"
 #include "chrome/browser/performance_manager/graph/graph_test_harness.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_types.h"
 #include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -36,8 +34,7 @@
   void OnRegistered() override { ++registered_; }
   void OnUnregistered() override { ++unregistered_; }
   bool ShouldObserve(const NodeBase* node) override {
-    return node->id().type ==
-           resource_coordinator::CoordinationUnitType::kFrame;
+    return node->type() == FrameNodeImpl::Type();
   }
   void OnNodeAdded(NodeBase* node) override { ++node_created_count_; }
   void OnBeforeNodeRemoved(NodeBase* node) override { ++node_destroyed_count_; }
diff --git a/chrome/browser/performance_manager/observers/metrics_collector.cc b/chrome/browser/performance_manager/observers/metrics_collector.cc
index cfba2e9..b42247c 100644
--- a/chrome/browser/performance_manager/observers/metrics_collector.cc
+++ b/chrome/browser/performance_manager/observers/metrics_collector.cc
@@ -13,7 +13,6 @@
 #include "chrome/browser/performance_manager/graph/page_node_impl.h"
 #include "chrome/browser/performance_manager/graph/process_node_impl.h"
 #include "chrome/browser/performance_manager/performance_manager_clock.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
 #include "services/resource_coordinator/public/cpp/resource_coordinator_features.h"
 
 namespace performance_manager {
@@ -34,8 +33,7 @@
 const int kDefaultFrequencyUkmEQTReported = 5u;
 
 // Gets the number of tabs that are co-resident in all of the render processes
-// associated with a |resource_coordinator::CoordinationUnitType::kPage|
-// coordination unit.
+// associated with a PageNode.
 size_t GetNumCoresidentTabs(const PageNodeImpl* page_node) {
   std::set<NodeBase*> coresident_tabs;
   for (auto* process_node : page_node->GetAssociatedProcessNodes()) {
@@ -54,23 +52,23 @@
 MetricsCollector::~MetricsCollector() = default;
 
 bool MetricsCollector::ShouldObserve(const NodeBase* node) {
-  return node->id().type ==
-             resource_coordinator::CoordinationUnitType::kFrame ||
-         node->id().type == resource_coordinator::CoordinationUnitType::kPage ||
-         node->id().type ==
-             resource_coordinator::CoordinationUnitType::kProcess;
+  return node->type() == FrameNodeImpl::Type() ||
+         node->type() == PageNodeImpl::Type() ||
+         node->type() == ProcessNodeImpl::Type();
 }
 
 void MetricsCollector::OnNodeAdded(NodeBase* node) {
-  if (node->id().type == resource_coordinator::CoordinationUnitType::kPage) {
-    metrics_report_record_map_.emplace(node->id(), MetricsReportRecord());
+  if (node->type() == PageNodeImpl::Type()) {
+    PageNodeImpl* page_node = PageNodeImpl::FromNodeBase(node);
+    metrics_report_record_map_.emplace(page_node, MetricsReportRecord());
   }
 }
 
 void MetricsCollector::OnBeforeNodeRemoved(NodeBase* node) {
-  if (node->id().type == resource_coordinator::CoordinationUnitType::kPage) {
-    metrics_report_record_map_.erase(node->id());
-    ukm_collection_state_map_.erase(node->id());
+  if (node->type() == PageNodeImpl::Type()) {
+    PageNodeImpl* page_node = PageNodeImpl::FromNodeBase(node);
+    metrics_report_record_map_.erase(page_node);
+    ukm_collection_state_map_.erase(page_node);
   }
 }
 
@@ -82,7 +80,7 @@
     return;
 
   MetricsReportRecord& record =
-      metrics_report_record_map_.find(page_node->id())->second;
+      metrics_report_record_map_.find(page_node)->second;
   record.first_non_persistent_notification_created.OnSignalReceived(
       frame_node->IsMainFrame(), page_node->TimeSinceLastVisibilityChange(),
       graph()->ukm_recorder());
@@ -92,15 +90,14 @@
   // The page becomes visible again, clear all records in order to
   // report metrics when page becomes invisible next time.
   if (page_node->is_visible())
-    ResetMetricsReportRecord(page_node->id());
+    ResetMetricsReportRecord(page_node);
 }
 
 void MetricsCollector::OnUkmSourceIdChanged(PageNodeImpl* page_node) {
-  auto page_node_id = page_node->id();
   ukm::SourceId ukm_source_id = page_node->ukm_source_id();
-  UpdateUkmSourceIdForPage(page_node_id, ukm_source_id);
+  UpdateUkmSourceIdForPage(page_node, ukm_source_id);
   MetricsReportRecord& record =
-      metrics_report_record_map_.find(page_node_id)->second;
+      metrics_report_record_map_.find(page_node)->second;
   record.UpdateUkmSourceID(ukm_source_id);
 }
 
@@ -109,7 +106,7 @@
   if (page_node->is_visible() || !ShouldReportMetrics(page_node))
     return;
   MetricsReportRecord& record =
-      metrics_report_record_map_.find(page_node->id())->second;
+      metrics_report_record_map_.find(page_node)->second;
   record.first_favicon_updated.OnSignalReceived(
       true, page_node->TimeSinceLastVisibilityChange(),
       graph()->ukm_recorder());
@@ -120,7 +117,7 @@
   if (page_node->is_visible() || !ShouldReportMetrics(page_node))
     return;
   MetricsReportRecord& record =
-      metrics_report_record_map_.find(page_node->id())->second;
+      metrics_report_record_map_.find(page_node)->second;
   record.first_title_updated.OnSignalReceived(
       true, page_node->TimeSinceLastVisibilityChange(),
       graph()->ukm_recorder());
@@ -136,9 +133,9 @@
     if (!frame_node->IsMainFrame())
       continue;
     auto* page_node = frame_node->page_node();
-    if (!IsCollectingExpectedQueueingTimeForUkm(page_node->id()))
+    if (!IsCollectingExpectedQueueingTimeForUkm(page_node))
       continue;
-    RecordExpectedQueueingTimeForUkm(page_node->id(), sample);
+    RecordExpectedQueueingTimeForUkm(page_node, sample);
   }
 }
 
@@ -147,26 +144,25 @@
 }
 
 bool MetricsCollector::IsCollectingExpectedQueueingTimeForUkm(
-    const resource_coordinator::CoordinationUnitID& page_node_id) {
-  UkmCollectionState& state = ukm_collection_state_map_[page_node_id];
+    PageNodeImpl* page_node) {
+  UkmCollectionState& state = ukm_collection_state_map_[page_node];
   return state.ukm_source_id != ukm::kInvalidSourceId &&
          ++state.num_unreported_eqt_measurements >= frequency_ukm_eqt_reported_;
 }
 
 void MetricsCollector::RecordExpectedQueueingTimeForUkm(
-    const resource_coordinator::CoordinationUnitID& page_node_id,
+    PageNodeImpl* page_node,
     const base::TimeDelta& expected_queueing_time) {
-  UkmCollectionState& state = ukm_collection_state_map_[page_node_id];
+  UkmCollectionState& state = ukm_collection_state_map_[page_node];
   state.num_unreported_eqt_measurements = 0u;
   ukm::builders::ResponsivenessMeasurement(state.ukm_source_id)
       .SetExpectedTaskQueueingDuration(expected_queueing_time.InMilliseconds())
       .Record(graph()->ukm_recorder());
 }
 
-void MetricsCollector::UpdateUkmSourceIdForPage(
-    const resource_coordinator::CoordinationUnitID& page_node_id,
-    ukm::SourceId ukm_source_id) {
-  UkmCollectionState& state = ukm_collection_state_map_[page_node_id];
+void MetricsCollector::UpdateUkmSourceIdForPage(PageNodeImpl* page_node,
+                                                ukm::SourceId ukm_source_id) {
+  UkmCollectionState& state = ukm_collection_state_map_[page_node];
 
   state.ukm_source_id = ukm_source_id;
   // Updating the |ukm_source_id| restarts usage collection.
@@ -179,11 +175,10 @@
       kDefaultFrequencyUkmEQTReported);
 }
 
-void MetricsCollector::ResetMetricsReportRecord(
-    resource_coordinator::CoordinationUnitID cu_id) {
-  DCHECK(metrics_report_record_map_.find(cu_id) !=
+void MetricsCollector::ResetMetricsReportRecord(PageNodeImpl* page_node) {
+  DCHECK(metrics_report_record_map_.find(page_node) !=
          metrics_report_record_map_.end());
-  metrics_report_record_map_.find(cu_id)->second.Reset();
+  metrics_report_record_map_.find(page_node)->second.Reset();
 }
 
 MetricsCollector::MetricsReportRecord::MetricsReportRecord() = default;
diff --git a/chrome/browser/performance_manager/observers/metrics_collector.h b/chrome/browser/performance_manager/observers/metrics_collector.h
index 6090e87d3..a0e4515 100644
--- a/chrome/browser/performance_manager/observers/metrics_collector.h
+++ b/chrome/browser/performance_manager/observers/metrics_collector.h
@@ -77,23 +77,19 @@
   };
 
   bool ShouldReportMetrics(const PageNodeImpl* page_node);
-  bool IsCollectingExpectedQueueingTimeForUkm(
-      const resource_coordinator::CoordinationUnitID& page_node_id);
+  bool IsCollectingExpectedQueueingTimeForUkm(PageNodeImpl* page_node);
   void RecordExpectedQueueingTimeForUkm(
-      const resource_coordinator::CoordinationUnitID& page_node_id,
+      PageNodeImpl* page_node,
       const base::TimeDelta& expected_queueing_time);
-  void UpdateUkmSourceIdForPage(
-      const resource_coordinator::CoordinationUnitID& page_node_id,
-      ukm::SourceId ukm_source_id);
+  void UpdateUkmSourceIdForPage(PageNodeImpl* page_node,
+                                ukm::SourceId ukm_source_id);
   void UpdateWithFieldTrialParams();
-  void ResetMetricsReportRecord(resource_coordinator::CoordinationUnitID cu_id);
+  void ResetMetricsReportRecord(PageNodeImpl* page_nod);
 
   // The metrics_report_record_map_ is used to record whether a metric was
   // already reported to avoid reporting multiple metrics.
-  std::map<resource_coordinator::CoordinationUnitID, MetricsReportRecord>
-      metrics_report_record_map_;
-  std::map<resource_coordinator::CoordinationUnitID, UkmCollectionState>
-      ukm_collection_state_map_;
+  std::map<PageNodeImpl*, MetricsReportRecord> metrics_report_record_map_;
+  std::map<PageNodeImpl*, UkmCollectionState> ukm_collection_state_map_;
   // The number of reports to wait before reporting ExpectedQueueingTime. For
   // example, if |frequency_ukm_eqt_reported_| is 2, then the first value is not
   // reported, the second one is, the third one isn't, etc.
diff --git a/chrome/browser/performance_manager/observers/working_set_trimmer_win.cc b/chrome/browser/performance_manager/observers/working_set_trimmer_win.cc
index 38e5420..4420ca86 100644
--- a/chrome/browser/performance_manager/observers/working_set_trimmer_win.cc
+++ b/chrome/browser/performance_manager/observers/working_set_trimmer_win.cc
@@ -47,8 +47,7 @@
 WorkingSetTrimmer::~WorkingSetTrimmer() = default;
 
 bool WorkingSetTrimmer::ShouldObserve(const NodeBase* node) {
-  return node->id().type ==
-         resource_coordinator::CoordinationUnitType::kProcess;
+  return node->type() == ProcessNodeImpl::Type();
 }
 
 void WorkingSetTrimmer::OnAllFramesInProcessFrozen(
diff --git a/chrome/browser/performance_manager/performance_manager.cc b/chrome/browser/performance_manager/performance_manager.cc
index 5ba444c..5da8a683 100644
--- a/chrome/browser/performance_manager/performance_manager.cc
+++ b/chrome/browser/performance_manager/performance_manager.cc
@@ -199,8 +199,8 @@
   base::flat_set<ProcessNodeImpl*> process_nodes;
 
   for (auto it = nodes.begin(); it != nodes.end(); ++it) {
-    switch ((*it)->id().type) {
-      case resource_coordinator::CoordinationUnitType::kPage: {
+    switch ((*it)->type()) {
+      case PageNodeImpl::Type(): {
         auto* page_node = PageNodeImpl::FromNodeBase(it->get());
 
         // Delete the main frame nodes until no more exist.
@@ -211,17 +211,17 @@
         graph_.RemoveNode(page_node);
         break;
       }
-      case resource_coordinator::CoordinationUnitType::kProcess: {
+      case ProcessNodeImpl::Type(): {
         // Keep track of the process nodes for removing once all frames nodes
         // are removed.
         auto* process_node = ProcessNodeImpl::FromNodeBase(it->get());
         process_nodes.insert(process_node);
         break;
       }
-      case resource_coordinator::CoordinationUnitType::kFrame:
+      case FrameNodeImpl::Type():
         break;
-      case resource_coordinator::CoordinationUnitType::kSystem:
-      case resource_coordinator::CoordinationUnitType::kInvalidType:
+      case SystemNodeImpl::Type():
+      case NodeTypeEnum::kInvalidType:
       default: {
         NOTREACHED();
         break;
diff --git a/chrome/browser/performance_manager/performance_manager_tab_helper.h b/chrome/browser/performance_manager/performance_manager_tab_helper.h
index 2232932..927cdb45 100644
--- a/chrome/browser/performance_manager/performance_manager_tab_helper.h
+++ b/chrome/browser/performance_manager/performance_manager_tab_helper.h
@@ -16,7 +16,6 @@
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
 
 namespace performance_manager {
 
diff --git a/chrome/browser/performance_manager/webui_graph_dump_impl.cc b/chrome/browser/performance_manager/webui_graph_dump_impl.cc
index 4b081a0..e80ddc7 100644
--- a/chrome/browser/performance_manager/webui_graph_dump_impl.cc
+++ b/chrome/browser/performance_manager/webui_graph_dump_impl.cc
@@ -37,7 +37,7 @@
       resource_coordinator::mojom::WebUIProcessInfoPtr process_info =
           resource_coordinator::mojom::WebUIProcessInfo::New();
 
-      process_info->id = process->id().id;
+      process_info->id = NodeBase::GetSerializationId(process);
       process_info->pid = process->process_id();
       process_info->cumulative_cpu_usage = process->cumulative_cpu_usage();
       process_info->private_footprint_kb = process->private_footprint_kb();
@@ -53,13 +53,13 @@
       resource_coordinator::mojom::WebUIFrameInfoPtr frame_info =
           resource_coordinator::mojom::WebUIFrameInfo::New();
 
-      frame_info->id = frame->id().id;
+      frame_info->id = NodeBase::GetSerializationId(frame);
 
       auto* parent_frame = frame->parent_frame_node();
-      frame_info->parent_frame_id = parent_frame ? parent_frame->id().id : 0;
+      frame_info->parent_frame_id = NodeBase::GetSerializationId(parent_frame);
 
       auto* process = frame->process_node();
-      frame_info->process_id = process ? process->id().id : 0;
+      frame_info->process_id = NodeBase::GetSerializationId(process);
 
       frame_info->url = frame->url().spec();
 
@@ -74,11 +74,11 @@
       resource_coordinator::mojom::WebUIPageInfoPtr page_info =
           resource_coordinator::mojom::WebUIPageInfo::New();
 
-      page_info->id = page->id().id;
+      page_info->id = NodeBase::GetSerializationId(page);
       page_info->main_frame_url = page->main_frame_url().spec();
 
       auto* main_frame = page->GetMainFrameNode();
-      page_info->main_frame_id = main_frame ? main_frame->id().id : 0;
+      page_info->main_frame_id = NodeBase::GetSerializationId(main_frame);
 
       graph->pages.push_back(std::move(page_info));
     }
diff --git a/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc b/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc
index 77b19047..45e835a 100644
--- a/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc
+++ b/chrome/browser/performance_manager/webui_graph_dump_impl_unittest.cc
@@ -56,7 +56,7 @@
       ++top_level_frames;
 
       // The page's main frame should have an URL.
-      if (frame->id == static_cast<int64_t>(main_frame->id().id))
+      if (frame->id == NodeBase::GetSerializationId(main_frame))
         EXPECT_EQ(kExampleUrl, frame->url);
     }
     EXPECT_NE(0u, frame->id);
diff --git a/chrome/browser/performance_monitor/system_monitor.cc b/chrome/browser/performance_monitor/system_monitor.cc
index c11616a..66b2bd4b 100644
--- a/chrome/browser/performance_monitor/system_monitor.cc
+++ b/chrome/browser/performance_monitor/system_monitor.cc
@@ -70,10 +70,42 @@
 }
 
 // static
+std::unique_ptr<SystemMonitor> SystemMonitor::CreateForTesting(
+    std::unique_ptr<MetricEvaluatorsHelper> helper) {
+  DCHECK(!g_system_metrics_monitor);
+  return base::WrapUnique(new SystemMonitor(std::move(helper)));
+}
+
+// static
 SystemMonitor* SystemMonitor::Get() {
   return g_system_metrics_monitor;
 }
 
+MetricRefreshFrequencies::Builder&
+MetricRefreshFrequencies::Builder::SetFreePhysMemoryMbFrequency(
+    SamplingFrequency freq) {
+  metrics_and_frequencies_.free_phys_memory_mb_frequency = freq;
+  return *this;
+}
+
+MetricRefreshFrequencies::Builder&
+MetricRefreshFrequencies::Builder::SetDiskIdleTimePercentFrequency(
+    SamplingFrequency freq) {
+  metrics_and_frequencies_.disk_idle_time_percent_frequency = freq;
+  return *this;
+}
+
+MetricRefreshFrequencies::Builder&
+MetricRefreshFrequencies::Builder::SetSystemMetricsSamplingFrequency(
+    SamplingFrequency freq) {
+  metrics_and_frequencies_.system_metrics_sampling_frequency = freq;
+  return *this;
+}
+
+MetricRefreshFrequencies MetricRefreshFrequencies::Builder::Build() {
+  return metrics_and_frequencies_;
+}
+
 SystemMonitor::SystemObserver::~SystemObserver() {
   if (g_system_metrics_monitor) {
     // This is a no-op if the observer has already been removed.
diff --git a/chrome/browser/performance_monitor/system_monitor.h b/chrome/browser/performance_monitor/system_monitor.h
index b6995c0..eb88a00 100644
--- a/chrome/browser/performance_monitor/system_monitor.h
+++ b/chrome/browser/performance_monitor/system_monitor.h
@@ -56,6 +56,11 @@
   // with Get().
   static std::unique_ptr<SystemMonitor> Create();
 
+  // Test fixture that allows creating a global SystemMonitor instance that uses
+  // a custom metric evaluator helper.
+  static std::unique_ptr<SystemMonitor> CreateForTesting(
+      std::unique_ptr<MetricEvaluatorsHelper> helper);
+
   // Get the application-wide SystemMonitor (if not present, returns
   // nullptr).
   static SystemMonitor* Get();
@@ -76,6 +81,9 @@
 
       SamplingFrequency system_metrics_sampling_frequency =
           SamplingFrequency::kNoSampling;
+
+      // A builder used to create instances of this object.
+      class Builder;
     };
 
     ~SystemObserver() override;
@@ -111,11 +119,6 @@
     return refresh_timer_;
   }
 
-  void SetMetricEvaluatorsHelperForTesting(
-      std::unique_ptr<MetricEvaluatorsHelper> helper) {
-    metric_evaluators_helper_.reset(helper.release());
-  }
-
  protected:
   friend class SystemMonitorTest;
 
@@ -229,13 +232,6 @@
     return metrics_refresh_frequencies_;
   }
 
-  MetricMetadata* GetMetricEvaluatorMetadataForTesting(
-      MetricEvaluator::Type type) {
-    DCHECK_LT(static_cast<size_t>(type), metric_evaluators_metadata_.size());
-    return const_cast<MetricMetadata*>(
-        &metric_evaluators_metadata_[static_cast<size_t>(type)]);
-  }
-
  private:
   using MetricMetadataArray =
       const std::array<const MetricMetadata,
@@ -297,6 +293,25 @@
   DISALLOW_COPY_AND_ASSIGN(SystemMonitor);
 };
 
+// A builder class used to easily create a MetricRefreshFrequencies object.
+class SystemMonitor::SystemObserver::MetricRefreshFrequencies::Builder {
+ public:
+  Builder() = default;
+  ~Builder() = default;
+
+  Builder& SetFreePhysMemoryMbFrequency(SamplingFrequency freq);
+  Builder& SetDiskIdleTimePercentFrequency(SamplingFrequency freq);
+  Builder& SetSystemMetricsSamplingFrequency(SamplingFrequency freq);
+
+  // Returns the initialized MetricRefreshFrequencies instance.
+  MetricRefreshFrequencies Build();
+
+ private:
+  MetricRefreshFrequencies metrics_and_frequencies_ = {};
+
+  DISALLOW_COPY_AND_ASSIGN(Builder);
+};
+
 // An helper class used by the MetricEvaluator object to retrieve the info
 // they need.
 class MetricEvaluatorsHelper {
diff --git a/chrome/browser/performance_monitor/system_monitor_metrics_logger.cc b/chrome/browser/performance_monitor/system_monitor_metrics_logger.cc
index c72352e..07e09c47 100644
--- a/chrome/browser/performance_monitor/system_monitor_metrics_logger.cc
+++ b/chrome/browser/performance_monitor/system_monitor_metrics_logger.cc
@@ -10,17 +10,21 @@
 
 namespace performance_monitor {
 
+using SamplingFrequency = SystemMonitor::SamplingFrequency;
+using MetricsRefreshFrequencies =
+    SystemMonitor::SystemObserver::MetricRefreshFrequencies;
+
 SystemMonitorMetricsLogger::SystemMonitorMetricsLogger() {
   // These metrics are only available on Windows for now.
 #if defined(OS_WIN)
   if (auto* system_monitor = SystemMonitor::Get()) {
     system_monitor->AddOrUpdateObserver(
-        this, {
-                  .free_phys_memory_mb_frequency =
-                      SystemMonitor::SamplingFrequency::kDefaultFrequency,
-                  .disk_idle_time_percent_frequency =
-                      SystemMonitor::SamplingFrequency::kDefaultFrequency,
-              });
+        this,
+        MetricsRefreshFrequencies::Builder()
+            .SetFreePhysMemoryMbFrequency(SamplingFrequency::kDefaultFrequency)
+            .SetDiskIdleTimePercentFrequency(
+                SamplingFrequency::kDefaultFrequency)
+            .Build());
   }
 #endif
 }
diff --git a/chrome/browser/performance_monitor/system_monitor_unittest.cc b/chrome/browser/performance_monitor/system_monitor_unittest.cc
index 2a117d63..f15a928 100644
--- a/chrome/browser/performance_monitor/system_monitor_unittest.cc
+++ b/chrome/browser/performance_monitor/system_monitor_unittest.cc
@@ -115,17 +115,22 @@
 
   // Add a second observer that observes the amount of free memory at the
   // default frequency.
-  MetricsRefreshFrequencies obs2_metrics_frequencies = {
-      .free_phys_memory_mb_frequency = SamplingFrequency::kDefaultFrequency};
+  MetricsRefreshFrequencies obs2_metrics_frequencies =
+      MetricsRefreshFrequencies::Builder()
+          .SetFreePhysMemoryMbFrequency(SamplingFrequency::kDefaultFrequency)
+          .Build();
+
   system_monitor_->AddOrUpdateObserver(&obs2, obs2_metrics_frequencies);
   EnsureMetricsAreObservedAtExpectedFrequency(
       SamplingFrequency::kDefaultFrequency);
 
   // Add a third observer that observes the amount of free memory and the disk
   // idle time at the default frequency.
-  MetricsRefreshFrequencies obs3_metrics_frequencies = {
-      .free_phys_memory_mb_frequency = SamplingFrequency::kDefaultFrequency,
-      .disk_idle_time_percent_frequency = SamplingFrequency::kDefaultFrequency};
+  MetricsRefreshFrequencies obs3_metrics_frequencies =
+      MetricsRefreshFrequencies::Builder()
+          .SetFreePhysMemoryMbFrequency(SamplingFrequency::kDefaultFrequency)
+          .SetDiskIdleTimePercentFrequency(SamplingFrequency::kDefaultFrequency)
+          .Build();
   system_monitor_->AddOrUpdateObserver(&obs3, obs3_metrics_frequencies);
   EnsureMetricsAreObservedAtExpectedFrequency(
       SamplingFrequency::kDefaultFrequency,
@@ -150,16 +155,18 @@
   ::testing::StrictMock<MockMetricsMonitorObserver> mock_observer_1;
   system_monitor_->AddOrUpdateObserver(
       &mock_observer_1,
-      {.free_phys_memory_mb_frequency = SamplingFrequency::kDefaultFrequency});
+      MetricsRefreshFrequencies::Builder()
+          .SetFreePhysMemoryMbFrequency(SamplingFrequency::kDefaultFrequency)
+          .Build());
 
   ::testing::StrictMock<MockMetricsMonitorObserver> mock_observer_2;
   system_monitor_->AddOrUpdateObserver(
-      &mock_observer_2, {
-                            .disk_idle_time_percent_frequency =
-                                SamplingFrequency::kDefaultFrequency,
-                            .system_metrics_sampling_frequency =
-                                SamplingFrequency::kDefaultFrequency,
-                        });
+      &mock_observer_2,
+      MetricsRefreshFrequencies::Builder()
+          .SetDiskIdleTimePercentFrequency(SamplingFrequency::kDefaultFrequency)
+          .SetSystemMetricsSamplingFrequency(
+              SamplingFrequency::kDefaultFrequency)
+          .Build());
 
   EnsureMetricsAreObservedAtExpectedFrequency(
       SamplingFrequency::kDefaultFrequency,
diff --git a/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc b/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc
index 8fbb9f1..04bf80c0 100644
--- a/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc
+++ b/chrome/browser/policy/machine_level_user_cloud_policy_controller.cc
@@ -135,7 +135,10 @@
       MachineLevelUserCloudPolicyStore::Create(
           dm_token, client_id, policy_dir, cloud_policy_has_priority,
           base::CreateSequencedTaskRunnerWithTraits(
-              {base::MayBlock(), base::TaskPriority::BEST_EFFORT}));
+              {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
+               // Block shutdown to make sure the policy cache update is always
+               // finished.
+               base::TaskShutdownBehavior::BLOCK_SHUTDOWN}));
   return std::make_unique<MachineLevelUserCloudPolicyManager>(
       std::move(policy_store), nullptr, policy_dir,
       base::ThreadTaskRunnerHandle::Get(),
diff --git a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc
index 7367c5e..1a7ff7c6 100644
--- a/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc
+++ b/chrome/browser/resource_coordinator/local_site_characteristics_webcontents_observer.cc
@@ -315,7 +315,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // Observe all frame nodes.
-  if (node->id().type == CoordinationUnitType::kFrame)
+  if (node->type() == performance_manager::FrameNodeImpl::Type())
     return true;
 
   return false;
diff --git a/chrome/browser/resource_coordinator/tab_helper.cc b/chrome/browser/resource_coordinator/tab_helper.cc
index 34d571a..e8e4b48b 100644
--- a/chrome/browser/resource_coordinator/tab_helper.cc
+++ b/chrome/browser/resource_coordinator/tab_helper.cc
@@ -13,9 +13,6 @@
 #include "base/strings/string_number_conversions.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
-// TODO(siggi): This is an abomination, remove this as soon as the page signal
-//     receiver is abolished.
-#include "chrome/browser/performance_manager/performance_manager_tab_helper.h"
 #include "chrome/browser/resource_coordinator/resource_coordinator_parts.h"
 #include "chrome/browser/resource_coordinator/tab_load_tracker.h"
 #include "chrome/browser/resource_coordinator/tab_memory_metrics_reporter.h"
diff --git a/chrome/browser/resource_coordinator/tab_helper.h b/chrome/browser/resource_coordinator/tab_helper.h
index ea38567..4fc4e744 100644
--- a/chrome/browser/resource_coordinator/tab_helper.h
+++ b/chrome/browser/resource_coordinator/tab_helper.h
@@ -16,7 +16,6 @@
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
 #include "url/gurl.h"
 
 namespace resource_coordinator {
@@ -55,9 +54,6 @@
  private:
   explicit ResourceCoordinatorTabHelper(content::WebContents* web_contents);
 
-  // The coordination unit ID of the page node associated with |web_contents()|,
-  // if any.
-  CoordinationUnitID page_cu_id_;
   // TODO(siggi): This is used by the TabLifecycleUnit, remove this with it.
   ukm::SourceId ukm_source_id_ = ukm::kInvalidSourceId;
 
diff --git a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc
index df23385..58e38d30 100644
--- a/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc
+++ b/chrome/browser/resource_coordinator/tab_lifecycle_unit_source.cc
@@ -75,7 +75,7 @@
 
  private:
   bool ShouldObserve(const NodeBase* node) override {
-    return node->id().type == resource_coordinator::CoordinationUnitType::kPage;
+    return node->type() == performance_manager::PageNodeImpl::Type();
   }
 
   static void OnLifecycleStateChangedImpl(
diff --git a/chrome/browser/resource_coordinator/tab_manager_resource_coordinator_signal_observer.cc b/chrome/browser/resource_coordinator/tab_manager_resource_coordinator_signal_observer.cc
index 86755647..efbc7efe 100644
--- a/chrome/browser/resource_coordinator/tab_manager_resource_coordinator_signal_observer.cc
+++ b/chrome/browser/resource_coordinator/tab_manager_resource_coordinator_signal_observer.cc
@@ -41,9 +41,8 @@
 
 bool TabManager::ResourceCoordinatorSignalObserver::ShouldObserve(
     const NodeBase* node) {
-  return node->id().type == resource_coordinator::CoordinationUnitType::kPage ||
-         node->id().type ==
-             resource_coordinator::CoordinationUnitType::kProcess;
+  return node->type() == performance_manager::PageNodeImpl::Type() ||
+         node->type() == performance_manager::ProcessNodeImpl::Type();
 }
 
 void TabManager::ResourceCoordinatorSignalObserver::OnPageAlmostIdleChanged(
diff --git a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing.css b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing.css
index 7bf022a..7cfda15 100644
--- a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing.css
+++ b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing.css
@@ -89,6 +89,10 @@
   padding-top: 4px;
 }
 
+.arc-no-mouse-events {
+  pointer-events: none;
+}
+
 .hidden.arc-events-band-title::before {
   content: '\002B';
 }
diff --git a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js
index ce3f614..f413afd 100644
--- a/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js
+++ b/chrome/browser/resources/chromeos/arc_graphics_tracing/arc_graphics_tracing_ui.js
@@ -917,9 +917,19 @@
       var activeEvents = new Events(
           overviewBand.model.system.cpu[cpuId], 3 /* kActive */,
           3 /* kActive */);
+      // Assume we have an idle before minTimestamp.
       var activeTid = 0;
       var index = activeEvents.getFirstAfter(minTimestamp);
       var activeStartTimestamp = minTimestamp;
+      // Check if previous event goes over minTimestamp, in that case extract
+      // the active thread.
+      if (index > 0) {
+        var lastBefore = activeEvents.getNextEvent(index, -1 /* direction */);
+        if (lastBefore >= 0) {
+          // This may be idle (tid=0) or real thread.
+          activeTid = activeEvents.events[lastBefore][2];
+        }
+      }
       while (index >= 0 && activeEvents.events[index][1] < maxTimestamp) {
         this.addActivityTime_(
             eventsPerTid, activeTid, activeStartTimestamp,
@@ -1027,6 +1037,9 @@
     this.bandSelection = SVG.addRect(
         overviewBand.svg, overviewX, 0, overviewWidth, overviewBand.height,
         '#000' /* color */, 0.1 /* opacity */);
+    // Prevent band selection to capture mouse events that would lead to
+    // incorrect anchor position computation for detailed view.
+    this.bandSelection.classList.add('arc-no-mouse-events');
 
     // Align position in overview and middle line here if possible.
     var left = Math.max(
@@ -1046,7 +1059,7 @@
   }
 
   /**
-   * Helper that adds kIdleIn/kIdle events into the dictionary.
+   * Helper that adds kIdleIn/kIdleOut events into the dictionary.
    *
    * @param {Object} eventsPerTid dictionary to fill. Key is thread id and
    *     value is object that contains all events for thread with related
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 9043f24b..13b4dc04 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_es.xtb
@@ -214,6 +214,7 @@
 <translation id="2626530649491650971">elemento en el que se puede hacer clic</translation>
 <translation id="2628764385451019380">No hay ningún cuadro combinado anterior.</translation>
 <translation id="2637227747952042642">Objeto matemático</translation>
+<translation id="2638785836053527382">Se ha reanudado la descarga de <ph name="FILE_NAME" /></translation>
 <translation id="2639750663247012216">Modificador de ChromeVox</translation>
 <translation id="2644542693584024604">error ortográfico</translation>
 <translation id="2661530546602071611">Aviso</translation>
@@ -253,6 +254,7 @@
 <translation id="287383510823843610">Naranja oscuro</translation>
 <translation id="2879867157561757640">Desliza tres dedos hacia abajo</translation>
 <translation id="288178314850623291">Utiliza los comandos de salto para acceder a los tipos específicos de elementos. Para desplazarte hacia adelante por los títulos, pulsa la tecla de búsqueda+H. Para desplazarte hacia atrás, pulsa la tecla de búsqueda+Mayús+H.</translation>
+<translation id="2885764457467528513">{COUNT,plural, =1{minuto}other{minutos}}</translation>
 <translation id="2894654529758326923">Información</translation>
 <translation id="2899328121302785497">{COUNT,plural, =1{llave de apertura}other{# llaves de apertura}}</translation>
 <translation id="2911433807131383493">Abrir el tutorial de ChromeVox</translation>
@@ -287,6 +289,7 @@
 <translation id="3084806535845658316">no hablar al escribir</translation>
 <translation id="3086746722712840547">nota</translation>
 <translation id="308895241372589742">No hay más expresiones matemáticas.</translation>
+<translation id="3090227230165225418">Anunciar notificaciones de descarga</translation>
 <translation id="3090532668523289635">grp</translation>
 <translation id="3093176084511590672">Siguiente punto de referencia</translation>
 <translation id="3096671415663099226">cbo</translation>
@@ -439,6 +442,7 @@
 <translation id="4148180433151187540">{COUNT,plural, =1{llave de cierre}other{# llaves de cierre}}</translation>
 <translation id="4158704014418536539">Se distingue entre mayúsculas y minúsculas.</translation>
 <translation id="4159784952369912983">Morado</translation>
+<translation id="4161104397932142764">{COUNT,plural, =1{segundo}other{segundos}}</translation>
 <translation id="4161663686871496107">Ya puedes usar la síntesis de voz de ChromeVox</translation>
 <translation id="4173994908659439270">No hay ningún campo de texto editable posterior.</translation>
 <translation id="4176463684765177261">Inhabilitado</translation>
@@ -619,6 +623,7 @@
 <translation id="5349770431644471053">Enlace de retroceso</translation>
 <translation id="536031132345979795">Retrocede durante una lectura continua</translation>
 <translation id="5368000168321181111">Sonido desactivado</translation>
+<translation id="5368505757342402527">Se ha completado un <ph name="PROGRESS" />​% de la descarga de <ph name="FILE_NAME" />. Quedan <ph name="TIME" /> <ph name="UNITS" /> aproximadamente.</translation>
 <translation id="5374320867641260420">No hay ningún botón posterior.</translation>
 <translation id="5376407118396657359">Pulsa la tecla de búsqueda + Ctrl + Alt con las flechas para desplazarte por las celdas.</translation>
 <translation id="5382299583965267720">No hay ningún título de nivel 1 posterior.</translation>
@@ -801,6 +806,7 @@
 <translation id="667999046851023355">Documento</translation>
 <translation id="6688209025607531203">Una alerta no modal</translation>
 <translation id="6689672606256159458">Salmón oscuro</translation>
+<translation id="669617842401078250">Se ha pausado la descarga de <ph name="FILE_NAME" /></translation>
 <translation id="6696967141280706829">Prefacio</translation>
 <translation id="6697092096875747123">Cuadro combinado anterior</translation>
 <translation id="6702609185760332517">{COUNT,plural, =1{exclamación}other{# exclamaciones}}</translation>
@@ -939,6 +945,7 @@
 <translation id="7641134354185483015">No hay ningún título de nivel 3 anterior.</translation>
 <translation id="7659376057562985921"><ph name="VALUE" />, <ph name="NAME" />, cuadro de texto</translation>
 <translation id="7663318257180412551">Título 2</translation>
+<translation id="7668307052366682650">{COUNT,plural, =1{hora}other{horas}}</translation>
 <translation id="7674576868851035240">Siguiente enlace</translation>
 <translation id="7674768236845044097">etiqueta de marcado</translation>
 <translation id="7684431668231950609">Edita texto, entrada de URL</translation>
@@ -953,6 +960,7 @@
         <ph name="LINE_THROUGH_STRING" />
         <ph name="FONT_FAMILY_STRING" /></translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7763537600611320912">Se ha iniciado la descarga de <ph name="FILE_NAME" /></translation>
 <translation id="7770823902658038748"><ph name="VALUE" />, <ph name="NAME" />, cuadro de texto de contraseña</translation>
 <translation id="7776293189010177726">Abre los menús de ChromeVox</translation>
 <translation id="7800558923657349506">Epílogo</translation>
@@ -1077,6 +1085,7 @@
 <translation id="8096975275316362544">Menta</translation>
 <translation id="8098587210054821856">Gris pizarra</translation>
 <translation id="8110647606445335195">No hay puntos de referencia de ARIA.</translation>
+<translation id="812886159861361726">Se ha parado la descarga de <ph name="FILE_NAME" /></translation>
 <translation id="8138880386467279117">Táctil</translation>
 <translation id="8153880621934657047">No está dentro de la tabla.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{guion bajo}other{# guiones bajos}}</translation>
@@ -1146,6 +1155,7 @@
 <translation id="8743786158317878347">introduce contenido estructurado (por ejemplo, tablas)</translation>
 <translation id="8747966237988593539">Lista ordenada</translation>
 <translation id="8749988712346667988">Plata</translation>
+<translation id="875769700429317857">Se ha completado la descarga del archivo <ph name="FILE_NAME" /></translation>
 <translation id="8759334257841767240">No hay ningún enlace posterior.</translation>
 <translation id="8767968232364267681">Siguiente encabezado de nivel 4</translation>
 <translation id="8770473310765924354">sale del contenido estructurado (por ejemplo, tablas)</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 2f3b341e..e2dabc8 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_fil.xtb
@@ -214,6 +214,7 @@
 <translation id="2626530649491650971">naki-click</translation>
 <translation id="2628764385451019380">Walang nakaraang combo box.</translation>
 <translation id="2637227747952042642">Math</translation>
+<translation id="2638785836053527382">Nagpatuloy ang pag-download ng <ph name="FILE_NAME" /></translation>
 <translation id="2639750663247012216">Modifier ng ChromeVox</translation>
 <translation id="2644542693584024604">misspelled</translation>
 <translation id="2661530546602071611">Paunawa</translation>
@@ -253,6 +254,7 @@
 <translation id="287383510823843610">Dark Orange</translation>
 <translation id="2879867157561757640">Mag-swipe pababa gamit ang tatlong daliri</translation>
 <translation id="288178314850623291">Gamitin ang mga command sa paglipat upang pumunta sa mga partikular na uri ng element. Upang pumunta sa mga susunod na heading, pindutin ang Paghahanap + H, o upang bumalik, pindutin ang Paghahanap + Shift + H.</translation>
+<translation id="2885764457467528513">{COUNT,plural, =1{minuto}one{minuto}other{na minuto}}</translation>
 <translation id="2894654529758326923">Impormasyon</translation>
 <translation id="2899328121302785497">{COUNT,plural, =1{kaliwang brace}one{# kaliwang brace}other{# na kaliwang brace}}</translation>
 <translation id="2911433807131383493">Buksan ang tutorial ng ChromeVox</translation>
@@ -287,6 +289,7 @@
 <translation id="3084806535845658316">walang echo ng pagta-type</translation>
 <translation id="3086746722712840547">note</translation>
 <translation id="308895241372589742">Walang susunod na math expression.</translation>
+<translation id="3090227230165225418">Ianunsyo ang mga notification ng pag-download</translation>
 <translation id="3090532668523289635">grp</translation>
 <translation id="3093176084511590672">Susunod na landmark</translation>
 <translation id="3096671415663099226">cbo</translation>
@@ -439,6 +442,7 @@
 <translation id="4148180433151187540">{COUNT,plural, =1{kanang brace}one{# kanang brace}other{# na kanang brace}}</translation>
 <translation id="4158704014418536539">Case sensitive.</translation>
 <translation id="4159784952369912983">Lila</translation>
+<translation id="4161104397932142764">{COUNT,plural, =1{segundo}one{segundo}other{na segundo}}</translation>
 <translation id="4161663686871496107">Handa na ang sinasalitang feedback ng ChromeVox</translation>
 <translation id="4173994908659439270">Walang susunod na na-e-edit na field ng text.</translation>
 <translation id="4176463684765177261">Hindi Pinagana</translation>
@@ -619,6 +623,7 @@
 <translation id="5349770431644471053">Back link</translation>
 <translation id="536031132345979795">Lumaktaw pabalik habang patuloy na nagbabasa</translation>
 <translation id="5368000168321181111">Naka-off ang mga earcon</translation>
+<translation id="5368505757342402527"><ph name="PROGRESS" />% kumpleto ang pag-download ng <ph name="FILE_NAME" />. Humigit-kumulang <ph name="TIME" /> <ph name="UNITS" /> ang natitira.</translation>
 <translation id="5374320867641260420">Walang susunod na button.</translation>
 <translation id="5376407118396657359">Pindutin ang Search+Ctrl+Alt at gamitin ang mga arrow upang mag-navigate sa bawat cell.</translation>
 <translation id="5382299583965267720">Walang susunod na heading sa antas 1.</translation>
@@ -801,6 +806,7 @@
 <translation id="667999046851023355">Dokumento</translation>
 <translation id="6688209025607531203">Isang hindi modal na alerto</translation>
 <translation id="6689672606256159458">Dark Salmon</translation>
+<translation id="669617842401078250">Na-pause ang pag-download ng <ph name="FILE_NAME" /></translation>
 <translation id="6696967141280706829">Preface</translation>
 <translation id="6697092096875747123">Nakaraang combo box</translation>
 <translation id="6702609185760332517">{COUNT,plural, =1{tandang-padamdam}one{# tandang-padamdam}other{# na tandang-padamdam}}</translation>
@@ -939,6 +945,7 @@
 <translation id="7641134354185483015">Walang nakaraang heading sa antas 3.</translation>
 <translation id="7659376057562985921"><ph name="VALUE" />, <ph name="NAME" />, text box</translation>
 <translation id="7663318257180412551">Heading 2</translation>
+<translation id="7668307052366682650">{COUNT,plural, =1{oras}one{oras}other{na oras}}</translation>
 <translation id="7674576868851035240">Susunod na link</translation>
 <translation id="7674768236845044097">mark</translation>
 <translation id="7684431668231950609">I-edit ang text, entry ng URL</translation>
@@ -953,6 +960,7 @@
         <ph name="LINE_THROUGH_STRING" />
         <ph name="FONT_FAMILY_STRING" /></translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7763537600611320912">Nagsimula na ang pag-download ng <ph name="FILE_NAME" /></translation>
 <translation id="7770823902658038748"><ph name="VALUE" />, <ph name="NAME" />, text box ng password</translation>
 <translation id="7776293189010177726">Buksan ang mga menu ng ChromeVox</translation>
 <translation id="7800558923657349506">Epilogue</translation>
@@ -1077,6 +1085,7 @@
 <translation id="8096975275316362544">Mint Cream</translation>
 <translation id="8098587210054821856">Slate Grey</translation>
 <translation id="8110647606445335195">Walang mga landmark ng ARIA.</translation>
+<translation id="812886159861361726">Hininto ang pag-download ng <ph name="FILE_NAME" /></translation>
 <translation id="8138880386467279117">Pindutin</translation>
 <translation id="8153880621934657047">Wala sa loob ng talahanayan.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{underscore}one{# underscore}other{# na underscore}}</translation>
@@ -1146,6 +1155,7 @@
 <translation id="8743786158317878347">maglagay ng nakabalangkas na nilalaman, gaya ng mga talahanayan</translation>
 <translation id="8747966237988593539">Nakaayos na Listahan</translation>
 <translation id="8749988712346667988">Silver</translation>
+<translation id="875769700429317857">Nakumpleto ang pag-download ng <ph name="FILE_NAME" /></translation>
 <translation id="8759334257841767240">Walang susunod na link.</translation>
 <translation id="8767968232364267681">Susunod na heading sa antas 4</translation>
 <translation id="8770473310765924354">lumabas sa nakabalangkas na nilalaman, gaya ng mga talahanayan</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 a97c3c2..8a2b8e9 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ml.xtb
@@ -213,6 +213,7 @@
 <translation id="2626530649491650971">ക്ലിക്കുചെയ്യാവുന്നത്</translation>
 <translation id="2628764385451019380">മുൻ കോമ്പോ ബോക്‌സ് ഒന്നുമില്ല.</translation>
 <translation id="2637227747952042642">മാത്ത്</translation>
+<translation id="2638785836053527382"><ph name="FILE_NAME" /> ഡൗൺലോഡ് പുനരാരംഭിച്ചു</translation>
 <translation id="2639750663247012216">ChromeVox മോഡിഫയർ</translation>
 <translation id="2644542693584024604">അക്ഷരത്തെറ്റ്</translation>
 <translation id="2661530546602071611">അറിയിപ്പ്</translation>
@@ -252,6 +253,7 @@
 <translation id="287383510823843610">കടും ഓറഞ്ച്</translation>
 <translation id="2879867157561757640">മൂന്ന് വിരലുകൾ ഉപയോഗിച്ച് താഴോട്ട് സ്വൈ‌പ്പ് ചെയ്യുക</translation>
 <translation id="288178314850623291">നിർദ്ദിഷ്‌ട തരത്തിലുള്ള ഘടകങ്ങളിലേക്ക് പോകാൻ 'കമാൻഡുകളിലേക്ക് പോകുക' ഉപയോഗിക്കുക. തലക്കെട്ടുകളിലൂടെ മുന്നോട്ട് പോകാൻ തിരയൽ + H അമർത്തുകയോ പിന്നോട്ട് പോകാൻ തിരയൽ + ഷിഫ്‌റ്റ് + H അമർത്തുകയോ ചെയ്യുക.</translation>
+<translation id="2885764457467528513">{COUNT,plural, =1{മിനിറ്റ്}other{മിനിറ്റ്}}</translation>
 <translation id="2894654529758326923">വിവരം</translation>
 <translation id="2899328121302785497">{COUNT,plural, =1{ഇടത് ബ്രേസ്}other{# ഇടത് ബ്രേസുകൾ}}</translation>
 <translation id="2911433807131383493">ChromeVox ട്യൂട്ടോറിയൽ തുറക്കുക</translation>
@@ -286,6 +288,7 @@
 <translation id="3084806535845658316">ടൈപ്പുചെയ്യൽ എക്കോകളൊന്നുമില്ല</translation>
 <translation id="3086746722712840547">note</translation>
 <translation id="308895241372589742">അടുത്ത മാത്ത് എക്‌സ്‌പ്രഷനുകളൊന്നുമില്ല.</translation>
+<translation id="3090227230165225418">ഡൗൺലോഡ് അറിയിപ്പുകൾ പ്രഖ്യാപിക്കുക</translation>
 <translation id="3090532668523289635">grp</translation>
 <translation id="3093176084511590672">അടുത്ത ലാൻഡ്‌മാർക്ക്</translation>
 <translation id="3096671415663099226">cbo</translation>
@@ -438,6 +441,7 @@
 <translation id="4148180433151187540">{COUNT,plural, =1{വലത് ബ്രേസ്}other{# വലത് ബ്രേസുകൾ}}</translation>
 <translation id="4158704014418536539">കേസ് സെൻസിറ്റീവ്.</translation>
 <translation id="4159784952369912983">പര്‍പ്പിള്‍</translation>
+<translation id="4161104397932142764">{COUNT,plural, =1{സെക്കൻഡ്}other{സെക്കൻഡ്}}</translation>
 <translation id="4161663686871496107">ChromeVox സംഭാഷണ ഫീഡ്‌ബാക്ക് തയ്യാറാണ്</translation>
 <translation id="4173994908659439270">എഡിറ്റുചെയ്യാൻ കഴിയുന്ന അടുത്ത വാചക ഫീൽഡ് ഒന്നുമില്ല.</translation>
 <translation id="4176463684765177261">അപ്രാപ്‌തമാക്കി</translation>
@@ -618,6 +622,7 @@
 <translation id="5349770431644471053">ബാക്ക്‌ ലിങ്ക്</translation>
 <translation id="536031132345979795">വായന തുടരുന്നതിനിടയിൽ പുറകിലേക്ക് പോകുക</translation>
 <translation id="5368000168321181111">ഇയർകോൺസ് ഓഫാണ്</translation>
+<translation id="5368505757342402527"><ph name="FILE_NAME" /> ഡൗൺലോഡ് <ph name="PROGRESS" />% പൂർത്തിയായി. ഏകദേശം <ph name="TIME" /> <ph name="UNITS" /> ശേഷിക്കുന്നു.</translation>
 <translation id="5374320867641260420">അടുത്ത ബട്ടൺ ഒന്നുമില്ല.</translation>
 <translation id="5376407118396657359">കളം പ്രകാരം നാവിഗേറ്റ് ചെയ്യാൻ തിരയൽ+Ctrl+Alt അമർത്തി അമ്പടയാള കീകൾ ഉപയോഗിക്കുക.</translation>
 <translation id="5382299583965267720">അടുത്ത നില 1 ശീർഷകം ഒന്നുമില്ല.</translation>
@@ -800,6 +805,7 @@
 <translation id="667999046851023355">പ്രമാണം</translation>
 <translation id="6688209025607531203">ഒരു നോൺ മോഡൽ അലേർട്ട്</translation>
 <translation id="6689672606256159458">കടും സാൽമൻ</translation>
+<translation id="669617842401078250"><ph name="FILE_NAME" /> ഡൗൺലോഡ് താൽക്കാലികമായി നിർത്തി</translation>
 <translation id="6696967141280706829">പീഠിക</translation>
 <translation id="6697092096875747123">മുൻ കോംബോ ബോക്സ്</translation>
 <translation id="6702609185760332517">{COUNT,plural, =1{ആശ്ചര്യചിഹ്നം}other{# ആശ്ചര്യചിഹ്നങ്ങൾ}}</translation>
@@ -938,6 +944,7 @@
 <translation id="7641134354185483015">മുൻ നില 3 ശീർഷകം ഒന്നുമില്ല.</translation>
 <translation id="7659376057562985921"><ph name="VALUE" />, <ph name="NAME" />, വാചക ബോക്സ്</translation>
 <translation id="7663318257180412551">ശീർഷകം 2</translation>
+<translation id="7668307052366682650">{COUNT,plural, =1{മണിക്കൂർ}other{മണിക്കൂർ}}</translation>
 <translation id="7674576868851035240">അടുത്ത ലിങ്ക്</translation>
 <translation id="7674768236845044097">അടയാളപ്പെടുത്തുക</translation>
 <translation id="7684431668231950609">വാചകം എഡിറ്റ് ചെയ്യുക, URL എൻട്രി</translation>
@@ -952,6 +959,7 @@
         <ph name="LINE_THROUGH_STRING" />
         <ph name="FONT_FAMILY_STRING" /></translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7763537600611320912"><ph name="FILE_NAME" /> ഡൗൺലോഡ് ആരംഭിച്ചു</translation>
 <translation id="7770823902658038748"><ph name="VALUE" />, <ph name="NAME" />, പാസ്‌വേഡ് വാചക ബോക്സ്</translation>
 <translation id="7776293189010177726">ChromeVox മെനുകൾ തുറക്കുക</translation>
 <translation id="7800558923657349506">ഉപസംഹാരം</translation>
@@ -1076,6 +1084,7 @@
 <translation id="8096975275316362544">മിൻ്റ് ക്രീം</translation>
 <translation id="8098587210054821856">സ്ലേറ്റ് ഗ്രേ</translation>
 <translation id="8110647606445335195">ARIA ലാൻഡ്‌മാർക്കുകൾ ഒന്നുമില്ല.</translation>
+<translation id="812886159861361726"><ph name="FILE_NAME" /> ഡൗൺലോഡ് നിർത്തി</translation>
 <translation id="8138880386467279117">സ്‌പർശിക്കുക</translation>
 <translation id="8153880621934657047">പട്ടികയ്‌ക്കുള്ളിലല്ല.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{അടിവര}other{# അടിവരകൾ}}</translation>
@@ -1145,6 +1154,7 @@
 <translation id="8743786158317878347">പട്ടികകൾ പോലുള്ള ഘടനാപരമായ ഉള്ളടക്കം നൽകുക</translation>
 <translation id="8747966237988593539">ക്രമപ്പെടുത്തിയ ലിസ്റ്റ്</translation>
 <translation id="8749988712346667988">വെള്ളി</translation>
+<translation id="875769700429317857"><ph name="FILE_NAME" /> ഡൗൺലോഡ് പൂർത്തിയായി</translation>
 <translation id="8759334257841767240">അടുത്ത ലിങ്ക് ഒന്നുമില്ല.</translation>
 <translation id="8767968232364267681">അടുത്ത നില 4 ശീർഷകം</translation>
 <translation id="8770473310765924354">പട്ടികകൾ പോലുള്ള ഘടനാപരമായ ഉള്ളടക്കത്തിൽ നിന്ന് പുറത്തുകടക്കുക</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 e6face6..e66f5fdd 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_no.xtb
@@ -214,6 +214,7 @@
 <translation id="2626530649491650971">klikkbart</translation>
 <translation id="2628764385451019380">Det finnes ingen tidligere kombinasjonsbokser.</translation>
 <translation id="2637227747952042642">Matematikk</translation>
+<translation id="2638785836053527382">Nedlastingen av <ph name="FILE_NAME" /> ble gjenopptatt</translation>
 <translation id="2639750663247012216">ChromeVox-modifikator</translation>
 <translation id="2644542693584024604">feilstavet</translation>
 <translation id="2661530546602071611">Merknad</translation>
@@ -253,6 +254,7 @@
 <translation id="287383510823843610">Mørk oransje</translation>
 <translation id="2879867157561757640">Sveip tre fingre ned</translation>
 <translation id="288178314850623291">Du kan bruke «gå til»-kommandoer for å gå til spesifikke elementtyper. For å gå fra overskrift til overskrift, trykk på Søk+H. For å gå tilbake, trykk på Søk+Shift+H.</translation>
+<translation id="2885764457467528513">{COUNT,plural, =1{minutt}other{minutter}}</translation>
 <translation id="2894654529758326923">Informasjon</translation>
 <translation id="2899328121302785497">{COUNT,plural, =1{venstre klammeparentes}other{# venstre klammeparenteser}}</translation>
 <translation id="2911433807131383493">Åpne ChromeVox-veiledningen</translation>
@@ -287,6 +289,7 @@
 <translation id="3084806535845658316">uten inntastingsekko</translation>
 <translation id="3086746722712840547">note</translation>
 <translation id="308895241372589742">Det finnes ingen neste matteuttrykk.</translation>
+<translation id="3090227230165225418">Les opp nedlastingsvarsler</translation>
 <translation id="3090532668523289635">grp</translation>
 <translation id="3093176084511590672">Neste landemerke</translation>
 <translation id="3096671415663099226">cbo</translation>
@@ -439,6 +442,7 @@
 <translation id="4148180433151187540">{COUNT,plural, =1{høyre klammeparentes}other{# høyre klammeparenteser}}</translation>
 <translation id="4158704014418536539">Skiller mellom store og små bokstaver.</translation>
 <translation id="4159784952369912983">Fiolett</translation>
+<translation id="4161104397932142764">{COUNT,plural, =1{sekund}other{sekunder}}</translation>
 <translation id="4161663686871496107">Muntlig tilbakemelding med ChromeVox er klar</translation>
 <translation id="4173994908659439270">Det finnes ingen flere redigerbare tekstområder.</translation>
 <translation id="4176463684765177261">Deaktivert</translation>
@@ -619,6 +623,7 @@
 <translation id="5349770431644471053">Tilbakelink</translation>
 <translation id="536031132345979795">Hopp bakover under kontinuerlig lesing</translation>
 <translation id="5368000168321181111">Lydsignaler er av</translation>
+<translation id="5368505757342402527">Nedlastingen av <ph name="FILE_NAME" /> er <ph name="PROGRESS" /> % fullført. Omtrent <ph name="TIME" /> <ph name="UNITS" /> gjenstår.</translation>
 <translation id="5374320867641260420">Det finnes ikke flere knapper.</translation>
 <translation id="5376407118396657359">Trykk på Søk + Ctrl + Alt og pilene for å navigere mellom cellene.</translation>
 <translation id="5382299583965267720">Det fins ikke flere overskrifter på nivå 1.</translation>
@@ -801,6 +806,7 @@
 <translation id="667999046851023355">Dokument</translation>
 <translation id="6688209025607531203">Et ikke-modalt varsel</translation>
 <translation id="6689672606256159458">Mørk lakserosa</translation>
+<translation id="669617842401078250">Nedlastingen av <ph name="FILE_NAME" /> er satt på pause</translation>
 <translation id="6696967141280706829">Forord</translation>
 <translation id="6697092096875747123">Forrige kombinasjonsfelt</translation>
 <translation id="6702609185760332517">{COUNT,plural, =1{utropstegn}other{# utropstegn}}</translation>
@@ -939,6 +945,7 @@
 <translation id="7641134354185483015">Det finnes ikke tidligere overskrifter på nivå 3.</translation>
 <translation id="7659376057562985921"><ph name="VALUE" />, <ph name="NAME" />, tekstfelt</translation>
 <translation id="7663318257180412551">Overskrift 2</translation>
+<translation id="7668307052366682650">{COUNT,plural, =1{time}other{timer}}</translation>
 <translation id="7674576868851035240">Neste link</translation>
 <translation id="7674768236845044097">mark</translation>
 <translation id="7684431668231950609">Rediger tekst – nettadresseoppføring</translation>
@@ -953,6 +960,7 @@
         <ph name="LINE_THROUGH_STRING" />
         <ph name="FONT_FAMILY_STRING" /></translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7763537600611320912">Startet nedlasting av <ph name="FILE_NAME" /></translation>
 <translation id="7770823902658038748"><ph name="VALUE" />, <ph name="NAME" />, tekstfelt for passord</translation>
 <translation id="7776293189010177726">Åpne ChromeVox-menyene</translation>
 <translation id="7800558923657349506">Epilog</translation>
@@ -1077,6 +1085,7 @@
 <translation id="8096975275316362544">Mintkrem</translation>
 <translation id="8098587210054821856">Skifergrå</translation>
 <translation id="8110647606445335195">Det finnes ingen ARIA-landmerker.</translation>
+<translation id="812886159861361726">Nedlasting av <ph name="FILE_NAME" /> er stanset</translation>
 <translation id="8138880386467279117">Berøring</translation>
 <translation id="8153880621934657047">Ikke inne i tabellen.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{understrek}other{# understreker}}</translation>
@@ -1146,6 +1155,7 @@
 <translation id="8743786158317878347">åpne strukturert innhold, for eksempel tabeller</translation>
 <translation id="8747966237988593539">Nummerert liste</translation>
 <translation id="8749988712346667988">Sølv</translation>
+<translation id="875769700429317857">Nedlastingen av <ph name="FILE_NAME" /> er fullført</translation>
 <translation id="8759334257841767240">Det finnes ikke flere linker.</translation>
 <translation id="8767968232364267681">Neste overskrift på nivå 4</translation>
 <translation id="8770473310765924354">avslutt strukturert innhold, for eksempel tabeller</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 30e9e36..ed21529 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ru.xtb
@@ -214,6 +214,7 @@
 <translation id="2626530649491650971">clickable</translation>
 <translation id="2628764385451019380">Предыдущего поля со списком нет.</translation>
 <translation id="2637227747952042642">Math</translation>
+<translation id="2638785836053527382">Скачивание файла <ph name="FILE_NAME" /> возобновлено</translation>
 <translation id="2639750663247012216">Модификатор ChromeVox.</translation>
 <translation id="2644542693584024604">misspelled</translation>
 <translation id="2661530546602071611">Примечание</translation>
@@ -253,6 +254,7 @@
 <translation id="287383510823843610">Темно-оранжевый</translation>
 <translation id="2879867157561757640">Проведите тремя пальцами вниз</translation>
 <translation id="288178314850623291">Вы можете перемещаться между определенными элементами страницы. Например, чтобы перейти к следующему заголовку, нажмите SEARCH + H, а к предыдущему – SEARCH + SHIFT + H.</translation>
+<translation id="2885764457467528513">{COUNT,plural, =1{мин.}one{мин.}few{мин.}many{мин.}other{мин.}}</translation>
 <translation id="2894654529758326923">Подробные сведения</translation>
 <translation id="2899328121302785497">{COUNT,plural, =1{открывающая фигурная скобка}one{# открывающая фигурная скобка}few{# открывающие фигурные скобки}many{# открывающих фигурных скобок}other{# left braces}}</translation>
 <translation id="2911433807131383493">Открыть руководство ChromeVox</translation>
@@ -287,6 +289,7 @@
 <translation id="3084806535845658316">Без озвучивания.</translation>
 <translation id="3086746722712840547">note</translation>
 <translation id="308895241372589742">Следующего математического выражения нет.</translation>
+<translation id="3090227230165225418">Объявлять уведомления о скачиваниях</translation>
 <translation id="3090532668523289635">grp</translation>
 <translation id="3093176084511590672">Перейти к следующему ориентиру</translation>
 <translation id="3096671415663099226">cbo</translation>
@@ -439,6 +442,7 @@
 <translation id="4148180433151187540">{COUNT,plural, =1{закрывающая фигурная скобка}one{# закрывающая фигурная скобка}few{# закрывающие фигурные скобки}many{# закрывающих фигурных скобок}other{# right braces}}</translation>
 <translation id="4158704014418536539">С учетом регистра.</translation>
 <translation id="4159784952369912983">Фиолетовый</translation>
+<translation id="4161104397932142764">{COUNT,plural, =1{сек.}one{сек.}few{сек.}many{сек.}other{сек.}}</translation>
 <translation id="4161663686871496107">Расширение ChromeVox включено.</translation>
 <translation id="4173994908659439270">Следующего редактируемого текстового поля нет.</translation>
 <translation id="4176463684765177261">Отключено</translation>
@@ -619,6 +623,7 @@
 <translation id="5349770431644471053">Обратная ссылка</translation>
 <translation id="536031132345979795">Вернуться назад во время непрерывного чтения</translation>
 <translation id="5368000168321181111">Звуковые сигналы отключены.</translation>
+<translation id="5368505757342402527">Скачивание файла <ph name="FILE_NAME" /> завершено на <ph name="PROGRESS" /> %. Осталось примерно <ph name="TIME" /> <ph name="UNITS" />.</translation>
 <translation id="5374320867641260420">Следующей кнопки нет.</translation>
 <translation id="5376407118396657359">Для перемещения к другой ячейке нажмите Поиск + Ctrl + Alt и нужную стрелку.</translation>
 <translation id="5382299583965267720">Следующего заголовка первого уровня нет.</translation>
@@ -801,6 +806,7 @@
 <translation id="667999046851023355">Документ</translation>
 <translation id="6688209025607531203">Немодальное оповещение</translation>
 <translation id="6689672606256159458">Темно-лососевый</translation>
+<translation id="669617842401078250">Скачивание файла <ph name="FILE_NAME" /> приостановлено</translation>
 <translation id="6696967141280706829">Вступление</translation>
 <translation id="6697092096875747123">Перейти к предыдущему полю со списком</translation>
 <translation id="6702609185760332517">{COUNT,plural, =1{восклицательный знак}one{# восклицательный знак}few{# восклицательных знака}many{# восклицательных знаков}other{# восклицательного знака}}</translation>
@@ -939,6 +945,7 @@
 <translation id="7641134354185483015">Предыдущего заголовка третьего уровня нет.</translation>
 <translation id="7659376057562985921">Текстовое поле <ph name="NAME" /> со значением <ph name="VALUE" /></translation>
 <translation id="7663318257180412551">Заголовок второго уровня.</translation>
+<translation id="7668307052366682650">{COUNT,plural, =1{ч.}one{ч.}few{ч.}many{ч.}other{ч.}}</translation>
 <translation id="7674576868851035240">Перейти к следующей ссылке</translation>
 <translation id="7674768236845044097">mark</translation>
 <translation id="7684431668231950609">Редактирование текста, URL</translation>
@@ -953,6 +960,7 @@
         <ph name="LINE_THROUGH_STRING" />
         <ph name="FONT_FAMILY_STRING" /></translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7763537600611320912">Началось скачивание файла <ph name="FILE_NAME" /></translation>
 <translation id="7770823902658038748">Поле для ввода пароля "<ph name="NAME" />" со значением "<ph name="VALUE" />"</translation>
 <translation id="7776293189010177726">Открыть меню ChromeVox</translation>
 <translation id="7800558923657349506">Эпилог</translation>
@@ -1077,6 +1085,7 @@
 <translation id="8096975275316362544">Мятные сливки</translation>
 <translation id="8098587210054821856">Аспидно-серый</translation>
 <translation id="8110647606445335195">Ориентиров ARIA нет.</translation>
+<translation id="812886159861361726">Скачивание файла <ph name="FILE_NAME" /> остановлено</translation>
 <translation id="8138880386467279117">Нажмите</translation>
 <translation id="8153880621934657047">Ошибка. Перейдите в таблицу.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{символ подчеркивания}one{# символ подчеркивания}few{# символа подчеркивания}many{# символов подчеркивания}other{# underscores}}</translation>
@@ -1146,6 +1155,7 @@
 <translation id="8743786158317878347">Ввести структурированное содержание, например таблицу</translation>
 <translation id="8747966237988593539">Нумерованный список.</translation>
 <translation id="8749988712346667988">Серебристый</translation>
+<translation id="875769700429317857">Файл <ph name="FILE_NAME" /> скачан</translation>
 <translation id="8759334257841767240">Следующей ссылки нет.</translation>
 <translation id="8767968232364267681">Перейти к следующему заголовку четвертого уровня</translation>
 <translation id="8770473310765924354">Закончить ввод структурированного содержания, например таблицы</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 19fc666e..47806f20 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_ta.xtb
@@ -709,7 +709,7 @@
 <translation id="5937336320314038555">{COUNT,plural, =1{சமக்குறி}other{# சமக்குறிகள்}}</translation>
 <translation id="5939518447894949180">மீட்டமை</translation>
 <translation id="5948123859135882163">அமைப்பு மற்றும் பொருள்விளக்கத்திற்கு இடையே கணிதக் கோவைகளின் விளக்கத்தை நிலைமாற்றவும்</translation>
-<translation id="5955304353782037793">பயன்பாடு</translation>
+<translation id="5955304353782037793">ஆப்ஸ்</translation>
 <translation id="5956928062748260866">செய்தி</translation>
 <translation id="5963413905009737549">பிரிவு</translation>
 <translation id="5968607524793740041">சூழல் மெனுவைக் காட்டு</translation>
@@ -884,7 +884,7 @@
 <translation id="72393384879519786">தலைப்பு</translation>
 <translation id="7240858705033280249">விவரங்களைக் காட்டு</translation>
 <translation id="7241683698754534149">நீண்ட விளக்கத்தைப் புதிய தாவலில் திறக்கவும்</translation>
-<translation id="7248671827512403053">பயன்பாடு</translation>
+<translation id="7248671827512403053">ஆப்ஸ்</translation>
 <translation id="725969808843520477">அடுத்த ரேடியோ பட்டன்</translation>
 <translation id="7261612856573623172">சாதனத்தின் இயல்பு ‘உரையிலிருந்து பேச்சுக்கான' குரல்</translation>
 <translation id="7269119382257320590">நிறுத்தற்குறி இல்லை</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 954237cd..4d14260 100644
--- a/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
+++ b/chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings_te.xtb
@@ -214,6 +214,7 @@
 <translation id="2626530649491650971">క్లిక్ చేయదగినది</translation>
 <translation id="2628764385451019380">మునుపటి కాంబో పెట్టె లేదు.</translation>
 <translation id="2637227747952042642">గణితం</translation>
+<translation id="2638785836053527382"><ph name="FILE_NAME" /> డౌన్‌లోడ్ తిరిగి కొనసాగించబడింది</translation>
 <translation id="2639750663247012216">ChromeVox మాడిఫైయర్</translation>
 <translation id="2644542693584024604">అక్షరక్రమం తప్పుగా ఉంది</translation>
 <translation id="2661530546602071611">గమనిక</translation>
@@ -253,6 +254,7 @@
 <translation id="287383510823843610">ముదురు నారింజ రంగు</translation>
 <translation id="2879867157561757640">మూడు వేళ్లతో కిందికి స్వైప్ చేయండి</translation>
 <translation id="288178314850623291">నిర్దిష్ట రకాల మూలకాలకు దాటవేయడానికి దాటవేసే ఆదేశాలను ఉపయోగించండి. ముఖ్య శీర్షికల మధ్య ముందుకు మారడానికి, శోధన + H నొక్కండి లేదా వెనుకకు వెళ్లడానికి, శోధన + Shift + H నొక్కండి.</translation>
+<translation id="2885764457467528513">{COUNT,plural, =1{నిమిషం}other{నిమిషాలు}}</translation>
 <translation id="2894654529758326923">సమాచారం</translation>
 <translation id="2899328121302785497">{COUNT,plural, =1{ఎడమ ధనుర్బంధ గుర్తు}other{# ఎడమ ధనుర్బంధ గుర్తులు}}</translation>
 <translation id="2911433807131383493">ChromeVox ట్యుటోరియల్‌ను తెరవండి</translation>
@@ -287,6 +289,7 @@
 <translation id="3084806535845658316">టైపింగ్ అనుకరణ లేదు</translation>
 <translation id="3086746722712840547">note</translation>
 <translation id="308895241372589742">తరువాత గణిత వ్యక్తీకరణ లేదు.</translation>
+<translation id="3090227230165225418">డౌన్‌లోడ్ నోటిఫికేషన్‌లను ప్రకటించు</translation>
 <translation id="3090532668523289635">grp</translation>
 <translation id="3093176084511590672">తరువాత మైలురాయి</translation>
 <translation id="3096671415663099226">cbo</translation>
@@ -439,6 +442,7 @@
 <translation id="4148180433151187540">{COUNT,plural, =1{కుడి ధనుర్బంధ గుర్తు}other{# కుడి ధనుర్బంధ గుర్తులు}}</translation>
 <translation id="4158704014418536539">కేస్ ఆధారితం.</translation>
 <translation id="4159784952369912983">వంగపండు రంగు</translation>
+<translation id="4161104397932142764">{COUNT,plural, =1{సెకను}other{సెకన్లు}}</translation>
 <translation id="4161663686871496107">ChromeVox చదివి వినిపించే అభిప్రాయం సిద్ధంగా ఉంది</translation>
 <translation id="4173994908659439270">సవరించగల వచన ఫీల్డ్ ఏదీ తర్వాత లేదు.</translation>
 <translation id="4176463684765177261">ఆపివేయబడింది</translation>
@@ -619,6 +623,7 @@
 <translation id="5349770431644471053">వెనుకకు తీసుకువెళ్లే లింక్‌</translation>
 <translation id="536031132345979795">నిరంతరంగా చదివేటప్పుడు వెనుకకు దాటవేయండి</translation>
 <translation id="5368000168321181111">శబ్ద హెచ్చరికలు ఆపివేయబడ్డాయి</translation>
+<translation id="5368505757342402527"><ph name="FILE_NAME" /> డౌన్‌లోడ్ <ph name="PROGRESS" />% పూర్తయింది. సుమారు <ph name="TIME" /> <ph name="UNITS" /> మిగిలి ఉంది.</translation>
 <translation id="5374320867641260420">తర్వాతి బటన్ లేదు.</translation>
 <translation id="5376407118396657359">గడుల వారీగా నావిగేట్ చేయడం కోసం బాణం గుర్తు ఉన్న బటన్‌లతో పాటు శోధన+Ctrl+Alt నొక్కండి.</translation>
 <translation id="5382299583965267720">తరువాత స్థాయి 1 శీర్షిక లేదు.</translation>
@@ -801,6 +806,7 @@
 <translation id="667999046851023355">పత్రం</translation>
 <translation id="6688209025607531203">నమూనా యేతర హెచ్చరిక</translation>
 <translation id="6689672606256159458">ముదురు గులాబీ నారింజ రంగు</translation>
+<translation id="669617842401078250"><ph name="FILE_NAME" /> డౌన్‌లోడ్ పాజ్ చేయబడింది</translation>
 <translation id="6696967141280706829">ముందుమాట</translation>
 <translation id="6697092096875747123">మునుపటి కాంబో పెట్టె</translation>
 <translation id="6702609185760332517">{COUNT,plural, =1{ఆశ్చర్యార్థక గుర్తు}other{# ఆశ్చర్యార్థక గుర్తులు}}</translation>
@@ -939,6 +945,7 @@
 <translation id="7641134354185483015">మునుపటి స్థాయి 3 శీర్షిక లేదు.</translation>
 <translation id="7659376057562985921"><ph name="VALUE" />, <ph name="NAME" />, వచన పెట్టె</translation>
 <translation id="7663318257180412551">శీర్షిక 2</translation>
+<translation id="7668307052366682650">{COUNT,plural, =1{గంట}other{గంటలు}}</translation>
 <translation id="7674576868851035240">తర్వాతి లింక్</translation>
 <translation id="7674768236845044097">గుర్తు పెట్టండి</translation>
 <translation id="7684431668231950609">వచనం, URL నమోదును సవరించండి</translation>
@@ -953,6 +960,7 @@
         <ph name="LINE_THROUGH_STRING" />
         <ph name="FONT_FAMILY_STRING" /></translation>
 <translation id="7701196182766842984">autolst</translation>
+<translation id="7763537600611320912"><ph name="FILE_NAME" />ను డౌన్‌లోడ్ చేయడం ప్రారంభించబడింది</translation>
 <translation id="7770823902658038748"><ph name="VALUE" />, <ph name="NAME" />, పాస్‌వర్డ్ వచన పెట్టె</translation>
 <translation id="7776293189010177726">ChromeVox మెనులను తెరుస్తుంది</translation>
 <translation id="7800558923657349506">ఉపసంహారం</translation>
@@ -1077,6 +1085,7 @@
 <translation id="8096975275316362544">పుదీనా మీగడ రంగు</translation>
 <translation id="8098587210054821856">మేఘవర్ణ బూడిద రంగు</translation>
 <translation id="8110647606445335195">ARIA మైలురాళ్లు లేవు.</translation>
+<translation id="812886159861361726"><ph name="FILE_NAME" /> డౌన్‌లోడ్ ఆపివేయబడింది</translation>
 <translation id="8138880386467279117">స్పర్శ</translation>
 <translation id="8153880621934657047">లోపల పట్టిక కాదు.</translation>
 <translation id="817440585505441544">{COUNT,plural, =1{అండర్‌స్కోర్ గుర్తు}other{# అండర్‌స్కోర్ గుర్తులు}}</translation>
@@ -1146,6 +1155,7 @@
 <translation id="8743786158317878347">పట్టికల వంటి ఆకృతీకరించిన కంటెంట్‌లోకి ప్రవేశించండి</translation>
 <translation id="8747966237988593539">క్రమం చేసిన జాబితా</translation>
 <translation id="8749988712346667988">వెండి</translation>
+<translation id="875769700429317857"><ph name="FILE_NAME" />ను డౌన్‌లోడ్ చేయడం పూర్తయింది</translation>
 <translation id="8759334257841767240">తర్వాతి లింక్ లేదు.</translation>
 <translation id="8767968232364267681">తరువాత స్థాయి 4 శీర్షిక</translation>
 <translation id="8770473310765924354">పట్టికల వంటి ఆకృతీకరించిన కంటెంట్ నుండి నిష్క్రమించండి</translation>
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_am.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_am.xtb
index 103a8e24..7f6f5fc 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_am.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_am.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="am">
+<translation id="4021716437419160885">ወደ ታች ይሸብልሉ</translation>
+<translation id="4217571870635786043">በቃል ማስጻፍ</translation>
+<translation id="4378308539633073595">ወደ ፊት ያሸብልሉ</translation>
+<translation id="495046168593986294">ወደ ላይ ይሸብልሉ</translation>
+<translation id="5513242761114685513">የአውድ ምናሌ</translation>
+<translation id="6945221475159498467">ይምረጡ</translation>
+<translation id="7026338066939101231">ቅነሳ</translation>
 <translation id="7088960765736518739">የመዳረሻ መቀየሪያ</translation>
+<translation id="7846634333498149051">የቁልፍ ሰሌዳ</translation>
+<translation id="8004512796067398576">ጭማሬ</translation>
+<translation id="8428213095426709021">ቅንብሮች</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ar.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ar.xtb
index 34608a0..0a4631e 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ar.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ar.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ar">
+<translation id="4021716437419160885">التمرير لأسفل</translation>
+<translation id="4217571870635786043">إملاء</translation>
+<translation id="4378308539633073595">التمرير للأمام</translation>
+<translation id="495046168593986294">التمرير لأعلى</translation>
+<translation id="5513242761114685513">قائمة السياقات</translation>
+<translation id="6945221475159498467">تحديد</translation>
+<translation id="7026338066939101231">تناقص</translation>
 <translation id="7088960765736518739">الوصول عبر مفتاح التحويل</translation>
+<translation id="7846634333498149051">لوحة المفاتيح</translation>
+<translation id="8004512796067398576">زيادة</translation>
+<translation id="8428213095426709021">الإعدادات</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_bg.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_bg.xtb
index 0fadec1..53fa2ae 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_bg.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_bg.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="bg">
+<translation id="4021716437419160885">Превъртане надолу</translation>
+<translation id="4217571870635786043">Диктуване</translation>
+<translation id="4378308539633073595">Превъртане напред</translation>
+<translation id="495046168593986294">Превъртане нагоре</translation>
+<translation id="5513242761114685513">Контекстно меню</translation>
+<translation id="6945221475159498467">Избиране</translation>
+<translation id="7026338066939101231">Намаляване</translation>
 <translation id="7088960765736518739">Достъп с превключване</translation>
+<translation id="7846634333498149051">Клавиатура</translation>
+<translation id="8004512796067398576">Увеличаване</translation>
+<translation id="8428213095426709021">Настройки</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_bn.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_bn.xtb
index 89ed3de..60e5b324 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_bn.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_bn.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="bn">
+<translation id="4021716437419160885">নিচের দিকে স্ক্রল করুন</translation>
+<translation id="4217571870635786043">ডিক্টেশন</translation>
+<translation id="4378308539633073595">স্ক্রল করে এগিয়ে যান</translation>
+<translation id="495046168593986294">উপরের দিকে স্ক্রল করুন</translation>
+<translation id="5513242761114685513">প্রসঙ্গ মেনু</translation>
+<translation id="6945221475159498467">নির্বাচন</translation>
+<translation id="7026338066939101231">হ্রাস</translation>
 <translation id="7088960765736518739">অ্যাক্সেস পাল্টান</translation>
+<translation id="7846634333498149051">কীবোর্ড</translation>
+<translation id="8004512796067398576">বৃদ্ধি</translation>
+<translation id="8428213095426709021">সেটিংস</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ca.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ca.xtb
index ecd3ba6..9c64f26b 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ca.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ca.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ca">
+<translation id="4021716437419160885">Desplaça't cap avall</translation>
+<translation id="4217571870635786043">Dictat</translation>
+<translation id="4378308539633073595">Desplaça cap endavant</translation>
+<translation id="495046168593986294">Desplaça't cap amunt</translation>
+<translation id="5513242761114685513">Menú contextual</translation>
+<translation id="6945221475159498467">Selecciona</translation>
+<translation id="7026338066939101231">Disminueix</translation>
 <translation id="7088960765736518739">Accés amb interruptor</translation>
+<translation id="7846634333498149051">Teclat</translation>
+<translation id="8004512796067398576">Incrementa</translation>
+<translation id="8428213095426709021">Configuració</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_cs.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_cs.xtb
index a3d689b..d60173f 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_cs.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_cs.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="cs">
+<translation id="4021716437419160885">Posunout dolů</translation>
+<translation id="4217571870635786043">Diktování</translation>
+<translation id="4378308539633073595">Posunout vpřed</translation>
+<translation id="495046168593986294">Posunout nahoru</translation>
+<translation id="5513242761114685513">Kontextová nabídka</translation>
+<translation id="6945221475159498467">Vybrat</translation>
+<translation id="7026338066939101231">Snížit</translation>
 <translation id="7088960765736518739">Přístup pomocí přepínačů</translation>
+<translation id="7846634333498149051">Klávesnice</translation>
+<translation id="8004512796067398576">Zvýšit</translation>
+<translation id="8428213095426709021">Nastavení</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_da.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_da.xtb
index 68b4543..82ca7df 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_da.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_da.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="da">
+<translation id="4021716437419160885">Rul ned</translation>
+<translation id="4217571870635786043">Diktering</translation>
+<translation id="4378308539633073595">Rul fremad</translation>
+<translation id="495046168593986294">Rul op</translation>
+<translation id="5513242761114685513">Genvejsmenu</translation>
+<translation id="6945221475159498467">Vælg</translation>
+<translation id="7026338066939101231">Reducer</translation>
 <translation id="7088960765736518739">Kontaktadgang</translation>
+<translation id="7846634333498149051">Tastatur</translation>
+<translation id="8004512796067398576">Forøg</translation>
+<translation id="8428213095426709021">Indstillinger</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_de.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_de.xtb
index 96b6546..511ae87 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_de.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_de.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="de">
+<translation id="4021716437419160885">Nach unten scrollen</translation>
+<translation id="4217571870635786043">Spracheingabe</translation>
+<translation id="4378308539633073595">Weiterscrollen</translation>
+<translation id="495046168593986294">Nach oben scrollen</translation>
+<translation id="5513242761114685513">Kontextmenü</translation>
+<translation id="6945221475159498467">Auswählen</translation>
+<translation id="7026338066939101231">Verringern</translation>
 <translation id="7088960765736518739">Schalterzugriff</translation>
+<translation id="7846634333498149051">Tastatur</translation>
+<translation id="8004512796067398576">Erhöhen</translation>
+<translation id="8428213095426709021">Einstellungen</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_el.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_el.xtb
index 65763fa1..fb86282 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_el.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_el.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="el">
+<translation id="4021716437419160885">Κύλιση προς τα κάτω</translation>
+<translation id="4217571870635786043">Υπαγόρευση</translation>
+<translation id="4378308539633073595">Κύλιση προς τα εμπρός</translation>
+<translation id="495046168593986294">Κύλιση προς τα επάνω</translation>
+<translation id="5513242761114685513">Μενού περιβάλλοντος</translation>
+<translation id="6945221475159498467">Επιλογή</translation>
+<translation id="7026338066939101231">Μείωση</translation>
 <translation id="7088960765736518739">Αλλαγή πρόσβασης</translation>
+<translation id="7846634333498149051">Πληκτρολόγιο</translation>
+<translation id="8004512796067398576">Αύξηση</translation>
+<translation id="8428213095426709021">Ρυθμίσεις</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_en-GB.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_en-GB.xtb
index a8cc43b..22a9ba5 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_en-GB.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_en-GB.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="en-GB">
+<translation id="4021716437419160885">Scroll down</translation>
+<translation id="4217571870635786043">Dictation</translation>
+<translation id="4378308539633073595">Scroll forwards</translation>
+<translation id="495046168593986294">Scroll up</translation>
+<translation id="5513242761114685513">Context menu</translation>
+<translation id="6945221475159498467">Select</translation>
+<translation id="7026338066939101231">Decrement</translation>
 <translation id="7088960765736518739">Switch access</translation>
+<translation id="7846634333498149051">Keyboard</translation>
+<translation id="8004512796067398576">Increment</translation>
+<translation id="8428213095426709021">Settings</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_es-419.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_es-419.xtb
index 5afcbe2..5968d0ae 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_es-419.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_es-419.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="es-419">
+<translation id="4021716437419160885">Desplazar hacia abajo</translation>
+<translation id="4217571870635786043">Dictado</translation>
+<translation id="4378308539633073595">Desplazarse hacia adelante</translation>
+<translation id="495046168593986294">Desplazar hacia arriba</translation>
+<translation id="5513242761114685513">Menú contextual</translation>
+<translation id="6945221475159498467">Seleccionar</translation>
+<translation id="7026338066939101231">Disminuir</translation>
 <translation id="7088960765736518739">Accesibilidad mejorada</translation>
+<translation id="7846634333498149051">Teclado</translation>
+<translation id="8004512796067398576">Incremento</translation>
+<translation id="8428213095426709021">Configuración</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_es.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_es.xtb
index 573f973..3729e25 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_es.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_es.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="es">
+<translation id="4021716437419160885">Desplazarse hacia abajo</translation>
+<translation id="4217571870635786043">Dictado</translation>
+<translation id="4378308539633073595">Desplazarse hacia delante</translation>
+<translation id="495046168593986294">Desplazarse hacia arriba</translation>
+<translation id="5513242761114685513">Menú contextual</translation>
+<translation id="6945221475159498467">Seleccionar</translation>
+<translation id="7026338066939101231">Reducir</translation>
 <translation id="7088960765736518739">Accesibilidad mediante interruptores</translation>
+<translation id="7846634333498149051">Teclado</translation>
+<translation id="8004512796067398576">Aumentar</translation>
+<translation id="8428213095426709021">Configuración</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_et.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_et.xtb
index a5c33cc..fd91e71 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_et.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_et.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="et">
+<translation id="4021716437419160885">Keri alla</translation>
+<translation id="4217571870635786043">Dikteerimine</translation>
+<translation id="4378308539633073595">Edasikerimine</translation>
+<translation id="495046168593986294">Keri üles</translation>
+<translation id="5513242761114685513">Kontekstimenüü</translation>
+<translation id="6945221475159498467">Vali</translation>
+<translation id="7026338066939101231">Vähenemine</translation>
 <translation id="7088960765736518739">Lülitiga juurdepääs</translation>
+<translation id="7846634333498149051">Klaviatuur</translation>
+<translation id="8004512796067398576">Juurdekasv</translation>
+<translation id="8428213095426709021">Seaded</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fa.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fa.xtb
index 66a1ccec..15f0433 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fa.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fa.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fa">
+<translation id="4021716437419160885">پیمایش به پایین</translation>
+<translation id="4217571870635786043">املا</translation>
+<translation id="4378308539633073595">پیمایش به جلو</translation>
+<translation id="495046168593986294">پیمایش به بالا</translation>
+<translation id="5513242761114685513">منوی بافت</translation>
+<translation id="6945221475159498467">انتخاب</translation>
+<translation id="7026338066939101231">کاهش</translation>
 <translation id="7088960765736518739">دسترسی سوئیچ</translation>
+<translation id="7846634333498149051">صفحه‌کلید</translation>
+<translation id="8004512796067398576">افزایش</translation>
+<translation id="8428213095426709021">تنظیمات</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fi.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fi.xtb
index 35c0c26..750a9b4 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fi.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fi.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fi">
+<translation id="4021716437419160885">Vieritä alas</translation>
+<translation id="4217571870635786043">Sanelu</translation>
+<translation id="4378308539633073595">Vieritä eteenpäin</translation>
+<translation id="495046168593986294">Vieritä ylös</translation>
+<translation id="5513242761114685513">Kontekstivalikko</translation>
+<translation id="6945221475159498467">Valitse</translation>
+<translation id="7026338066939101231">Vähennä</translation>
 <translation id="7088960765736518739">Kytkimen käyttö</translation>
+<translation id="7846634333498149051">Näppäimistö</translation>
+<translation id="8004512796067398576">Lisää</translation>
+<translation id="8428213095426709021">Asetukset</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fil.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fil.xtb
index 18eb112..8fa7b6f 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fil.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fil.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fil">
+<translation id="4021716437419160885">Mag-scroll pababa</translation>
+<translation id="4217571870635786043">Pagdidikta</translation>
+<translation id="4378308539633073595">Mag-scroll pasulong</translation>
+<translation id="495046168593986294">Mag-scroll pataas</translation>
+<translation id="5513242761114685513">Menu ng konteksto</translation>
+<translation id="6945221475159498467">Pumili</translation>
+<translation id="7026338066939101231">Babaan</translation>
 <translation id="7088960765736518739">Switch Access</translation>
+<translation id="7846634333498149051">Keyboard</translation>
+<translation id="8004512796067398576">Taasan</translation>
+<translation id="8428213095426709021">Mga Setting</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fr.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fr.xtb
index d8190a9..06690844 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fr.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_fr.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fr">
+<translation id="4021716437419160885">Faire défiler vers le bas</translation>
+<translation id="4217571870635786043">Dictée</translation>
+<translation id="4378308539633073595">Faire défiler vers l'avant</translation>
+<translation id="495046168593986294">Faire défiler vers le haut</translation>
+<translation id="5513242761114685513">Menu contextuel</translation>
+<translation id="6945221475159498467">Sélectionner</translation>
+<translation id="7026338066939101231">Diminuer</translation>
 <translation id="7088960765736518739">Switch Access</translation>
+<translation id="7846634333498149051">Clavier</translation>
+<translation id="8004512796067398576">Augmenter</translation>
+<translation id="8428213095426709021">Paramètres</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_gu.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_gu.xtb
index c641c7a..602c02f 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_gu.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_gu.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="gu">
+<translation id="4021716437419160885">નીચે સ્ક્રોલ કરો</translation>
+<translation id="4217571870635786043">ડિક્ટેશન</translation>
+<translation id="4378308539633073595">આગળ સ્ક્રોલ કરો</translation>
+<translation id="495046168593986294">ઉપર સ્ક્રોલ કરો</translation>
+<translation id="5513242761114685513">સંદર્ભ મેનૂ</translation>
+<translation id="6945221475159498467">પસંદ કરો</translation>
+<translation id="7026338066939101231">હ્રાસ</translation>
 <translation id="7088960765736518739">સ્વિચ ઍક્સેસ</translation>
+<translation id="7846634333498149051">કીબોર્ડ</translation>
+<translation id="8004512796067398576">વૃદ્ધિ</translation>
+<translation id="8428213095426709021">સેટિંગ્સ</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hi.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hi.xtb
index abbf8f3..0b6f077 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hi.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hi.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="hi">
+<translation id="4021716437419160885">नीचे स्क्रोल करें</translation>
+<translation id="4217571870635786043">लिखवाना</translation>
+<translation id="4378308539633073595">आगे की ओर स्क्रोल करें</translation>
+<translation id="495046168593986294">ऊपर स्क्रोल करें</translation>
+<translation id="5513242761114685513">संदर्भ मेन्यू</translation>
+<translation id="6945221475159498467">चुनें</translation>
+<translation id="7026338066939101231">कम</translation>
 <translation id="7088960765736518739">एक्सेस करने का तरीका बदलने की सुविधा</translation>
+<translation id="7846634333498149051">कीबोर्ड</translation>
+<translation id="8004512796067398576">वृद्धि</translation>
+<translation id="8428213095426709021">सेटिंग</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hr.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hr.xtb
index 5584b0b..d5840736 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hr.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hr.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="hr">
+<translation id="4021716437419160885">Pomakni prema dolje</translation>
+<translation id="4217571870635786043">Diktat</translation>
+<translation id="4378308539633073595">Pomicanje unaprijed</translation>
+<translation id="495046168593986294">Pomakni prema gore</translation>
+<translation id="5513242761114685513">Kontekstni izbornik</translation>
+<translation id="6945221475159498467">Odaberi</translation>
+<translation id="7026338066939101231">Pomak unatrag</translation>
 <translation id="7088960765736518739">Prekidač za pristup</translation>
+<translation id="7846634333498149051">Tipkovnica</translation>
+<translation id="8004512796067398576">Pomak unaprijed</translation>
+<translation id="8428213095426709021">Postavke</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hu.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hu.xtb
index 3e22285..9607a63 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hu.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_hu.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="hu">
+<translation id="4021716437419160885">Görgetés lefelé</translation>
+<translation id="4217571870635786043">Diktálás</translation>
+<translation id="4378308539633073595">Görgetés előre</translation>
+<translation id="495046168593986294">Görgetés felfelé</translation>
+<translation id="5513242761114685513">Helyi menü</translation>
+<translation id="6945221475159498467">Kiválasztás</translation>
+<translation id="7026338066939101231">Csökkentés</translation>
 <translation id="7088960765736518739">Kapcsolóalapú hozzáférés</translation>
+<translation id="7846634333498149051">Billentyűzet</translation>
+<translation id="8004512796067398576">Növelés</translation>
+<translation id="8428213095426709021">Beállítások</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_id.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_id.xtb
index 2053ed7..2ac3feec 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_id.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_id.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="id">
+<translation id="4021716437419160885">Scroll ke bawah</translation>
+<translation id="4217571870635786043">Dikte</translation>
+<translation id="4378308539633073595">Scrolling maju</translation>
+<translation id="495046168593986294">Scroll ke atas</translation>
+<translation id="5513242761114685513">Menu konteks</translation>
+<translation id="6945221475159498467">Pilih</translation>
+<translation id="7026338066939101231">Pengurangan</translation>
 <translation id="7088960765736518739">Tombol Akses</translation>
+<translation id="7846634333498149051">Keyboard</translation>
+<translation id="8004512796067398576">Penambahan</translation>
+<translation id="8428213095426709021">Setelan</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_it.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_it.xtb
index 6e297a7..7f564ae5 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_it.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_it.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="it">
+<translation id="4021716437419160885">Scorri verso il basso</translation>
+<translation id="4217571870635786043">Dettatura</translation>
+<translation id="4378308539633073595">Scorri in avanti</translation>
+<translation id="495046168593986294">Scorri verso l'alto</translation>
+<translation id="5513242761114685513">Menu contestuale</translation>
+<translation id="6945221475159498467">Seleziona</translation>
+<translation id="7026338066939101231">Diminuisci</translation>
 <translation id="7088960765736518739">Switch Access</translation>
+<translation id="7846634333498149051">Tastiera</translation>
+<translation id="8004512796067398576">Aumenta</translation>
+<translation id="8428213095426709021">Impostazioni</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_iw.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_iw.xtb
index 1f920b82..9fe608a 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_iw.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_iw.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="iw">
+<translation id="4021716437419160885">גלילה למטה</translation>
+<translation id="4217571870635786043">הכתבה</translation>
+<translation id="4378308539633073595">גלילה קדימה</translation>
+<translation id="495046168593986294">גלילה למעלה</translation>
+<translation id="5513242761114685513">תפריט הקשר</translation>
+<translation id="6945221475159498467">בחירה</translation>
+<translation id="7026338066939101231">הפחתה</translation>
 <translation id="7088960765736518739">גישה באמצעות מתג</translation>
+<translation id="7846634333498149051">מקלדת</translation>
+<translation id="8004512796067398576">הוספה</translation>
+<translation id="8428213095426709021">הגדרות</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ja.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ja.xtb
index 93e8ffe..8f90cb5 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ja.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ja.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ja">
+<translation id="4021716437419160885">下にスクロール</translation>
+<translation id="4217571870635786043">音声入力</translation>
+<translation id="4378308539633073595">前方スクロール</translation>
+<translation id="495046168593986294">上にスクロール</translation>
+<translation id="5513242761114685513">コンテキスト メニュー</translation>
+<translation id="6945221475159498467">選択</translation>
+<translation id="7026338066939101231">減らす</translation>
 <translation id="7088960765736518739">スイッチ アクセス</translation>
+<translation id="7846634333498149051">キーボード</translation>
+<translation id="8004512796067398576">増やす</translation>
+<translation id="8428213095426709021">設定</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_kn.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_kn.xtb
index f938985..d49f0cb 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_kn.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_kn.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="kn">
+<translation id="4021716437419160885">ಕೆಳಗೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ</translation>
+<translation id="4217571870635786043">ಉಕ್ತಲೇಖನ</translation>
+<translation id="4378308539633073595">ಮುಂದಕ್ಕೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ</translation>
+<translation id="495046168593986294">ಮೇಲಕ್ಕೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ</translation>
+<translation id="5513242761114685513">ಸಂದರ್ಭದ ಮೆನು</translation>
+<translation id="6945221475159498467">ಆಯ್ಕೆಮಾಡಿ</translation>
+<translation id="7026338066939101231">ಇಳಿಕೆ</translation>
 <translation id="7088960765736518739">ಪ್ರವೇಶ ಬದಲಾವಣೆ</translation>
+<translation id="7846634333498149051">ಕೀಬೋರ್ಡ್</translation>
+<translation id="8004512796067398576">ಹೆಚ್ಚಿಕೆ</translation>
+<translation id="8428213095426709021">ಸೆಟ್ಟಿಂಗ್‌ಗಳು</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ko.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ko.xtb
index 79c2591..dc4649d0 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ko.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ko.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ko">
+<translation id="4021716437419160885">아래로 스크롤</translation>
+<translation id="4217571870635786043">음성기록</translation>
+<translation id="4378308539633073595">앞으로 스크롤</translation>
+<translation id="495046168593986294">위로 스크롤</translation>
+<translation id="5513242761114685513">컨텍스트 메뉴</translation>
+<translation id="6945221475159498467">선택</translation>
+<translation id="7026338066939101231">줄이기</translation>
 <translation id="7088960765736518739">스위치 제어</translation>
+<translation id="7846634333498149051">키보드</translation>
+<translation id="8004512796067398576">올리기</translation>
+<translation id="8428213095426709021">설정</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_lt.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_lt.xtb
index feab62dd..93cb01b 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_lt.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_lt.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="lt">
+<translation id="4021716437419160885">Slinkti į apačią</translation>
+<translation id="4217571870635786043">Diktavimas</translation>
+<translation id="4378308539633073595">Slinkti pirmyn</translation>
+<translation id="495046168593986294">Slinkti į viršų</translation>
+<translation id="5513242761114685513">Kontekstinis meniu</translation>
+<translation id="6945221475159498467">Pasirinkti</translation>
+<translation id="7026338066939101231">Sumažinti</translation>
 <translation id="7088960765736518739">Prieiga jungikliu</translation>
+<translation id="7846634333498149051">Klaviatūra</translation>
+<translation id="8004512796067398576">Padidinti</translation>
+<translation id="8428213095426709021">Nustatymai</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_lv.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_lv.xtb
index 4e80f6a..98b3012 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_lv.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_lv.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="lv">
+<translation id="4021716437419160885">Ritināt uz leju</translation>
+<translation id="4217571870635786043">Diktēšana</translation>
+<translation id="4378308539633073595">Ritināt uz priekšu</translation>
+<translation id="495046168593986294">Ritināt uz augšu</translation>
+<translation id="5513242761114685513">Kontekstizvēlne</translation>
+<translation id="6945221475159498467">Atlasīt</translation>
+<translation id="7026338066939101231">Samazināt</translation>
 <translation id="7088960765736518739">Slēdžu piekļuve</translation>
+<translation id="7846634333498149051">Tastatūra</translation>
+<translation id="8004512796067398576">Palielināt</translation>
+<translation id="8428213095426709021">Iestatījumi</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ml.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ml.xtb
index 2c1090e..c43c483 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ml.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ml.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ml">
+<translation id="4021716437419160885">താഴേയ്‌ക്ക് സ്ക്രോൾ ചെയ്യുക</translation>
+<translation id="4217571870635786043">പറഞ്ഞ് കൊടുക്കൽ</translation>
+<translation id="4378308539633073595">മുമ്പിലേക്ക് സ്‌ക്രോൾ ചെയ്യുക</translation>
+<translation id="495046168593986294">മുകളിലേയ്ക്ക് സ്‌ക്രോൾ ചെയ്യുക</translation>
+<translation id="5513242761114685513">സന്ദർഭ മെനു</translation>
+<translation id="6945221475159498467">തിരഞ്ഞെടുക്കുക</translation>
+<translation id="7026338066939101231">കുറവ്</translation>
 <translation id="7088960765736518739">ആക്‌സസ് മാറുക</translation>
+<translation id="7846634333498149051">കീബോർഡ്</translation>
+<translation id="8004512796067398576">വർദ്ധന</translation>
+<translation id="8428213095426709021">ക്രമീകരണങ്ങള്‍</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_mr.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_mr.xtb
index 09992d8..7e84589 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_mr.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_mr.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="mr">
+<translation id="4021716437419160885">खाली स्क्रोल करा</translation>
+<translation id="4217571870635786043">डिक्टेशन</translation>
+<translation id="4378308539633073595">पुढे स्क्रोल करा</translation>
+<translation id="495046168593986294">वर स्क्रोल करा</translation>
+<translation id="5513242761114685513">संदर्भ मेनू</translation>
+<translation id="6945221475159498467">निवडा</translation>
+<translation id="7026338066939101231">घट</translation>
 <translation id="7088960765736518739">स्विच ॲक्सेस</translation>
+<translation id="7846634333498149051">कीबोर्ड</translation>
+<translation id="8004512796067398576">बढती</translation>
+<translation id="8428213095426709021">सेटिंग्ज</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ms.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ms.xtb
index b9b3310f..7435ff5 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ms.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ms.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ms">
+<translation id="4021716437419160885">Tatal ke bawah</translation>
+<translation id="4217571870635786043">Pengimlakan</translation>
+<translation id="4378308539633073595">Tatal ke hadapan</translation>
+<translation id="495046168593986294">Tatal ke atas</translation>
+<translation id="5513242761114685513">Menu konteks</translation>
+<translation id="6945221475159498467">Pilih</translation>
+<translation id="7026338066939101231">Susutan</translation>
 <translation id="7088960765736518739">Akses Suis</translation>
+<translation id="7846634333498149051">Papan kekunci</translation>
+<translation id="8004512796067398576">Kenaikan</translation>
+<translation id="8428213095426709021">Tetapan</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_nl.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_nl.xtb
index f864e0e..f7975d1 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_nl.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_nl.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="nl">
+<translation id="4021716437419160885">Omlaag scrollen</translation>
+<translation id="4217571870635786043">Dicteren</translation>
+<translation id="4378308539633073595">Vooruit scrollen</translation>
+<translation id="495046168593986294">Omhoog scrollen</translation>
+<translation id="5513242761114685513">Contextmenu</translation>
+<translation id="6945221475159498467">Selecteren</translation>
+<translation id="7026338066939101231">Lager</translation>
 <translation id="7088960765736518739">Toegang via schakelaar</translation>
+<translation id="7846634333498149051">Toetsenbord</translation>
+<translation id="8004512796067398576">Hoger</translation>
+<translation id="8428213095426709021">Instellingen</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_no.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_no.xtb
index a74645d..09d67e49 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_no.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_no.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="no">
+<translation id="4021716437419160885">Rull ned</translation>
+<translation id="4217571870635786043">Diktering</translation>
+<translation id="4378308539633073595">Rull fremover</translation>
+<translation id="495046168593986294">Rull opp</translation>
+<translation id="5513242761114685513">Kontekstuell meny</translation>
+<translation id="6945221475159498467">Velg</translation>
+<translation id="7026338066939101231">Reduser</translation>
 <translation id="7088960765736518739">Brytertilgang</translation>
+<translation id="7846634333498149051">Tastatur</translation>
+<translation id="8004512796067398576">Øk</translation>
+<translation id="8428213095426709021">Innstillinger</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pl.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pl.xtb
index 6b51097..81bb4b3 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pl.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pl.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="pl">
+<translation id="4021716437419160885">Przewiń w dół</translation>
+<translation id="4217571870635786043">Dyktowanie</translation>
+<translation id="4378308539633073595">Przewiń do przodu</translation>
+<translation id="495046168593986294">Przewiń w górę</translation>
+<translation id="5513242761114685513">Menu kontekstowe</translation>
+<translation id="6945221475159498467">Wybierz</translation>
+<translation id="7026338066939101231">Zmniejsz</translation>
 <translation id="7088960765736518739">Switch Access</translation>
+<translation id="7846634333498149051">Klawiatura</translation>
+<translation id="8004512796067398576">Zwiększ</translation>
+<translation id="8428213095426709021">Ustawienia</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pt-BR.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pt-BR.xtb
index cd25b5f..7f26478 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pt-BR.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pt-BR.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-BR">
+<translation id="4021716437419160885">Rolar para baixo</translation>
+<translation id="4217571870635786043">Ditado</translation>
+<translation id="4378308539633073595">Rolar para a frente</translation>
+<translation id="495046168593986294">Rolar para cima</translation>
+<translation id="5513242761114685513">Menu de contexto</translation>
+<translation id="6945221475159498467">Selecionar</translation>
+<translation id="7026338066939101231">Reduzir</translation>
 <translation id="7088960765736518739">Acesso com interruptor</translation>
+<translation id="7846634333498149051">Teclado</translation>
+<translation id="8004512796067398576">Aumentar</translation>
+<translation id="8428213095426709021">Configurações</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pt-PT.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pt-PT.xtb
index a39abf1..d4d6bb76 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pt-PT.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_pt-PT.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="pt-PT">
+<translation id="4021716437419160885">Deslocar para baixo</translation>
+<translation id="4217571870635786043">Ditado</translation>
+<translation id="4378308539633073595">Deslocar para a frente</translation>
+<translation id="495046168593986294">Deslocar para cima</translation>
+<translation id="5513242761114685513">Menu de contexto</translation>
+<translation id="6945221475159498467">Selecionar</translation>
+<translation id="7026338066939101231">Diminuir</translation>
 <translation id="7088960765736518739">Acesso por comutador</translation>
+<translation id="7846634333498149051">Teclado</translation>
+<translation id="8004512796067398576">Aumentar</translation>
+<translation id="8428213095426709021">Definições</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ro.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ro.xtb
index 0d5d9f9..9a82287dd 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ro.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ro.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ro">
+<translation id="4021716437419160885">Derulează în jos</translation>
+<translation id="4217571870635786043">Dictare</translation>
+<translation id="4378308539633073595">Derulează înainte</translation>
+<translation id="495046168593986294">Derulează în sus</translation>
+<translation id="5513242761114685513">Meniu contextual</translation>
+<translation id="6945221475159498467">Selectează</translation>
+<translation id="7026338066939101231">Micșorează</translation>
 <translation id="7088960765736518739">Acces prin comutare</translation>
+<translation id="7846634333498149051">Tastatură</translation>
+<translation id="8004512796067398576">Incrementează</translation>
+<translation id="8428213095426709021">Setări</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ru.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ru.xtb
index 93adf38..1264115 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ru.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ru.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ru">
+<translation id="4021716437419160885">Прокрутить вниз</translation>
+<translation id="4217571870635786043">Голосовой ввод</translation>
+<translation id="4378308539633073595">Прокрутить вперед.</translation>
+<translation id="495046168593986294">Прокрутить вверх</translation>
+<translation id="5513242761114685513">Контекстное меню</translation>
+<translation id="6945221475159498467">Выбрать</translation>
+<translation id="7026338066939101231">Уменьшить</translation>
 <translation id="7088960765736518739">Функция Switch Access</translation>
+<translation id="7846634333498149051">Клавиатура</translation>
+<translation id="8004512796067398576">Увеличить</translation>
+<translation id="8428213095426709021">Настройки</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sk.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sk.xtb
index c81ff3d..096de099 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sk.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sk.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sk">
+<translation id="4021716437419160885">Posunúť nadol</translation>
+<translation id="4217571870635786043">Diktovanie</translation>
+<translation id="4378308539633073595">Posunúť vpred</translation>
+<translation id="495046168593986294">Posunúť nahor</translation>
+<translation id="5513242761114685513">Kontextová ponuka</translation>
+<translation id="6945221475159498467">Vybrať</translation>
+<translation id="7026338066939101231">Zníženie</translation>
 <translation id="7088960765736518739">Ovládanie prepínačmi</translation>
+<translation id="7846634333498149051">Klávesnica</translation>
+<translation id="8004512796067398576">Zvýšenie</translation>
+<translation id="8428213095426709021">Nastavenia</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sl.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sl.xtb
index 64c93e8..47e240e 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sl.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sl.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sl">
+<translation id="4021716437419160885">Pomik navzdol</translation>
+<translation id="4217571870635786043">Narek</translation>
+<translation id="4378308539633073595">Pomik naprej</translation>
+<translation id="495046168593986294">Pomik navzgor</translation>
+<translation id="5513242761114685513">Priročni meni</translation>
+<translation id="6945221475159498467">Izberi</translation>
+<translation id="7026338066939101231">Pomanjšava</translation>
 <translation id="7088960765736518739">Dostop s stikalom</translation>
+<translation id="7846634333498149051">Tipkovnica</translation>
+<translation id="8004512796067398576">Povečava</translation>
+<translation id="8428213095426709021">Nastavitve</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sr.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sr.xtb
index 4a8ca26..7de8903c2 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sr.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sr.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sr">
+<translation id="4021716437419160885">Помери надоле</translation>
+<translation id="4217571870635786043">Диктирање</translation>
+<translation id="4378308539633073595">Помера унапред</translation>
+<translation id="495046168593986294">Помери нагоре</translation>
+<translation id="5513242761114685513">Контекстуални мени</translation>
+<translation id="6945221475159498467">Изабери</translation>
+<translation id="7026338066939101231">Смањење</translation>
 <translation id="7088960765736518739">Приступ помоћу прекидача</translation>
+<translation id="7846634333498149051">Тастатура</translation>
+<translation id="8004512796067398576">Повећање</translation>
+<translation id="8428213095426709021">Подешавања</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sv.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sv.xtb
index cff8707e..c14293d 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sv.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sv.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sv">
+<translation id="4021716437419160885">Rulla ned</translation>
+<translation id="4217571870635786043">Diktering</translation>
+<translation id="4378308539633073595">Rulla framåt</translation>
+<translation id="495046168593986294">Rulla upp</translation>
+<translation id="5513242761114685513">Snabbmeny</translation>
+<translation id="6945221475159498467">Välj</translation>
+<translation id="7026338066939101231">Minska</translation>
 <translation id="7088960765736518739">Brytarstyrning</translation>
+<translation id="7846634333498149051">Tangentbord</translation>
+<translation id="8004512796067398576">Öka</translation>
+<translation id="8428213095426709021">Inställningar</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sw.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sw.xtb
index f3302e5..dc6a4c1 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sw.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_sw.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="sw">
+<translation id="4021716437419160885">Sogeza chini</translation>
+<translation id="4217571870635786043">Kuandika kwa kutamka</translation>
+<translation id="4378308539633073595">Sogeza mbele</translation>
+<translation id="495046168593986294">Sogeza juu</translation>
+<translation id="5513242761114685513">Menyu</translation>
+<translation id="6945221475159498467">Chagua</translation>
+<translation id="7026338066939101231">Punguzo</translation>
 <translation id="7088960765736518739">Kufikia Kupitia Swichi</translation>
+<translation id="7846634333498149051">Kibodi</translation>
+<translation id="8004512796067398576">Ongezeko</translation>
+<translation id="8428213095426709021">Mipangilio</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ta.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ta.xtb
index 2bb2046..e7ce90a 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ta.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_ta.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ta">
+<translation id="4021716437419160885">கீழே உருட்டு</translation>
+<translation id="4217571870635786043">சொல்வதை எழுதுவது</translation>
+<translation id="4378308539633073595">முன்செல்</translation>
+<translation id="495046168593986294">மேலே உருட்டு</translation>
+<translation id="5513242761114685513">சூழல் மெனு</translation>
+<translation id="6945221475159498467">தேர்ந்தெடு</translation>
+<translation id="7026338066939101231">குறை</translation>
 <translation id="7088960765736518739">சுவிட்ச் அணுகல்</translation>
+<translation id="7846634333498149051">விசைப்பலகை</translation>
+<translation id="8004512796067398576">அதிகரி</translation>
+<translation id="8428213095426709021">அமைப்புகள்</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_te.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_te.xtb
index 68e80db..e46f407 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_te.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_te.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="te">
+<translation id="4021716437419160885">కిందికి స్క్రోల్ చేయి</translation>
+<translation id="4217571870635786043">డిక్టేషన్</translation>
+<translation id="4378308539633073595">ముందుకు స్క్రోల్ చేస్తుంది</translation>
+<translation id="495046168593986294">పైకి స్క్రోల్ చేయి</translation>
+<translation id="5513242761114685513">సందర్భ మెను</translation>
+<translation id="6945221475159498467">ఎంచుకోండి</translation>
+<translation id="7026338066939101231">తరుగుదల</translation>
 <translation id="7088960765736518739">స్విచ్ యాక్సెస్</translation>
+<translation id="7846634333498149051">కీబోర్డ్</translation>
+<translation id="8004512796067398576">పెరుగుదల</translation>
+<translation id="8428213095426709021">సెట్టింగ్‌లు</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_th.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_th.xtb
index 6f62090..ee374ca 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_th.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_th.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="th">
+<translation id="4021716437419160885">เลื่อนลง</translation>
+<translation id="4217571870635786043">การพิมพ์ตามคำบอก</translation>
+<translation id="4378308539633073595">เลื่อนไปข้างหน้า</translation>
+<translation id="495046168593986294">เลื่อนขึ้น</translation>
+<translation id="5513242761114685513">เมนูตามบริบท</translation>
+<translation id="6945221475159498467">เลือก</translation>
+<translation id="7026338066939101231">การลด</translation>
 <translation id="7088960765736518739">การเข้าถึงด้วยสวิตช์</translation>
+<translation id="7846634333498149051">แป้นพิมพ์</translation>
+<translation id="8004512796067398576">การเพิ่ม</translation>
+<translation id="8428213095426709021">การตั้งค่า</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_tr.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_tr.xtb
index a2bd843..e119bfc 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_tr.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_tr.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="tr">
+<translation id="4021716437419160885">Aşağı kaydır</translation>
+<translation id="4217571870635786043">Dikte</translation>
+<translation id="4378308539633073595">İleri kaydırma</translation>
+<translation id="495046168593986294">Yukarı kaydır</translation>
+<translation id="5513242761114685513">İçerik menüsü</translation>
+<translation id="6945221475159498467">Seç</translation>
+<translation id="7026338066939101231">Azalt</translation>
 <translation id="7088960765736518739">Anahtar Erişimi</translation>
+<translation id="7846634333498149051">Klavye</translation>
+<translation id="8004512796067398576">Artır</translation>
+<translation id="8428213095426709021">Ayarlar</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_uk.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_uk.xtb
index a077aa69..52b3f65 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_uk.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_uk.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="uk">
+<translation id="4021716437419160885">Прокрутити вниз</translation>
+<translation id="4217571870635786043">Диктування</translation>
+<translation id="4378308539633073595">Прокрутити вперед</translation>
+<translation id="495046168593986294">Прокрутити вгору</translation>
+<translation id="5513242761114685513">Контекстне меню</translation>
+<translation id="6945221475159498467">Вибрати</translation>
+<translation id="7026338066939101231">Понизити</translation>
 <translation id="7088960765736518739">Кнопковий доступ</translation>
+<translation id="7846634333498149051">Клавіатура</translation>
+<translation id="8004512796067398576">Підвищити</translation>
+<translation id="8428213095426709021">Налаштування</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_vi.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_vi.xtb
index 875399ff..b22e6f1 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_vi.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_vi.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="vi">
+<translation id="4021716437419160885">Cuộn xuống</translation>
+<translation id="4217571870635786043">Nhập bằng giọng nói</translation>
+<translation id="4378308539633073595">Cuộn tiến</translation>
+<translation id="495046168593986294">Cuộn lên</translation>
+<translation id="5513242761114685513">Menu ngữ cảnh</translation>
+<translation id="6945221475159498467">Chọn</translation>
+<translation id="7026338066939101231">Giảm dần</translation>
 <translation id="7088960765736518739">Tiếp cận bằng công tắc</translation>
+<translation id="7846634333498149051">Bàn phím</translation>
+<translation id="8004512796067398576">Tăng dần</translation>
+<translation id="8428213095426709021">Cài đặt</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_zh-CN.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_zh-CN.xtb
index b588beb4..90d4729 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_zh-CN.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_zh-CN.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-CN">
+<translation id="4021716437419160885">向下滚动</translation>
+<translation id="4217571870635786043">语音输入</translation>
+<translation id="4378308539633073595">向前滚动</translation>
+<translation id="495046168593986294">向上滚动</translation>
+<translation id="5513242761114685513">上下文菜单</translation>
+<translation id="6945221475159498467">选择</translation>
+<translation id="7026338066939101231">减少</translation>
 <translation id="7088960765736518739">开关控制</translation>
+<translation id="7846634333498149051">键盘</translation>
+<translation id="8004512796067398576">增加</translation>
+<translation id="8428213095426709021">设置</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_zh-TW.xtb b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_zh-TW.xtb
index 7856d3e4..79881fa3 100644
--- a/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_zh-TW.xtb
+++ b/chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings_zh-TW.xtb
@@ -1,5 +1,15 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="zh-TW">
+<translation id="4021716437419160885">向下捲動</translation>
+<translation id="4217571870635786043">語音輸入</translation>
+<translation id="4378308539633073595">向前捲動</translation>
+<translation id="495046168593986294">向上捲動</translation>
+<translation id="5513242761114685513">內容選單</translation>
+<translation id="6945221475159498467">選取</translation>
+<translation id="7026338066939101231">減少</translation>
 <translation id="7088960765736518739">開關功能</translation>
+<translation id="7846634333498149051">鍵盤</translation>
+<translation id="8004512796067398576">增加</translation>
+<translation id="8428213095426709021">設定</translation>
 </translationbundle>
\ No newline at end of file
diff --git a/chrome/browser/resources/local_ntp/local_ntp.css b/chrome/browser/resources/local_ntp/local_ntp.css
index 5ba4f33..c5c68035 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.css
+++ b/chrome/browser/resources/local_ntp/local_ntp.css
@@ -352,8 +352,8 @@
   }
 }
 
-body.fakebox-drag-focused #fakebox-text,
-body.fakebox-focused #fakebox-text {
+body.fakebox-drag-focused #fakebox-text:not(.show-placeholder),
+body.fakebox-focused #fakebox-text:not(.show-placeholder) {
   visibility: hidden;
 }
 
diff --git a/chrome/browser/resources/local_ntp/local_ntp.js b/chrome/browser/resources/local_ntp/local_ntp.js
index 5f7abf1..40f5091 100644
--- a/chrome/browser/resources/local_ntp/local_ntp.js
+++ b/chrome/browser/resources/local_ntp/local_ntp.js
@@ -84,7 +84,9 @@
   FAKEBOX_FOCUS: 'fakebox-focused',  // Applies focus styles to the fakebox
   // Shows a search icon in the fakebox.
   SHOW_FAKEBOX_ICON: 'show-fakebox-icon',
-  SHOW_EDIT_DIALOG: 'show',      // Displays the edit custom link dialog.
+  SHOW_EDIT_DIALOG: 'show',  // Displays the edit custom link dialog.
+  // Applied when the fakebox placeholder text should not be hidden on focus.
+  SHOW_PLACEHOLDER: 'show-placeholder',
   HIDE_BODY_OVERFLOW: 'hidden',  // Prevents scrolling while the edit custom
                                  // link dialog is open.
   // Applies float animations to the Most Visited notification
@@ -1174,6 +1176,9 @@
     if (configData.fakeboxSearchIconColor) {
       $(IDS.FAKEBOX_ICON).classList.add(CLASSES.FAKEBOX_ICON_COLOR);
     }
+    if (configData.showFakeboxPlaceholderOnFocus) {
+      $(IDS.FAKEBOX_TEXT).classList.add(CLASSES.SHOW_PLACEHOLDER);
+    }
 
     if (configData.removeFakebox) {
       document.body.classList.add(CLASSES.REMOVE_FAKEBOX);
diff --git a/chrome/browser/resources/print_preview/BUILD.gn b/chrome/browser/resources/print_preview/BUILD.gn
index 5835dfa8..e7993a0 100644
--- a/chrome/browser/resources/print_preview/BUILD.gn
+++ b/chrome/browser/resources/print_preview/BUILD.gn
@@ -13,7 +13,7 @@
 
   optimize_webui("build") {
     host = "print"
-    html_in_files = [ "print_preview_new.html" ]
+    html_in_files = [ "print_preview.html" ]
     html_out_files = [ "vulcanized.html" ]
     insert_in_head = "<base href=\"chrome://print\">"
     input = rebase_path("$target_gen_dir/$unpak_folder", root_build_dir)
diff --git a/chrome/browser/resources/print_preview/new/advanced_options_settings.js b/chrome/browser/resources/print_preview/new/advanced_options_settings.js
index 1760506..6156206 100644
--- a/chrome/browser/resources/print_preview/new/advanced_options_settings.js
+++ b/chrome/browser/resources/print_preview/new/advanced_options_settings.js
@@ -11,7 +11,7 @@
     /** @type {!print_preview.Destination} */
     destination: Object,
 
-    /** @type {!print_preview_new.Settings} */
+    /** @type {!print_preview.Settings} */
     settings: Object,
 
     /** @private {boolean} */
diff --git a/chrome/browser/resources/print_preview/new/app.js b/chrome/browser/resources/print_preview/new/app.js
index 9ab0f79..267ba46 100644
--- a/chrome/browser/resources/print_preview/new/app.js
+++ b/chrome/browser/resources/print_preview/new/app.js
@@ -11,7 +11,7 @@
   ],
 
   properties: {
-    /** @type {!print_preview_new.State} */
+    /** @type {!print_preview.State} */
     state: {
       type: Number,
       observer: 'onStateChanged_',
@@ -38,7 +38,7 @@
     /** @private {print_preview.DocumentSettings} */
     documentSettings_: Object,
 
-    /** @private {!print_preview_new.Error} */
+    /** @private {!print_preview.Error} */
     error_: Number,
 
     /** @private {print_preview.Margins} */
@@ -56,7 +56,7 @@
     /** @private {!print_preview.Size} */
     pageSize_: Object,
 
-    /** @private {!print_preview_new.PreviewAreaState} */
+    /** @private {!print_preview.PreviewAreaState} */
     previewState_: {
       type: String,
       observer: 'onPreviewStateChange_',
@@ -186,7 +186,7 @@
         // Don't try to print with system dialog on Windows if the document is
         // not ready, because we send the preview document to the printer on
         // Windows.
-        if (!cr.isWindows || this.state == print_preview_new.State.READY) {
+        if (!cr.isWindows || this.state == print_preview.State.READY) {
           this.onPrintWithSystemDialog_();
         }
         e.preventDefault();
@@ -195,7 +195,7 @@
     }
 
     if ((e.code === 'Enter' || e.code === 'NumpadEnter') &&
-        this.state === print_preview_new.State.READY &&
+        this.state === print_preview.State.READY &&
         this.openDialogs_.length === 0) {
       const activeElementTag = e.path[0].tagName;
       if (['PAPER-BUTTON', 'BUTTON', 'SELECT', 'A', 'CR-CHECKBOX'].includes(
@@ -303,8 +303,8 @@
     switch (this.destinationState_) {
       case print_preview.DestinationState.SELECTED:
       case print_preview.DestinationState.SET:
-        if (this.state !== print_preview_new.State.NOT_READY) {
-          this.$.state.transitTo(print_preview_new.State.NOT_READY);
+        if (this.state !== print_preview.State.NOT_READY) {
+          this.$.state.transitTo(print_preview.State.NOT_READY);
         }
         break;
       case print_preview.DestinationState.UPDATED:
@@ -317,13 +317,13 @@
         // </if>
 
         this.startPreviewWhenReady_ = true;
-        this.$.state.transitTo(print_preview_new.State.READY);
+        this.$.state.transitTo(print_preview.State.READY);
         break;
       case print_preview.DestinationState.ERROR:
-        let newState = print_preview_new.State.ERROR;
+        let newState = print_preview.State.ERROR;
         // <if expr="chromeos">
-        if (this.error_ === print_preview_new.Error.NO_DESTINATIONS) {
-          newState = print_preview_new.State.FATAL_ERROR;
+        if (this.error_ === print_preview.Error.NO_DESTINATIONS) {
+          newState = print_preview.State.FATAL_ERROR;
         }
         // </if>
         this.$.state.transitTo(newState);
@@ -343,7 +343,7 @@
 
   /** @private */
   onPreviewSettingChanged_: function() {
-    if (this.state === print_preview_new.State.READY) {
+    if (this.state === print_preview.State.READY) {
       this.$.previewArea.startPreview(false);
       this.startPreviewWhenReady_ = false;
     } else {
@@ -353,7 +353,7 @@
 
   /** @private */
   onStateChanged_: function() {
-    if (this.state == print_preview_new.State.READY) {
+    if (this.state == print_preview.State.READY) {
       if (this.startPreviewWhenReady_) {
         this.$.previewArea.startPreview(false);
         this.startPreviewWhenReady_ = false;
@@ -363,17 +363,17 @@
         // Reset in case printing fails.
         this.printRequested_ = false;
       }
-    } else if (this.state == print_preview_new.State.CLOSING) {
+    } else if (this.state == print_preview.State.CLOSING) {
       this.remove();
       this.nativeLayer_.dialogClose(this.cancelled_);
-    } else if (this.state == print_preview_new.State.HIDDEN) {
+    } else if (this.state == print_preview.State.HIDDEN) {
       if (this.destination_.isLocal &&
           this.destination_.id !==
               print_preview.Destination.GooglePromotedId.SAVE_AS_PDF) {
         // Only hide the preview for local, non PDF destinations.
         this.nativeLayer_.hidePreview();
       }
-    } else if (this.state == print_preview_new.State.PRINTING) {
+    } else if (this.state == print_preview.State.PRINTING) {
       const destination = assert(this.destination_);
       const whenPrintDone =
           this.nativeLayer_.print(this.$.model.createPrintTicket(
@@ -397,19 +397,19 @@
 
   /** @private */
   onPrintRequested_: function() {
-    if (this.state === print_preview_new.State.NOT_READY) {
+    if (this.state === print_preview.State.NOT_READY) {
       this.printRequested_ = true;
       return;
     }
     this.$.state.transitTo(
-        this.$.previewArea.previewLoaded() ? print_preview_new.State.PRINTING :
-                                             print_preview_new.State.HIDDEN);
+        this.$.previewArea.previewLoaded() ? print_preview.State.PRINTING :
+                                             print_preview.State.HIDDEN);
   },
 
   /** @private */
   onCancelRequested_: function() {
     this.cancelled_ = true;
-    this.$.state.transitTo(print_preview_new.State.CLOSING);
+    this.$.state.transitTo(print_preview.State.CLOSING);
   },
 
   /**
@@ -418,16 +418,16 @@
    */
   onSettingValidChanged_: function(e) {
     if (e.detail) {
-      this.$.state.transitTo(print_preview_new.State.READY);
+      this.$.state.transitTo(print_preview.State.READY);
     } else {
-      this.error_ = print_preview_new.Error.INVALID_TICKET;
-      this.$.state.transitTo(print_preview_new.State.ERROR);
+      this.error_ = print_preview.Error.INVALID_TICKET;
+      this.$.state.transitTo(print_preview.State.ERROR);
     }
   },
 
   /** @private */
   onFileSelectionCancel_: function() {
-    this.$.state.transitTo(print_preview_new.State.READY);
+    this.$.state.transitTo(print_preview.State.READY);
   },
 
   /**
@@ -454,7 +454,7 @@
     // </if>
     // <if expr="not is_win">
     this.nativeLayer_.showSystemDialog();
-    this.$.state.transitTo(print_preview_new.State.SYSTEM_DIALOG);
+    this.$.state.transitTo(print_preview.State.SYSTEM_DIALOG);
     // </if>
   },
   // </if>
@@ -476,26 +476,26 @@
    */
   onPrintFailed_: function(httpError) {
     console.error('Printing failed with error code ' + httpError);
-    this.error_ = print_preview_new.Error.PRINT_FAILED;
-    this.$.state.transitTo(print_preview_new.State.FATAL_ERROR);
+    this.error_ = print_preview.Error.PRINT_FAILED;
+    this.$.state.transitTo(print_preview.State.FATAL_ERROR);
   },
 
   /** @private */
   onPreviewStateChange_: function() {
     switch (this.previewState_) {
-      case print_preview_new.PreviewAreaState.DISPLAY_PREVIEW:
-      case print_preview_new.PreviewAreaState.OPEN_IN_PREVIEW_LOADED:
-        if (this.state === print_preview_new.State.HIDDEN) {
-          this.$.state.transitTo(print_preview_new.State.PRINTING);
+      case print_preview.PreviewAreaState.DISPLAY_PREVIEW:
+      case print_preview.PreviewAreaState.OPEN_IN_PREVIEW_LOADED:
+        if (this.state === print_preview.State.HIDDEN) {
+          this.$.state.transitTo(print_preview.State.PRINTING);
         }
         break;
-      case print_preview_new.PreviewAreaState.ERROR:
-        if (this.state !== print_preview_new.State.ERROR &&
-            this.state !== print_preview_new.State.FATAL_ERROR) {
+      case print_preview.PreviewAreaState.ERROR:
+        if (this.state !== print_preview.State.ERROR &&
+            this.state !== print_preview.State.FATAL_ERROR) {
           this.$.state.transitTo(
-              this.error_ === print_preview_new.Error.INVALID_PRINTER ?
-                  print_preview_new.State.ERROR :
-                  print_preview_new.State.FATAL_ERROR);
+              this.error_ === print_preview.Error.INVALID_PRINTER ?
+                  print_preview.State.ERROR :
+                  print_preview.State.FATAL_ERROR);
         }
         break;
       default:
@@ -517,8 +517,8 @@
       return;  // No internet connectivity or not signed in.
     }
     this.cloudPrintErrorMessage_ = event.detail.message;
-    this.error_ = print_preview_new.Error.CLOUD_PRINT_ERROR;
-    this.$.state.transitTo(print_preview_new.State.FATAL_ERROR);
+    this.error_ = print_preview.Error.CLOUD_PRINT_ERROR;
+    this.$.state.transitTo(print_preview.State.FATAL_ERROR);
     if (event.detail.status == 200) {
       console.error(
           'Google Cloud Print Error: ' +
@@ -534,7 +534,7 @@
    * Updates printing options according to source document presets.
    * @param {boolean} disableScaling Whether the document disables scaling.
    * @param {number} copies The default number of copies from the document.
-   * @param {!print_preview_new.DuplexMode} duplex The default duplex setting
+   * @param {!print_preview.DuplexMode} duplex The default duplex setting
    *     from the document.
    * @private
    */
@@ -547,19 +547,18 @@
       this.setSetting('copies', copies);
     }
 
-    if (duplex !== print_preview_new.DuplexMode.UNKNOWN_DUPLEX_MODE &&
+    if (duplex !== print_preview.DuplexMode.UNKNOWN_DUPLEX_MODE &&
         this.getSetting('duplex').available) {
       this.setSetting(
           'duplex',
-          duplex === print_preview_new.DuplexMode.LONG_EDGE ||
-              duplex === print_preview_new.DuplexMode.SHORT_EDGE);
+          duplex === print_preview.DuplexMode.LONG_EDGE ||
+              duplex === print_preview.DuplexMode.SHORT_EDGE);
     }
-    if (duplex !== print_preview_new.DuplexMode.UNKNOWN_DUPLEX_MODE &&
-        duplex !== print_preview_new.DuplexMode.SIMPLEX &&
+    if (duplex !== print_preview.DuplexMode.UNKNOWN_DUPLEX_MODE &&
+        duplex !== print_preview.DuplexMode.SIMPLEX &&
         this.getSetting('duplexShortEdge').available) {
       this.setSetting(
-          'duplexShortEdge',
-          duplex === print_preview_new.DuplexMode.SHORT_EDGE);
+          'duplexShortEdge', duplex === print_preview.DuplexMode.SHORT_EDGE);
     }
   },
 
@@ -573,6 +572,6 @@
 
   /** @private */
   close_: function() {
-    this.$.state.transitTo(print_preview_new.State.CLOSING);
+    this.$.state.transitTo(print_preview.State.CLOSING);
   },
 });
diff --git a/chrome/browser/resources/print_preview/new/button_strip.js b/chrome/browser/resources/print_preview/new/button_strip.js
index 66ced12..ffcfb2e 100644
--- a/chrome/browser/resources/print_preview/new/button_strip.js
+++ b/chrome/browser/resources/print_preview/new/button_strip.js
@@ -9,7 +9,7 @@
     /** @type {!print_preview.Destination} */
     destination: Object,
 
-    /** @type {!print_preview_new.State} */
+    /** @type {!print_preview.State} */
     state: {
       type: Number,
       observer: 'updatePrintButtonEnabled_',
@@ -32,8 +32,8 @@
 
   observers: ['updatePrintButtonLabel_(destination.id)'],
 
-  /** @private {!print_preview_new.State} */
-  lastState_: print_preview_new.State.NOT_READY,
+  /** @private {!print_preview.State} */
+  lastState_: print_preview.State.NOT_READY,
 
   /** @private */
   onPrintClick_: function() {
@@ -66,10 +66,10 @@
   /** @private */
   updatePrintButtonEnabled_: function() {
     switch (this.state) {
-      case (print_preview_new.State.PRINTING):
+      case (print_preview.State.PRINTING):
         this.printButtonEnabled_ = false;
         break;
-      case (print_preview_new.State.READY):
+      case (print_preview.State.READY):
         this.printButtonEnabled_ = true;
         if (this.lastState_ != this.state &&
             (document.activeElement == null ||
diff --git a/chrome/browser/resources/print_preview/new/color_settings.js b/chrome/browser/resources/print_preview/new/color_settings.js
index d364c43..53f65ff 100644
--- a/chrome/browser/resources/print_preview/new/color_settings.js
+++ b/chrome/browser/resources/print_preview/new/color_settings.js
@@ -5,7 +5,7 @@
 Polymer({
   is: 'print-preview-color-settings',
 
-  behaviors: [SettingsBehavior, print_preview_new.SelectBehavior],
+  behaviors: [SettingsBehavior, print_preview.SelectBehavior],
 
   properties: {
     disabled: Boolean,
diff --git a/chrome/browser/resources/print_preview/new/destination_list_item.js b/chrome/browser/resources/print_preview/new/destination_list_item.js
index d05cb65..f3bc722 100644
--- a/chrome/browser/resources/print_preview/new/destination_list_item.js
+++ b/chrome/browser/resources/print_preview/new/destination_list_item.js
@@ -2,11 +2,11 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview_new');
+cr.exportPath('print_preview');
 
 // <if expr="chromeos">
 /** @enum {number} */
-print_preview_new.DestinationConfigStatus = {
+print_preview.DestinationConfigStatus = {
   IDLE: 0,
   IN_PROGRESS: 1,
   FAILED: 2,
@@ -33,10 +33,10 @@
     searchHint_: String,
 
     // <if expr="chromeos">
-    /** @private {!print_preview_new.DestinationConfigStatus} */
+    /** @private {!print_preview.DestinationConfigStatus} */
     configurationStatus_: {
       type: Number,
-      value: print_preview_new.DestinationConfigStatus.IDLE,
+      value: print_preview.DestinationConfigStatus.IDLE,
     },
 
     /**
@@ -45,7 +45,7 @@
      */
     statusEnum_: {
       type: Object,
-      value: print_preview_new.DestinationConfigStatus,
+      value: print_preview.DestinationConfigStatus,
     },
     // </if>
   },
@@ -85,7 +85,7 @@
         this.destination.origin == print_preview.DestinationOrigin.CROS &&
         !this.destination.capabilities);
     this.configurationStatus_ =
-        print_preview_new.DestinationConfigStatus.IN_PROGRESS;
+        print_preview.DestinationConfigStatus.IN_PROGRESS;
   },
 
   /**
@@ -94,12 +94,12 @@
    */
   onConfigureComplete: function(success) {
     this.configurationStatus_ = success ?
-        print_preview_new.DestinationConfigStatus.IDLE :
-        print_preview_new.DestinationConfigStatus.FAILED;
+        print_preview.DestinationConfigStatus.IDLE :
+        print_preview.DestinationConfigStatus.FAILED;
   },
 
   /**
-   * @param {!print_preview_new.DestinationConfigStatus} status
+   * @param {!print_preview.DestinationConfigStatus} status
    * @return {boolean} Whether the current configuration status is |status|.
    * @private
    */
diff --git a/chrome/browser/resources/print_preview/new/destination_select.js b/chrome/browser/resources/print_preview/new/destination_select.js
index bed46b6..47dd526a 100644
--- a/chrome/browser/resources/print_preview/new/destination_select.js
+++ b/chrome/browser/resources/print_preview/new/destination_select.js
@@ -5,7 +5,7 @@
 Polymer({
   is: 'print-preview-destination-select',
 
-  behaviors: [I18nBehavior, print_preview_new.SelectBehavior],
+  behaviors: [I18nBehavior, print_preview.SelectBehavior],
 
   properties: {
     activeUser: String,
diff --git a/chrome/browser/resources/print_preview/new/destination_settings.js b/chrome/browser/resources/print_preview/new/destination_settings.js
index 0c7d7f1..ac5e4a56 100644
--- a/chrome/browser/resources/print_preview/new/destination_settings.js
+++ b/chrome/browser/resources/print_preview/new/destination_settings.js
@@ -56,13 +56,13 @@
 
     disabled: Boolean,
 
-    /** @type {!print_preview_new.Error} */
+    /** @type {!print_preview.Error} */
     error: {
       type: Number,
       notify: true,
     },
 
-    /** @type {!print_preview_new.State} */
+    /** @type {!print_preview.State} */
     state: Number,
 
     /** @private {string} */
@@ -226,7 +226,7 @@
 
   /** @private */
   onDestinationSelect_: function() {
-    if (this.state === print_preview_new.State.FATAL_ERROR) {
+    if (this.state === print_preview.State.FATAL_ERROR) {
       // Don't let anything reset if there is a fatal error.
       return;
     }
@@ -265,17 +265,17 @@
    * @private
    */
   onDestinationError_: function(e) {
-    let errorType = print_preview_new.Error.NONE;
+    let errorType = print_preview.Error.NONE;
     switch (e.detail) {
       case print_preview.DestinationErrorType.INVALID:
-        errorType = print_preview_new.Error.INVALID_PRINTER;
+        errorType = print_preview.Error.INVALID_PRINTER;
         break;
       case print_preview.DestinationErrorType.UNSUPPORTED:
-        errorType = print_preview_new.Error.UNSUPPORTED_PRINTER;
+        errorType = print_preview.Error.UNSUPPORTED_PRINTER;
         break;
       // <if expr="chromeos">
       case print_preview.DestinationErrorType.NO_DESTINATIONS:
-        errorType = print_preview_new.Error.NO_DESTINATIONS;
+        errorType = print_preview.Error.NO_DESTINATIONS;
         this.noDestinations_ = true;
         break;
       // </if>
@@ -377,9 +377,9 @@
    * @private
    */
   shouldDisableDropdown_: function() {
-    return this.state === print_preview_new.State.FATAL_ERROR ||
+    return this.state === print_preview.State.FATAL_ERROR ||
         (this.destinationState === print_preview.DestinationState.UPDATED &&
-         this.disabled && this.state !== print_preview_new.State.NOT_READY);
+         this.disabled && this.state !== print_preview.State.NOT_READY);
   },
 
   /** @private */
diff --git a/chrome/browser/resources/print_preview/new/dpi_settings.js b/chrome/browser/resources/print_preview/new/dpi_settings.js
index bad76a8..932335c3 100644
--- a/chrome/browser/resources/print_preview/new/dpi_settings.js
+++ b/chrome/browser/resources/print_preview/new/dpi_settings.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview_new');
+cr.exportPath('print_preview');
 
 /**
  * @typedef {{
@@ -10,7 +10,7 @@
  *   vertical_dpi: (number | undefined),
  *   vendor_id: (number | undefined)}}
  */
-print_preview_new.DpiOption;
+print_preview.DpiOption;
 
 /**
  * @typedef {{
@@ -19,7 +19,7 @@
  *   vertical_dpi: (number | undefined),
  *   vendor_id: (number | undefined)}}
  */
-print_preview_new.LabelledDpiOption;
+print_preview.LabelledDpiOption;
 
 Polymer({
   is: 'print-preview-dpi-settings',
@@ -27,12 +27,12 @@
   behaviors: [SettingsBehavior],
 
   properties: {
-    /** @type {{ option: Array<!print_preview_new.SelectOption> }} */
+    /** @type {{ option: Array<!print_preview.SelectOption> }} */
     capability: Object,
 
     disabled: Boolean,
 
-    /** @private {{ option: Array<!print_preview_new.SelectOption> }} */
+    /** @private {{ option: Array<!print_preview.SelectOption> }} */
     capabilityWithLabels_: {
       type: Object,
       computed: 'computeCapabilityWithLabels_(capability)',
@@ -45,7 +45,7 @@
 
   /**
    * Adds default labels for each option.
-   * @return {?{option: Array<!print_preview_new.SelectOption>}}
+   * @return {?{option: Array<!print_preview.SelectOption>}}
    * @private
    */
   computeCapabilityWithLabels_: function() {
@@ -54,10 +54,10 @@
     }
 
     const result =
-        /** @type {{option: Array<!print_preview_new.SelectOption>}} */ (
+        /** @type {{option: Array<!print_preview.SelectOption>}} */ (
             JSON.parse(JSON.stringify(this.capability)));
     this.capability.option.forEach((option, index) => {
-      const dpiOption = /** @type {print_preview_new.DpiOption} */ (option);
+      const dpiOption = /** @type {print_preview.DpiOption} */ (option);
       const hDpi = dpiOption.horizontal_dpi || 0;
       const vDpi = dpiOption.vertical_dpi || 0;
       if (hDpi > 0 && vDpi > 0 && hDpi != vDpi) {
@@ -79,11 +79,11 @@
       return;
     }
 
-    const dpiValue = /** @type {print_preview_new.DpiOption} */ (
-        this.getSettingValue('dpi'));
+    const dpiValue =
+        /** @type {print_preview.DpiOption} */ (this.getSettingValue('dpi'));
     for (const option of assert(this.capabilityWithLabels_.option)) {
       const dpiOption =
-          /** @type {print_preview_new.LabelledDpiOption} */ (option);
+          /** @type {print_preview.LabelledDpiOption} */ (option);
       if (dpiValue.horizontal_dpi == dpiOption.horizontal_dpi &&
           dpiValue.vertical_dpi == dpiOption.vertical_dpi &&
           dpiValue.vendor_id == dpiOption.vendor_id) {
diff --git a/chrome/browser/resources/print_preview/new/duplex_settings.js b/chrome/browser/resources/print_preview/new/duplex_settings.js
index 0b414c58..167c1fc 100644
--- a/chrome/browser/resources/print_preview/new/duplex_settings.js
+++ b/chrome/browser/resources/print_preview/new/duplex_settings.js
@@ -5,7 +5,7 @@
 Polymer({
   is: 'print-preview-duplex-settings',
 
-  behaviors: [SettingsBehavior, print_preview_new.SelectBehavior],
+  behaviors: [SettingsBehavior, print_preview.SelectBehavior],
 
   properties: {
     dark: Boolean,
@@ -18,7 +18,7 @@
      */
     duplexValueEnum_: {
       type: Object,
-      value: print_preview_new.DuplexMode,
+      value: print_preview.DuplexMode,
     },
   },
 
diff --git a/chrome/browser/resources/print_preview/new/header.js b/chrome/browser/resources/print_preview/new/header.js
index ab6681e..2731225 100644
--- a/chrome/browser/resources/print_preview/new/header.js
+++ b/chrome/browser/resources/print_preview/new/header.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview_new.Header');
+cr.exportPath('print_preview.Header');
 
 /**
  * @typedef {{numPages: number,
@@ -10,7 +10,7 @@
  *            pagesLabel: string,
  *            summaryLabel: string}}
  */
-print_preview_new.Header.LabelInfo;
+print_preview.Header.LabelInfo;
 
 Polymer({
   is: 'print-preview-header',
@@ -23,10 +23,10 @@
     /** @type {!print_preview.Destination} */
     destination: Object,
 
-    /** @type {!print_preview_new.Error} */
+    /** @type {!print_preview.Error} */
     error: Number,
 
-    /** @type {!print_preview_new.State} */
+    /** @type {!print_preview.State} */
     state: Number,
 
     /** @private */
@@ -64,8 +64,8 @@
     'updatePrintButtonLabel_(destination.id)'
   ],
 
-  /** @private {!print_preview_new.State} */
-  lastState_: print_preview_new.State.NOT_READY,
+  /** @private {!print_preview.State} */
+  lastState_: print_preview.State.NOT_READY,
 
   /** @private */
   onPrintClick_: function() {
@@ -96,7 +96,7 @@
   },
 
   /**
-   * @return {!print_preview_new.Header.LabelInfo}
+   * @return {!print_preview.Header.LabelInfo}
    * @private
    */
   computeLabelInfo_: function() {
@@ -133,13 +133,13 @@
   /** @private */
   update_: function() {
     switch (this.state) {
-      case (print_preview_new.State.PRINTING):
+      case (print_preview.State.PRINTING):
         this.printButtonEnabled_ = false;
         this.summary_ = loadTimeData.getString(
             this.isPdfOrDrive_() ? 'saving' : 'printing');
         this.summaryLabel_ = this.summary_;
         break;
-      case (print_preview_new.State.READY):
+      case (print_preview.State.READY):
         this.printButtonEnabled_ = true;
         const labelInfo = this.computeLabelInfo_();
         this.summary_ = this.getSummary_(labelInfo);
@@ -150,7 +150,7 @@
           this.$$('paper-button.action-button').focus();
         }
         break;
-      case (print_preview_new.State.FATAL_ERROR):
+      case (print_preview.State.FATAL_ERROR):
         this.summary_ = this.getErrorMessage_();
         this.summaryLabel_ = this.getErrorMessage_();
         this.printButtonEnabled_ = false;
@@ -170,9 +170,9 @@
    */
   getErrorMessage_: function() {
     switch (this.error) {
-      case print_preview_new.Error.PRINT_FAILED:
+      case print_preview.Error.PRINT_FAILED:
         return loadTimeData.getString('couldNotPrint');
-      case print_preview_new.Error.CLOUD_PRINT_ERROR:
+      case print_preview.Error.CLOUD_PRINT_ERROR:
         return this.cloudPrintErrorMessage;
       default:
         return '';
@@ -180,7 +180,7 @@
   },
 
   /**
-   * @param {!print_preview_new.Header.LabelInfo} labelInfo
+   * @param {!print_preview.Header.LabelInfo} labelInfo
    * @return {string}
    * @private
    */
@@ -196,7 +196,7 @@
   },
 
   /**
-   * @param {!print_preview_new.Header.LabelInfo} labelInfo
+   * @param {!print_preview.Header.LabelInfo} labelInfo
    * @return {string}
    * @private
    */
diff --git a/chrome/browser/resources/print_preview/new/header_new.js b/chrome/browser/resources/print_preview/new/header_new.js
index 9b9926b4..d9b344a 100644
--- a/chrome/browser/resources/print_preview/new/header_new.js
+++ b/chrome/browser/resources/print_preview/new/header_new.js
@@ -23,10 +23,10 @@
     /** @type {!print_preview.Destination} */
     destination: Object,
 
-    /** @type {!print_preview_new.Error} */
+    /** @type {!print_preview.Error} */
     error: Number,
 
-    /** @type {!print_preview_new.State} */
+    /** @type {!print_preview.State} */
     state: Number,
 
     managed: Boolean,
@@ -99,17 +99,17 @@
   /** @private */
   update_: function() {
     switch (this.state) {
-      case (print_preview_new.State.PRINTING):
+      case (print_preview.State.PRINTING):
         this.summary_ = loadTimeData.getString(
             this.isPdfOrDrive_() ? 'saving' : 'printing');
         this.summaryLabel_ = this.summary_;
         break;
-      case (print_preview_new.State.READY):
+      case (print_preview.State.READY):
         const labelInfo = this.computeLabelInfo_();
         this.summary_ = this.getSummary_(labelInfo);
         this.summaryLabel_ = this.getSummaryLabel_(labelInfo);
         break;
-      case (print_preview_new.State.FATAL_ERROR):
+      case (print_preview.State.FATAL_ERROR):
         this.summary_ = this.getErrorMessage_();
         this.summaryLabel_ = this.getErrorMessage_();
         break;
@@ -126,9 +126,9 @@
    */
   getErrorMessage_: function() {
     switch (this.error) {
-      case print_preview_new.Error.PRINT_FAILED:
+      case print_preview.Error.PRINT_FAILED:
         return loadTimeData.getString('couldNotPrint');
-      case print_preview_new.Error.CLOUD_PRINT_ERROR:
+      case print_preview.Error.CLOUD_PRINT_ERROR:
         return this.cloudPrintErrorMessage;
       default:
         return '';
diff --git a/chrome/browser/resources/print_preview/new/input_behavior.js b/chrome/browser/resources/print_preview/new/input_behavior.js
index 8ce454c..79aa7cc3 100644
--- a/chrome/browser/resources/print_preview/new/input_behavior.js
+++ b/chrome/browser/resources/print_preview/new/input_behavior.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.define('print_preview_new', function() {
+cr.define('print_preview', function() {
   /**
    * Helper functions for an input with timeout.
    * @polymerBehavior
diff --git a/chrome/browser/resources/print_preview/new/layout_settings.js b/chrome/browser/resources/print_preview/new/layout_settings.js
index 7569400..9d073c5 100644
--- a/chrome/browser/resources/print_preview/new/layout_settings.js
+++ b/chrome/browser/resources/print_preview/new/layout_settings.js
@@ -5,7 +5,7 @@
 Polymer({
   is: 'print-preview-layout-settings',
 
-  behaviors: [SettingsBehavior, print_preview_new.SelectBehavior],
+  behaviors: [SettingsBehavior, print_preview.SelectBehavior],
 
   properties: {
     disabled: Boolean,
diff --git a/chrome/browser/resources/print_preview/new/margin_control.js b/chrome/browser/resources/print_preview/new/margin_control.js
index 3d900e94..8d60edc 100644
--- a/chrome/browser/resources/print_preview/new/margin_control.js
+++ b/chrome/browser/resources/print_preview/new/margin_control.js
@@ -14,7 +14,7 @@
 Polymer({
   is: 'print-preview-margin-control',
 
-  behaviors: [print_preview_new.InputBehavior, I18nBehavior],
+  behaviors: [print_preview.InputBehavior, I18nBehavior],
 
   properties: {
     side: {
diff --git a/chrome/browser/resources/print_preview/new/margin_control_container.js b/chrome/browser/resources/print_preview/new/margin_control_container.js
index 4b2a1b14..07ba0b98 100644
--- a/chrome/browser/resources/print_preview/new/margin_control_container.js
+++ b/chrome/browser/resources/print_preview/new/margin_control_container.js
@@ -2,12 +2,12 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview_new');
+cr.exportPath('print_preview');
 
 /**
  * @const {!Map<!print_preview.ticket_items.CustomMarginsOrientation, string>}
  */
-print_preview_new.MARGIN_KEY_MAP = new Map([
+print_preview.MARGIN_KEY_MAP = new Map([
   [print_preview.ticket_items.CustomMarginsOrientation.TOP, 'marginTop'],
   [print_preview.ticket_items.CustomMarginsOrientation.RIGHT, 'marginRight'],
   [print_preview.ticket_items.CustomMarginsOrientation.BOTTOM, 'marginBottom'],
@@ -43,7 +43,7 @@
     /** @type {?print_preview.MeasurementSystem} */
     measurementSystem: Object,
 
-    /** @type {!print_preview_new.State} */
+    /** @type {!print_preview.State} */
     state: {
       type: Number,
       observer: 'onStateChanged_',
@@ -150,7 +150,7 @@
       const newMargins = {};
       for (const side of Object.values(
                print_preview.ticket_items.CustomMarginsOrientation)) {
-        const key = print_preview_new.MARGIN_KEY_MAP.get(side);
+        const key = print_preview.MARGIN_KEY_MAP.get(side);
         newMargins[key] = this.documentMargins.get(side);
       }
       this.setSetting('customMargins', newMargins);
@@ -169,7 +169,7 @@
     }
     this.shadowRoot.querySelectorAll('print-preview-margin-control')
         .forEach(control => {
-          const key = print_preview_new.MARGIN_KEY_MAP.get(control.side);
+          const key = print_preview.MARGIN_KEY_MAP.get(control.side);
           const newValue = margins[key] || 0;
           control.setPositionInPts(newValue);
           control.setTextboxValue(this.serializeValueFromPts_(newValue));
@@ -199,7 +199,7 @@
 
   /** @private */
   onStateChanged_: function() {
-    if (this.state == print_preview_new.State.READY &&
+    if (this.state == print_preview.State.READY &&
         this.resetMargins_ === null) {
       // Don't reset margins if there are sticky values. Otherwise, set them to
       // the document margins when the user selects custom margins.
@@ -401,7 +401,7 @@
             side);
     const oldMargins = /** @type {print_preview.MarginsSetting} */ (
         this.getSettingValue('customMargins'));
-    const key = print_preview_new.MARGIN_KEY_MAP.get(marginSide);
+    const key = print_preview.MARGIN_KEY_MAP.get(marginSide);
     if (oldMargins[key] == marginValue) {
       return;
     }
diff --git a/chrome/browser/resources/print_preview/new/margins_settings.js b/chrome/browser/resources/print_preview/new/margins_settings.js
index 5dfad94..94732b72 100644
--- a/chrome/browser/resources/print_preview/new/margins_settings.js
+++ b/chrome/browser/resources/print_preview/new/margins_settings.js
@@ -5,7 +5,7 @@
 Polymer({
   is: 'print-preview-margins-settings',
 
-  behaviors: [SettingsBehavior, print_preview_new.SelectBehavior],
+  behaviors: [SettingsBehavior, print_preview.SelectBehavior],
 
   properties: {
     disabled: Boolean,
diff --git a/chrome/browser/resources/print_preview/new/media_size_settings.js b/chrome/browser/resources/print_preview/new/media_size_settings.js
index d762f99..de283d0 100644
--- a/chrome/browser/resources/print_preview/new/media_size_settings.js
+++ b/chrome/browser/resources/print_preview/new/media_size_settings.js
@@ -23,7 +23,7 @@
     }
     const valueToSet = JSON.stringify(this.getSettingValue('mediaSize'));
     for (const option of
-         /** @type {!Array<!print_preview_new.SelectOption>} */ (
+         /** @type {!Array<!print_preview.SelectOption>} */ (
              this.capability.option)) {
       if (JSON.stringify(option) === valueToSet) {
         this.$$('print-preview-settings-select').selectValue(valueToSet);
diff --git a/chrome/browser/resources/print_preview/new/model.js b/chrome/browser/resources/print_preview/new/model.js
index 54accee..574eabb 100644
--- a/chrome/browser/resources/print_preview/new/model.js
+++ b/chrome/browser/resources/print_preview/new/model.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview_new');
+cr.exportPath('print_preview');
 
 /**
  * @typedef {{
@@ -31,7 +31,7 @@
  *    pinValue: (string | undefined)
  * }}
  */
-print_preview_new.SerializedSettings;
+print_preview.SerializedSettings;
 
 /**
  * @typedef {{
@@ -39,20 +39,20 @@
  *  managed: boolean
  * }}
  */
-print_preview_new.PolicyEntry;
+print_preview.PolicyEntry;
 
 /**
  * @typedef {{
- *   headerFooter: print_preview_new.PolicyEntry
+ *   headerFooter: print_preview.PolicyEntry
  * }}
  */
-print_preview_new.PolicySettings;
+print_preview.PolicySettings;
 
 /**
  * Constant values matching printing::DuplexMode enum.
  * @enum {number}
  */
-print_preview_new.DuplexMode = {
+print_preview.DuplexMode = {
   SIMPLEX: 0,
   LONG_EDGE: 1,
   SHORT_EDGE: 2,
@@ -63,7 +63,7 @@
  * Values matching the types of duplex in a CDD.
  * @enum {string}
  */
-print_preview_new.DuplexType = {
+print_preview.DuplexType = {
   NO_DUPLEX: 'NO_DUPLEX',
   LONG_EDGE: 'LONG_EDGE',
   SHORT_EDGE: 'SHORT_EDGE'
@@ -136,7 +136,7 @@
      * Initialize settings that are only available on some printers to
      * unavailable, and settings that are provided by PDF generation to
      * available.
-     * @type {!print_preview_new.Settings}
+     * @type {!print_preview.Settings}
      */
     settings: {
       type: Object,
@@ -175,10 +175,10 @@
   /** @private {boolean} */
   initialized_: false,
 
-  /** @private {?print_preview_new.SerializedSettings} */
+  /** @private {?print_preview.SerializedSettings} */
   stickySettings_: null,
 
-  /** @private {?print_preview_new.PolicySettings} */
+  /** @private {?print_preview.PolicySettings} */
   policySettings_: null,
 
   /** @private {?print_preview.Cdd} */
@@ -445,10 +445,10 @@
 
   /**
    * @param {string} settingName Name of the setting to get.
-   * @return {print_preview_new.Setting} The setting object.
+   * @return {print_preview.Setting} The setting object.
    */
   getSetting: function(settingName) {
-    const setting = /** @type {print_preview_new.Setting} */ (
+    const setting = /** @type {print_preview.Setting} */ (
         this.get(settingName, this.settings));
     assert(setting, 'Setting is missing: ' + settingName);
     return setting;
@@ -589,17 +589,17 @@
     const capsHasDuplex = !!caps && !!caps.duplex && !!caps.duplex.option;
     const capsHasLongEdge = capsHasDuplex &&
         caps.duplex.option.some(
-            o => o.type == print_preview_new.DuplexType.LONG_EDGE);
+            o => o.type == print_preview.DuplexType.LONG_EDGE);
     const capsHasShortEdge = capsHasDuplex &&
         caps.duplex.option.some(
-            o => o.type == print_preview_new.DuplexType.SHORT_EDGE);
+            o => o.type == print_preview.DuplexType.SHORT_EDGE);
     this.setSettingPath_(
         'duplexShortEdge.available', capsHasLongEdge && capsHasShortEdge);
     this.setSettingPath_(
         'duplex.available',
         (capsHasLongEdge || capsHasShortEdge) &&
             caps.duplex.option.some(
-                o => o.type == print_preview_new.DuplexType.NO_DUPLEX));
+                o => o.type == print_preview.DuplexType.NO_DUPLEX));
 
     this.setSettingPath_(
         'vendorItems.available', !!caps && !!caps.vendor_capability);
@@ -816,13 +816,13 @@
       this.setSetting(
           'duplex',
           defaultOption ?
-              (defaultOption.type == print_preview_new.DuplexType.LONG_EDGE ||
-               defaultOption.type == print_preview_new.DuplexType.SHORT_EDGE) :
+              (defaultOption.type == print_preview.DuplexType.LONG_EDGE ||
+               defaultOption.type == print_preview.DuplexType.SHORT_EDGE) :
               false);
       this.setSetting(
           'duplexShortEdge',
           defaultOption ?
-              defaultOption.type == print_preview_new.DuplexType.SHORT_EDGE :
+              defaultOption.type == print_preview.DuplexType.SHORT_EDGE :
               false);
 
       if (!this.settings.duplexShortEdge.available) {
@@ -831,16 +831,16 @@
         this.setSettingPath_(
             'duplexShortEdge.unavailableValue',
             caps.duplex.option.some(
-                o => o.type == print_preview_new.DuplexType.SHORT_EDGE));
+                o => o.type == print_preview.DuplexType.SHORT_EDGE));
       }
     } else if (
         !this.settings.duplex.available && caps && caps.duplex &&
         caps.duplex.option) {
       // In this case, there must only be one option.
       const hasLongEdge = caps.duplex.option.some(
-          o => o.type == print_preview_new.DuplexType.LONG_EDGE);
+          o => o.type == print_preview.DuplexType.LONG_EDGE);
       const hasShortEdge = caps.duplex.option.some(
-          o => o.type == print_preview_new.DuplexType.SHORT_EDGE);
+          o => o.type == print_preview.DuplexType.SHORT_EDGE);
       // If the only option available is long edge, the value should always be
       // true.
       this.setSettingPath_(
@@ -892,7 +892,7 @@
 
     let savedSettings;
     try {
-      savedSettings = /** @type {print_preview_new.SerializedSettings} */ (
+      savedSettings = /** @type {print_preview.SerializedSettings} */ (
           JSON.parse(savedSettingsStr));
     } catch (e) {
       console.error('Unable to parse state ' + e);
@@ -1055,31 +1055,31 @@
   },
 
   /**
-   * @return {!print_preview_new.DuplexMode} The duplex mode selected.
+   * @return {!print_preview.DuplexMode} The duplex mode selected.
    * @private
    */
   getDuplexMode_: function() {
     if (!this.getSettingValue('duplex')) {
-      return print_preview_new.DuplexMode.SIMPLEX;
+      return print_preview.DuplexMode.SIMPLEX;
     }
 
     return this.getSettingValue('duplexShortEdge') ?
-        print_preview_new.DuplexMode.SHORT_EDGE :
-        print_preview_new.DuplexMode.LONG_EDGE;
+        print_preview.DuplexMode.SHORT_EDGE :
+        print_preview.DuplexMode.LONG_EDGE;
   },
 
   /**
-   * @return {!print_preview_new.DuplexType} The duplex type selected.
+   * @return {!print_preview.DuplexType} The duplex type selected.
    * @private
    */
   getCddDuplexType_: function() {
     if (!this.getSettingValue('duplex')) {
-      return print_preview_new.DuplexType.NO_DUPLEX;
+      return print_preview.DuplexType.NO_DUPLEX;
     }
 
     return this.getSettingValue('duplexShortEdge') ?
-        print_preview_new.DuplexType.SHORT_EDGE :
-        print_preview_new.DuplexType.LONG_EDGE;
+        print_preview.DuplexType.SHORT_EDGE :
+        print_preview.DuplexType.LONG_EDGE;
   },
 
   /**
diff --git a/chrome/browser/resources/print_preview/new/number_settings_section.js b/chrome/browser/resources/print_preview/new/number_settings_section.js
index 1a1b4c8..70f53ec4 100644
--- a/chrome/browser/resources/print_preview/new/number_settings_section.js
+++ b/chrome/browser/resources/print_preview/new/number_settings_section.js
@@ -5,7 +5,7 @@
 Polymer({
   is: 'print-preview-number-settings-section',
 
-  behaviors: [print_preview_new.InputBehavior],
+  behaviors: [print_preview.InputBehavior],
 
   properties: {
     /** @private {string} */
diff --git a/chrome/browser/resources/print_preview/new/pages_per_sheet_settings.js b/chrome/browser/resources/print_preview/new/pages_per_sheet_settings.js
index e94352a..d581eee 100644
--- a/chrome/browser/resources/print_preview/new/pages_per_sheet_settings.js
+++ b/chrome/browser/resources/print_preview/new/pages_per_sheet_settings.js
@@ -5,7 +5,7 @@
 Polymer({
   is: 'print-preview-pages-per-sheet-settings',
 
-  behaviors: [SettingsBehavior, print_preview_new.SelectBehavior],
+  behaviors: [SettingsBehavior, print_preview.SelectBehavior],
 
   properties: {
     disabled: Boolean,
diff --git a/chrome/browser/resources/print_preview/new/pages_settings.js b/chrome/browser/resources/print_preview/new/pages_settings.js
index 84c3132..aa6193f 100644
--- a/chrome/browser/resources/print_preview/new/pages_settings.js
+++ b/chrome/browser/resources/print_preview/new/pages_settings.js
@@ -38,8 +38,8 @@
   is: 'print-preview-pages-settings',
 
   behaviors: [
-    SettingsBehavior, print_preview_new.InputBehavior,
-    print_preview_new.SelectBehavior
+    SettingsBehavior, print_preview.InputBehavior,
+    print_preview.SelectBehavior
   ],
 
   properties: {
diff --git a/chrome/browser/resources/print_preview/new/pin_settings.js b/chrome/browser/resources/print_preview/new/pin_settings.js
index 10451467..656c932 100644
--- a/chrome/browser/resources/print_preview/new/pin_settings.js
+++ b/chrome/browser/resources/print_preview/new/pin_settings.js
@@ -5,10 +5,10 @@
 Polymer({
   is: 'print-preview-pin-settings',
 
-  behaviors: [SettingsBehavior, print_preview_new.InputBehavior],
+  behaviors: [SettingsBehavior, print_preview.InputBehavior],
 
   properties: {
-    /** @type {!print_preview_new.State} */
+    /** @type {!print_preview.State} */
     state: Number,
 
     disabled: Boolean,
@@ -136,7 +136,7 @@
     // It's done because we don't permit multiple simultaneous validation errors
     // in Print Preview and we also don't want to set the value when sticky
     // settings may not yet have been set.
-    if (this.state != print_preview_new.State.READY &&
+    if (this.state != print_preview.State.READY &&
         this.settings.pinValue.valid) {
       return;
     }
diff --git a/chrome/browser/resources/print_preview/new/plugin_proxy.js b/chrome/browser/resources/print_preview/new/plugin_proxy.js
index d813eed..fb393a7 100644
--- a/chrome/browser/resources/print_preview/new/plugin_proxy.js
+++ b/chrome/browser/resources/print_preview/new/plugin_proxy.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview_new');
+cr.exportPath('print_preview');
 /**
  * @typedef {{accessibility: Function,
  *            documentLoadComplete: Function,
@@ -32,9 +32,9 @@
  *            zoomIn: Function,
  *            zoomOut: Function}}
  */
-print_preview_new.PDFPlugin;
+print_preview.PDFPlugin;
 
-cr.define('print_preview_new', function() {
+cr.define('print_preview', function() {
   'use strict';
 
   /**
@@ -43,7 +43,7 @@
   class PluginProxy {
     /**
      * Creates a new PluginProxy if the current instance is not set.
-     * @return {!print_preview_new.PluginProxy} The singleton instance.
+     * @return {!print_preview.PluginProxy} The singleton instance.
      */
     static getInstance() {
       if (instance == null) {
@@ -53,7 +53,7 @@
     }
 
     /**
-     * @param {!print_preview_new.PluginProxy} newInstance The PluginProxy
+     * @param {!print_preview.PluginProxy} newInstance The PluginProxy
      *     instance to set for print preview construction.
      */
     static setInstance(newInstance) {
@@ -61,7 +61,7 @@
     }
 
     constructor() {
-      /** @private {?print_preview_new.PDFPlugin} */
+      /** @private {?print_preview.PDFPlugin} */
       this.plugin_ = null;
     }
 
@@ -85,12 +85,12 @@
      * Creates the PDF plugin.
      * @param {number} previewUid The unique ID of the preview UI.
      * @param {number} index The preview index to load.
-     * @return {!print_preview_new.PDFPlugin} The created plugin.
+     * @return {!print_preview.PDFPlugin} The created plugin.
      */
     createPlugin(previewUid, index) {
       assert(!this.plugin_);
       const srcUrl = this.getPreviewUrl_(previewUid, index);
-      this.plugin_ = /** @type {print_preview_new.PDFPlugin} */ (
+      this.plugin_ = /** @type {print_preview.PDFPlugin} */ (
           PDFCreateOutOfProcessPlugin(srcUrl, 'chrome://print/pdf'));
       this.plugin_.classList.add('preview-area-plugin');
       this.plugin_.setAttribute('aria-live', 'polite');
@@ -166,7 +166,7 @@
     }
   }
 
-  /** @type {?print_preview_new.PluginProxy} */
+  /** @type {?print_preview.PluginProxy} */
   let instance = null;
 
   // Export
diff --git a/chrome/browser/resources/print_preview/new/preview_area.js b/chrome/browser/resources/print_preview/new/preview_area.js
index b21b0693..03f5549 100644
--- a/chrome/browser/resources/print_preview/new/preview_area.js
+++ b/chrome/browser/resources/print_preview/new/preview_area.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview_new');
+cr.exportPath('print_preview');
 
 /**
  * @typedef {{
@@ -10,10 +10,10 @@
  *   height_microns: number,
  * }}
  */
-print_preview_new.MediaSizeValue;
+print_preview.MediaSizeValue;
 
 /** @enum {string} */
-print_preview_new.PreviewAreaState = {
+print_preview.PreviewAreaState = {
   NO_PLUGIN: 'no-plugin',
   LOADING: 'loading',
   DISPLAY_PREVIEW: 'display-preview',
@@ -33,7 +33,7 @@
 
     documentModifiable: Boolean,
 
-    /** @type {!print_preview_new.Error} */
+    /** @type {!print_preview.Error} */
     error: {
       type: Number,
       notify: true,
@@ -53,14 +53,14 @@
     /** @type {!print_preview.Size} */
     pageSize: Object,
 
-    /** @type {!print_preview_new.PreviewAreaState} */
+    /** @type {!print_preview.PreviewAreaState} */
     previewState: {
       type: String,
       notify: true,
-      value: print_preview_new.PreviewAreaState.LOADING,
+      value: print_preview.PreviewAreaState.LOADING,
     },
 
-    /** @type {!print_preview_new.State} */
+    /** @type {!print_preview.State} */
     state: {
       type: Number,
       observer: 'onStateChange_',
@@ -104,7 +104,7 @@
   /** @private {number} */
   inFlightRequestId_: -1,
 
-  /** @private {?print_preview_new.PluginProxy} */
+  /** @private {?print_preview.PluginProxy} */
   pluginProxy_: null,
 
   /** @private {?function(!KeyboardEvent)} */
@@ -120,11 +120,11 @@
           'dark-mode-changed', this.onDarkModeChanged_.bind(this));
     }
 
-    this.pluginProxy_ = print_preview_new.PluginProxy.getInstance();
+    this.pluginProxy_ = print_preview.PluginProxy.getInstance();
     if (!this.pluginProxy_.checkPluginCompatibility(assert(
             this.$$('.preview-area-compatibility-object-out-of-process')))) {
-      this.error = print_preview_new.Error.NO_PLUGIN;
-      this.previewState = print_preview_new.PreviewAreaState.ERROR;
+      this.error = print_preview.Error.NO_PLUGIN;
+      this.previewState = print_preview.PreviewAreaState.ERROR;
     }
   },
 
@@ -182,14 +182,14 @@
   /** @private */
   pluginOrDocumentStatusChanged_: function() {
     if (!this.pluginLoaded_ || !this.documentReady_ ||
-        this.previewState === print_preview_new.PreviewAreaState.ERROR) {
+        this.previewState === print_preview.PreviewAreaState.ERROR) {
       return;
     }
 
     this.previewState = this.previewState ==
-            print_preview_new.PreviewAreaState.OPEN_IN_PREVIEW_LOADING ?
-        print_preview_new.PreviewAreaState.OPEN_IN_PREVIEW_LOADED :
-        print_preview_new.PreviewAreaState.DISPLAY_PREVIEW;
+            print_preview.PreviewAreaState.OPEN_IN_PREVIEW_LOADING ?
+        print_preview.PreviewAreaState.OPEN_IN_PREVIEW_LOADED :
+        print_preview.PreviewAreaState.DISPLAY_PREVIEW;
   },
 
   /**
@@ -213,8 +213,7 @@
    * @private
    */
   isInDisplayPreviewState_: function() {
-    return this.previewState ==
-        print_preview_new.PreviewAreaState.DISPLAY_PREVIEW;
+    return this.previewState == print_preview.PreviewAreaState.DISPLAY_PREVIEW;
   },
 
   /**
@@ -222,7 +221,7 @@
    * @private
    */
   isPreviewLoading_: function() {
-    return this.previewState == print_preview_new.PreviewAreaState.LOADING;
+    return this.previewState == print_preview.PreviewAreaState.LOADING;
   },
 
   /**
@@ -239,7 +238,7 @@
    * @private
    */
   shouldShowLearnMoreLink_: function() {
-    return this.error === print_preview_new.Error.UNSUPPORTED_PRINTER;
+    return this.error === print_preview.Error.UNSUPPORTED_PRINTER;
   },
 
   /**
@@ -248,16 +247,16 @@
    */
   currentMessage_: function() {
     switch (this.previewState) {
-      case print_preview_new.PreviewAreaState.LOADING:
+      case print_preview.PreviewAreaState.LOADING:
         return this.i18n('loading');
-      case print_preview_new.PreviewAreaState.DISPLAY_PREVIEW:
+      case print_preview.PreviewAreaState.DISPLAY_PREVIEW:
         return '';
       // <if expr="is_macosx">
-      case print_preview_new.PreviewAreaState.OPEN_IN_PREVIEW_LOADING:
-      case print_preview_new.PreviewAreaState.OPEN_IN_PREVIEW_LOADED:
+      case print_preview.PreviewAreaState.OPEN_IN_PREVIEW_LOADING:
+      case print_preview.PreviewAreaState.OPEN_IN_PREVIEW_LOADED:
         return this.i18n('openingPDFInPreview');
       // </if>
-      case print_preview_new.PreviewAreaState.ERROR:
+      case print_preview.PreviewAreaState.ERROR:
         // The preview area is responsible for displaying all errors except
         // print failed and cloud print error.
         return this.getErrorMessage_();
@@ -272,10 +271,10 @@
    */
   startPreview: function(forceUpdate) {
     if (!this.hasTicketChanged_() && !forceUpdate &&
-        this.previewState !== print_preview_new.PreviewAreaState.ERROR) {
+        this.previewState !== print_preview.PreviewAreaState.ERROR) {
       return;
     }
-    this.previewState = print_preview_new.PreviewAreaState.LOADING;
+    this.previewState = print_preview.PreviewAreaState.LOADING;
     this.documentReady_ = false;
     this.getPreview_().then(
         previewUid => {
@@ -286,11 +285,11 @@
         },
         type => {
           if (/** @type{string} */ (type) == 'SETTINGS_INVALID') {
-            this.error = print_preview_new.Error.INVALID_PRINTER;
-            this.previewState = print_preview_new.PreviewAreaState.ERROR;
+            this.error = print_preview.Error.INVALID_PRINTER;
+            this.previewState = print_preview.PreviewAreaState.ERROR;
           } else if (/** @type{string} */ (type) != 'CANCELLED') {
-            this.error = print_preview_new.Error.PREVIEW_FAILED;
-            this.previewState = print_preview_new.PreviewAreaState.ERROR;
+            this.error = print_preview.Error.PREVIEW_FAILED;
+            this.previewState = print_preview.PreviewAreaState.ERROR;
           }
         });
   },
@@ -300,9 +299,9 @@
   setOpeningPdfInPreview: function() {
     assert(cr.isMac);
     this.previewState =
-        this.previewState == print_preview_new.PreviewAreaState.LOADING ?
-        print_preview_new.PreviewAreaState.OPEN_IN_PREVIEW_LOADING :
-        print_preview_new.PreviewAreaState.OPEN_IN_PREVIEW_LOADED;
+        this.previewState == print_preview.PreviewAreaState.LOADING ?
+        print_preview.PreviewAreaState.OPEN_IN_PREVIEW_LOADING :
+        print_preview.PreviewAreaState.OPEN_IN_PREVIEW_LOADED;
   },
   // </if>
 
@@ -344,8 +343,8 @@
     if (success) {
       this.pluginLoaded_ = true;
     } else {
-      this.error = print_preview_new.Error.PREVIEW_FAILED;
-      this.previewState = print_preview_new.PreviewAreaState.ERROR;
+      this.error = print_preview.Error.PREVIEW_FAILED;
+      this.previewState = print_preview.PreviewAreaState.ERROR;
     }
   },
 
@@ -408,8 +407,7 @@
       this.pluginProxy_.darkModeChanged(darkMode);
     }
 
-    if (this.previewState ===
-        print_preview_new.PreviewAreaState.DISPLAY_PREVIEW) {
+    if (this.previewState === print_preview.PreviewAreaState.DISPLAY_PREVIEW) {
       this.startPreview(true);
     }
   },
@@ -591,7 +589,7 @@
           Object.values(print_preview.ticket_items.CustomMarginsOrientation)
               .some(side => {
                 return this.margins.get(side) !==
-                    customMargins[print_preview_new.MARGIN_KEY_MAP.get(side)];
+                    customMargins[print_preview.MARGIN_KEY_MAP.get(side)];
               });
       if (customMarginsChanged) {
         return true;
@@ -628,7 +626,7 @@
 
     // Media size
     const newValue =
-        /** @type {!print_preview_new.MediaSizeValue} */ (
+        /** @type {!print_preview.MediaSizeValue} */ (
             this.getSettingValue('mediaSize'));
     if (newValue.height_microns != lastTicket.mediaSize.height_microns ||
         newValue.width_microns != lastTicket.mediaSize.width_microns ||
@@ -711,8 +709,8 @@
       dpiHorizontal: this.getDpiForTicket_('horizontal_dpi'),
       dpiVertical: this.getDpiForTicket_('vertical_dpi'),
       duplex: this.getSettingValue('duplex') ?
-          print_preview_new.DuplexMode.LONG_EDGE :
-          print_preview_new.DuplexMode.SIMPLEX,
+          print_preview.DuplexMode.LONG_EDGE :
+          print_preview.DuplexMode.SIMPLEX,
       printToPDF: this.destination.id ==
           print_preview.Destination.GooglePromotedId.SAVE_AS_PDF,
       printWithCloudPrint: !this.destination.isLocal,
@@ -738,33 +736,33 @@
 
   /** @private */
   onStateChange_: function() {
-    if ((this.state === print_preview_new.State.ERROR ||
-         this.state === print_preview_new.State.FATAL_ERROR) &&
+    if ((this.state === print_preview.State.ERROR ||
+         this.state === print_preview.State.FATAL_ERROR) &&
         this.getErrorMessage_() !== '') {
-      this.previewState = print_preview_new.PreviewAreaState.ERROR;
+      this.previewState = print_preview.PreviewAreaState.ERROR;
     }
   },
 
   /** @return {string} The error message to display in the preview area. */
   getErrorMessage_: function() {
     switch (this.error) {
-      case print_preview_new.Error.INVALID_PRINTER:
+      case print_preview.Error.INVALID_PRINTER:
         return this.i18nAdvanced('invalidPrinterSettings', {
           substitutions: [],
           tags: ['BR'],
         });
-      case print_preview_new.Error.UNSUPPORTED_PRINTER:
+      case print_preview.Error.UNSUPPORTED_PRINTER:
         return this.i18nAdvanced('unsupportedCloudPrinter', {
           substitutions: [],
           tags: ['BR'],
         });
       // <if expr="chromeos">
-      case print_preview_new.Error.NO_DESTINATIONS:
+      case print_preview.Error.NO_DESTINATIONS:
         return this.i18n('noDestinationsMessage');
       // </if>
-      case print_preview_new.Error.NO_PLUGIN:
+      case print_preview.Error.NO_PLUGIN:
         return this.i18n('noPlugin');
-      case print_preview_new.Error.PREVIEW_FAILED:
+      case print_preview.Error.PREVIEW_FAILED:
         return this.i18n('previewFailed');
       default:
         return '';
diff --git a/chrome/browser/resources/print_preview/new/provisional_destination_resolver.js b/chrome/browser/resources/print_preview/new/provisional_destination_resolver.js
index 8369121..025447a4 100644
--- a/chrome/browser/resources/print_preview/new/provisional_destination_resolver.js
+++ b/chrome/browser/resources/print_preview/new/provisional_destination_resolver.js
@@ -11,13 +11,13 @@
  * has successfully granted access.
  */
 
-cr.exportPath('print_preview_new');
+cr.exportPath('print_preview');
 
 /**
  * States that the provisional destination resolver can be in.
  * @enum {string}
  */
-print_preview_new.ResolverState = {
+print_preview.ResolverState = {
   INITIAL: 'INITIAL',
   ACTIVE: 'ACTIVE',
   GRANTING_PERMISSION: 'GRANTING_PERMISSION',
@@ -40,10 +40,10 @@
       value: null,
     },
 
-    /** @private {!print_preview_new.ResolverState} */
+    /** @private {!print_preview.ResolverState} */
     state_: {
       type: String,
-      value: print_preview_new.ResolverState.INITIAL,
+      value: print_preview.ResolverState.INITIAL,
     },
   },
 
@@ -64,7 +64,7 @@
    *     resolved.
    */
   resolveDestination: function(destination) {
-    this.state_ = print_preview_new.ResolverState.ACTIVE;
+    this.state_ = print_preview.ResolverState.ACTIVE;
     this.destination_ = destination;
     this.$.dialog.showModal();
     const icon = this.$$('.extension-icon');
@@ -85,10 +85,10 @@
    */
   startResolveDestination_: function() {
     assert(
-        this.state_ == print_preview_new.ResolverState.ACTIVE,
+        this.state_ == print_preview.ResolverState.ACTIVE,
         'Invalid state in request grant permission');
 
-    this.state_ = print_preview_new.ResolverState.GRANTING_PERMISSION;
+    this.state_ = print_preview.ResolverState.GRANTING_PERMISSION;
     const destination =
         /** @type {!print_preview.Destination} */ (this.destination_);
     this.destinationStore.resolveProvisionalDestination(destination)
@@ -96,7 +96,7 @@
             /** @param {?print_preview.Destination} resolvedDestination */
             (resolvedDestination) => {
               if (this.state_ !=
-                  print_preview_new.ResolverState.GRANTING_PERMISSION) {
+                  print_preview.ResolverState.GRANTING_PERMISSION) {
                 return;
               }
 
@@ -105,12 +105,12 @@
               }
 
               if (resolvedDestination) {
-                this.state_ = print_preview_new.ResolverState.DONE;
+                this.state_ = print_preview.ResolverState.DONE;
                 this.promiseResolver_.resolve(resolvedDestination);
                 this.promiseResolver_ = null;
                 this.$.dialog.close();
               } else {
-                this.state_ = print_preview_new.ResolverState.ERROR;
+                this.state_ = print_preview.ResolverState.ERROR;
               }
             });
   },
@@ -135,7 +135,7 @@
   /** @private */
   onCancel_: function() {
     this.promiseResolver_.reject();
-    this.state_ = print_preview_new.ResolverState.INITIAL;
+    this.state_ = print_preview.ResolverState.INITIAL;
   },
 
   /**
@@ -143,7 +143,7 @@
    * @private
    */
   getPermissionMessage_: function() {
-    return this.state_ == print_preview_new.ResolverState.ERROR ?
+    return this.state_ == print_preview.ResolverState.ERROR ?
         this.i18n(
             'resolveExtensionUSBErrorMessage',
             this.destination_.extensionName) :
@@ -155,7 +155,7 @@
    * @private
    */
   isInErrorState_: function() {
-    return this.state_ == print_preview_new.ResolverState.ERROR;
+    return this.state_ == print_preview.ResolverState.ERROR;
   },
 
   /**
@@ -163,7 +163,7 @@
    * @private
    */
   isInActiveState_: function() {
-    return this.state_ == print_preview_new.ResolverState.ACTIVE;
+    return this.state_ == print_preview.ResolverState.ACTIVE;
   },
 
   /**
@@ -171,7 +171,7 @@
    *     state, empty otherwise.
    */
   getThrobberClass_: function() {
-    return this.state_ == print_preview_new.ResolverState.GRANTING_PERMISSION ?
+    return this.state_ == print_preview.ResolverState.GRANTING_PERMISSION ?
         'throbber' :
         '';
   },
diff --git a/chrome/browser/resources/print_preview/new/scaling_settings.js b/chrome/browser/resources/print_preview/new/scaling_settings.js
index a852658..f9da00e 100644
--- a/chrome/browser/resources/print_preview/new/scaling_settings.js
+++ b/chrome/browser/resources/print_preview/new/scaling_settings.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview_new');
+cr.exportPath('print_preview');
 
 /** @enum {number} */
 const ScalingValue = {
@@ -22,7 +22,7 @@
 Polymer({
   is: 'print-preview-scaling-settings',
 
-  behaviors: [SettingsBehavior, print_preview_new.SelectBehavior],
+  behaviors: [SettingsBehavior, print_preview.SelectBehavior],
 
   properties: {
     disabled: {
diff --git a/chrome/browser/resources/print_preview/new/select_behavior.js b/chrome/browser/resources/print_preview/new/select_behavior.js
index c984929..4f00dc0 100644
--- a/chrome/browser/resources/print_preview/new/select_behavior.js
+++ b/chrome/browser/resources/print_preview/new/select_behavior.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.define('print_preview_new', function() {
+cr.define('print_preview', function() {
   /**
    * Helper functions for a select with timeout. Implemented by select settings
    * sections, so that the preview does not immediately begin generating and
diff --git a/chrome/browser/resources/print_preview/new/settings_behavior.js b/chrome/browser/resources/print_preview/new/settings_behavior.js
index 6454313..80f3a81 100644
--- a/chrome/browser/resources/print_preview/new/settings_behavior.js
+++ b/chrome/browser/resources/print_preview/new/settings_behavior.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview_new');
+cr.exportPath('print_preview');
 
 /**
  * |key| is the field in the serialized settings state that corresponds to the
@@ -18,46 +18,46 @@
  *   updatesPreview: boolean,
  * }}
  */
-print_preview_new.Setting;
+print_preview.Setting;
 
 /**
  * @typedef {{
- *   pages: !print_preview_new.Setting,
- *   copies: !print_preview_new.Setting,
- *   collate: !print_preview_new.Setting,
- *   layout: !print_preview_new.Setting,
- *   color: !print_preview_new.Setting,
- *   mediaSize: !print_preview_new.Setting,
- *   margins: !print_preview_new.Setting,
- *   dpi: !print_preview_new.Setting,
- *   fitToPage: !print_preview_new.Setting,
- *   scaling: !print_preview_new.Setting,
- *   duplex: !print_preview_new.Setting,
- *   duplexShortEdge: !print_preview_new.Setting,
- *   cssBackground: !print_preview_new.Setting,
- *   selectionOnly: !print_preview_new.Setting,
- *   headerFooter: !print_preview_new.Setting,
- *   rasterize: !print_preview_new.Setting,
- *   vendorItems: !print_preview_new.Setting,
- *   otherOptions: !print_preview_new.Setting,
- *   ranges: !print_preview_new.Setting,
- *   pagesPerSheet: !print_preview_new.Setting,
- *   pin: (print_preview_new.Setting|undefined),
- *   pinValue: (print_preview_new.Setting|undefined),
+ *   pages: !print_preview.Setting,
+ *   copies: !print_preview.Setting,
+ *   collate: !print_preview.Setting,
+ *   layout: !print_preview.Setting,
+ *   color: !print_preview.Setting,
+ *   mediaSize: !print_preview.Setting,
+ *   margins: !print_preview.Setting,
+ *   dpi: !print_preview.Setting,
+ *   fitToPage: !print_preview.Setting,
+ *   scaling: !print_preview.Setting,
+ *   duplex: !print_preview.Setting,
+ *   duplexShortEdge: !print_preview.Setting,
+ *   cssBackground: !print_preview.Setting,
+ *   selectionOnly: !print_preview.Setting,
+ *   headerFooter: !print_preview.Setting,
+ *   rasterize: !print_preview.Setting,
+ *   vendorItems: !print_preview.Setting,
+ *   otherOptions: !print_preview.Setting,
+ *   ranges: !print_preview.Setting,
+ *   pagesPerSheet: !print_preview.Setting,
+ *   pin: (print_preview.Setting|undefined),
+ *   pinValue: (print_preview.Setting|undefined),
  * }}
  */
-print_preview_new.Settings;
+print_preview.Settings;
 
 /** @polymerBehavior */
 const SettingsBehavior = {
   properties: {
-    /** @type {print_preview_new.Settings} */
+    /** @type {print_preview.Settings} */
     settings: Object,
   },
 
   /**
    * @param {string} settingName Name of the setting to get.
-   * @return {print_preview_new.Setting} The setting object.
+   * @return {print_preview.Setting} The setting object.
    */
   getSetting: function(settingName) {
     return print_preview.Model.getInstance().getSetting(settingName);
diff --git a/chrome/browser/resources/print_preview/new/settings_select.js b/chrome/browser/resources/print_preview/new/settings_select.js
index a8bc639..2a107ba0 100644
--- a/chrome/browser/resources/print_preview/new/settings_select.js
+++ b/chrome/browser/resources/print_preview/new/settings_select.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview_new');
+cr.exportPath('print_preview');
 /**
  * @typedef {{
  *   is_default: (boolean | undefined),
@@ -12,15 +12,15 @@
  *   name: (string | undefined),
  * }}
  */
-print_preview_new.SelectOption;
+print_preview.SelectOption;
 
 Polymer({
   is: 'print-preview-settings-select',
 
-  behaviors: [SettingsBehavior, print_preview_new.SelectBehavior],
+  behaviors: [SettingsBehavior, print_preview.SelectBehavior],
 
   properties: {
-    /** @type {{ option: Array<!print_preview_new.SelectOption> }} */
+    /** @type {{ option: Array<!print_preview.SelectOption> }} */
     capability: Object,
 
     settingName: String,
@@ -29,7 +29,7 @@
   },
 
   /**
-   * @param {!print_preview_new.SelectOption} option Option to check.
+   * @param {!print_preview.SelectOption} option Option to check.
    * @return {boolean} Whether the option is selected.
    * @private
    */
@@ -44,7 +44,7 @@
   },
 
   /**
-   * @param {!print_preview_new.SelectOption} option Option to get the value
+   * @param {!print_preview.SelectOption} option Option to get the value
    *    for.
    * @return {string} Value for the option.
    * @private
@@ -54,7 +54,7 @@
   },
 
   /**
-   * @param {!print_preview_new.SelectOption} option Option to get the display
+   * @param {!print_preview.SelectOption} option Option to get the display
    *    name for.
    * @return {string} Display name for the option.
    * @private
diff --git a/chrome/browser/resources/print_preview/new/sidebar.js b/chrome/browser/resources/print_preview/new/sidebar.js
index 3f6d4f8..3a323be 100644
--- a/chrome/browser/resources/print_preview/new/sidebar.js
+++ b/chrome/browser/resources/print_preview/new/sidebar.js
@@ -40,7 +40,7 @@
       notify: true,
     },
 
-    /** @type {!print_preview_new.Error} */
+    /** @type {!print_preview.Error} */
     error: {
       type: Number,
       notify: true,
@@ -53,7 +53,7 @@
 
     pageCount: Number,
 
-    /** @type {!print_preview_new.State} */
+    /** @type {!print_preview.State} */
     state: {
       type: Number,
       observer: 'onStateChanged_',
@@ -123,7 +123,7 @@
    * @private
    */
   computeControlsDisabled_: function() {
-    return this.state != print_preview_new.State.READY;
+    return this.state != print_preview.State.READY;
   },
 
   /**
@@ -157,7 +157,7 @@
   },
 
   onStateChanged_: function() {
-    if (this.state !== print_preview_new.State.PRINTING) {
+    if (this.state !== print_preview.State.PRINTING) {
       return;
     }
 
diff --git a/chrome/browser/resources/print_preview/new/state.js b/chrome/browser/resources/print_preview/new/state.js
index f2c66d0..df591b1f 100644
--- a/chrome/browser/resources/print_preview/new/state.js
+++ b/chrome/browser/resources/print_preview/new/state.js
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-cr.exportPath('print_preview_new');
+cr.exportPath('print_preview');
 
 /** @enum {number} */
-print_preview_new.State = {
+print_preview.State = {
   NOT_READY: 0,
   READY: 1,
   HIDDEN: 2,
@@ -17,7 +17,7 @@
 };
 
 /** @enum {number} */
-print_preview_new.Error = {
+print_preview.Error = {
   NONE: 0,
   INVALID_TICKET: 1,
   INVALID_PRINTER: 2,
@@ -33,64 +33,64 @@
   is: 'print-preview-state',
 
   properties: {
-    /** @type {!print_preview_new.State} */
+    /** @type {!print_preview.State} */
     state: {
       type: Number,
       notify: true,
-      value: print_preview_new.State.NOT_READY,
+      value: print_preview.State.NOT_READY,
     },
 
-    /** @type {!print_preview_new.Error} */
+    /** @type {!print_preview.Error} */
     error: {
       type: Number,
       notify: true,
-      value: print_preview_new.Error.NONE,
+      value: print_preview.Error.NONE,
     },
   },
 
-  /** @param {print_preview_new.State} newState The state to transition to. */
+  /** @param {print_preview.State} newState The state to transition to. */
   transitTo: function(newState) {
     switch (newState) {
-      case (print_preview_new.State.NOT_READY):
+      case (print_preview.State.NOT_READY):
         assert(
-            this.state == print_preview_new.State.NOT_READY ||
-            this.state == print_preview_new.State.READY ||
-            this.state == print_preview_new.State.ERROR);
+            this.state == print_preview.State.NOT_READY ||
+            this.state == print_preview.State.READY ||
+            this.state == print_preview.State.ERROR);
         break;
-      case (print_preview_new.State.READY):
+      case (print_preview.State.READY):
         assert(
-            this.state == print_preview_new.State.ERROR ||
-            this.state == print_preview_new.State.NOT_READY ||
-            this.state == print_preview_new.State.PRINTING);
+            this.state == print_preview.State.ERROR ||
+            this.state == print_preview.State.NOT_READY ||
+            this.state == print_preview.State.PRINTING);
         break;
-      case (print_preview_new.State.HIDDEN):
-        assert(this.state == print_preview_new.State.READY);
+      case (print_preview.State.HIDDEN):
+        assert(this.state == print_preview.State.READY);
         break;
-      case (print_preview_new.State.PRINTING):
+      case (print_preview.State.PRINTING):
         assert(
-            this.state == print_preview_new.State.READY ||
-            this.state == print_preview_new.State.HIDDEN);
+            this.state == print_preview.State.READY ||
+            this.state == print_preview.State.HIDDEN);
         break;
-      case (print_preview_new.State.SYSTEM_DIALOG):
+      case (print_preview.State.SYSTEM_DIALOG):
         assert(
-            this.state != print_preview_new.State.HIDDEN &&
-            this.state != print_preview_new.State.PRINTING &&
-            this.state != print_preview_new.State.CLOSING);
+            this.state != print_preview.State.HIDDEN &&
+            this.state != print_preview.State.PRINTING &&
+            this.state != print_preview.State.CLOSING);
         break;
-      case (print_preview_new.State.ERROR):
+      case (print_preview.State.ERROR):
         assert(
-            this.state == print_preview_new.State.ERROR ||
-            this.state == print_preview_new.State.NOT_READY ||
-            this.state == print_preview_new.State.READY);
+            this.state == print_preview.State.ERROR ||
+            this.state == print_preview.State.NOT_READY ||
+            this.state == print_preview.State.READY);
         break;
-      case (print_preview_new.State.CLOSING):
-        assert(this.state != print_preview_new.State.HIDDEN);
+      case (print_preview.State.CLOSING):
+        assert(this.state != print_preview.State.HIDDEN);
         break;
     }
     this.state = newState;
-    if (newState !== print_preview_new.State.ERROR &&
-        newState !== print_preview_new.State.FATAL_ERROR) {
-      this.error = print_preview_new.Error.NONE;
+    if (newState !== print_preview.State.ERROR &&
+        newState !== print_preview.State.FATAL_ERROR) {
+      this.error = print_preview.Error.NONE;
     }
   },
 });
diff --git a/chrome/browser/resources/print_preview/print_preview_new.html b/chrome/browser/resources/print_preview/print_preview.html
similarity index 100%
rename from chrome/browser/resources/print_preview/print_preview_new.html
rename to chrome/browser/resources/print_preview/print_preview.html
diff --git a/chrome/browser/resources/print_preview/print_preview_resources.grd b/chrome/browser/resources/print_preview/print_preview_resources.grd
index 6313d63..cafd76f 100644
--- a/chrome/browser/resources/print_preview/print_preview_resources.grd
+++ b/chrome/browser/resources/print_preview/print_preview_resources.grd
@@ -12,8 +12,8 @@
   </outputs>
   <release seq="1">
     <structures>
-      <structure name="IDR_PRINT_PREVIEW_NEW_HTML"
-                 file="print_preview_new.html"
+      <structure name="IDR_PRINT_PREVIEW_HTML"
+                 file="print_preview.html"
                  type="chrome_html" />
       <structure name="IDR_PRINT_PREVIEW_NEW_APP_HTML"
                  file="new/app.html"
diff --git a/chrome/browser/safe_browsing/download_protection/download_protection_service_browsertest.cc b/chrome/browser/safe_browsing/download_protection/download_protection_service_browsertest.cc
index 733eafa..3ed9f1e4 100644
--- a/chrome/browser/safe_browsing/download_protection/download_protection_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/download_protection/download_protection_service_browsertest.cc
@@ -11,7 +11,6 @@
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
-#include "components/safe_browsing/features.h"
 #include "components/safe_browsing/proto/csd.pb.h"
 #include "components/safe_browsing/web_ui/safe_browsing_ui.h"
 #include "content/public/browser/browser_context.h"
@@ -27,11 +26,6 @@
 
 class DownloadProtectionServiceBrowserTest : public InProcessBrowserTest {
  protected:
-  void SetUp() override {
-    scoped_feature_list_.InitAndEnableFeature(kInspectRarContentFeature);
-    InProcessBrowserTest::SetUp();
-  }
-
   base::FilePath GetTestDataDirectory() {
     base::FilePath test_file_directory;
     base::PathService::Get(chrome::DIR_TEST_DATA, &test_file_directory);
@@ -63,9 +57,6 @@
   //   echo "BBBBBBBBB" > a.zip
   //   sha256sum a.zip
   static const uint8_t kBZipDigest[];
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 const uint8_t DownloadProtectionServiceBrowserTest::kAZipDigest[] = {
diff --git a/chrome/browser/safe_browsing/download_protection/file_analyzer_unittest.cc b/chrome/browser/safe_browsing/download_protection/file_analyzer_unittest.cc
index f919b0a2..31c863e 100644
--- a/chrome/browser/safe_browsing/download_protection/file_analyzer_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection/file_analyzer_unittest.cc
@@ -10,7 +10,6 @@
 #include "base/files/scoped_temp_dir.h"
 #include "base/path_service.h"
 #include "base/run_loop.h"
-#include "base/test/scoped_feature_list.h"
 #include "build/build_config.h"
 #include "chrome/common/chrome_paths.h"
 #include "chrome/common/safe_browsing/file_type_policies_test_util.h"
@@ -46,8 +45,6 @@
   void SetUp() override {
     has_result_ = false;
     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-    scoped_feature_list_.InitAndEnableFeature(
-        safe_browsing::kInspectRarContentFeature);
   }
 
   void TearDown() override {}
@@ -60,7 +57,6 @@
  private:
   content::TestBrowserThreadBundle test_browser_thread_bundle_;
   content::InProcessUtilityThreadHelper in_process_utility_thread_helper_;
-  base::test::ScopedFeatureList scoped_feature_list_;
 };
 
 TEST_F(FileAnalyzerTest, TypeWinExecutable) {
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc
index 42ac2fa..ab14da0 100644
--- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_manager.cc
@@ -8,6 +8,7 @@
 
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/rand_util.h"
 #include "base/stl_util.h"
 #include "base/strings/stringprintf.h"
 #include "base/time/time.h"
@@ -35,6 +36,10 @@
 
 constexpr size_t kMaxNumberOfNavigationsToAppend = 5;
 
+// Logging the number of events cleaned up every 2 minutes is excessive, so we
+// sample by this rate.
+const double kNavigationCleanUpSamplingRate = 0.01;
+
 // Given when an event happened and its TTL, determine if it is already expired.
 // Note, if for some reason this event's timestamp is in the future, this
 // event's timestamp is invalid, hence we treat it as expired.
@@ -541,9 +546,11 @@
 void SafeBrowsingNavigationObserverManager::CleanUpNavigationEvents() {
   std::size_t removal_count = navigation_event_list_.CleanUpNavigationEvents();
 
-  UMA_HISTOGRAM_COUNTS_10000(
-      "SafeBrowsing.NavigationObserver.NavigationEventCleanUpCount",
-      removal_count);
+  if (base::RandDouble() < kNavigationCleanUpSamplingRate) {
+    UMA_HISTOGRAM_COUNTS_10000(
+        "SafeBrowsing.NavigationObserver.NavigationEventCleanUpCount",
+        removal_count);
+  }
 }
 
 void SafeBrowsingNavigationObserverManager::CleanUpUserGestures() {
diff --git a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc
index 87fcbf4..b5482eee 100644
--- a/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_navigation_observer_unittest.cc
@@ -18,12 +18,6 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/window_open_disposition.h"
 
-namespace {
-
-const char kNavigationEventCleanUpHistogramName[] =
-    "SafeBrowsing.NavigationObserver.NavigationEventCleanUpCount";
-}  // namespace
-
 namespace safe_browsing {
 
 class SBNavigationObserverTest : public BrowserWithTestWindowTest {
@@ -231,9 +225,6 @@
       CreateNavigationEventUniquePtr(url_0, now));
   ASSERT_EQ(6U, navigation_event_list()->Size());
 
-  base::HistogramTester histograms;
-  histograms.ExpectTotalCount(kNavigationEventCleanUpHistogramName, 0);
-
   // Cleans up navigation events.
   CleanUpNavigationEvents();
 
@@ -242,8 +233,6 @@
   EXPECT_EQ(nullptr,
             navigation_event_list()->FindNavigationEvent(
                 base::Time::Now(), url_1, GURL(), SessionID::InvalidValue()));
-  EXPECT_THAT(histograms.GetAllSamples(kNavigationEventCleanUpHistogramName),
-              testing::ElementsAre(base::Bucket(4, 1)));
 }
 
 TEST_F(SBNavigationObserverTest, TestCleanUpStaleUserGestures) {
diff --git a/chrome/browser/search/local_ntp_source.cc b/chrome/browser/search/local_ntp_source.cc
index 38869d5..fd9f3ba 100644
--- a/chrome/browser/search/local_ntp_source.cc
+++ b/chrome/browser/search/local_ntp_source.cc
@@ -55,6 +55,7 @@
 #include "chrome/grit/generated_resources.h"
 #include "chrome/grit/local_ntp_resources.h"
 #include "components/google/core/common/google_util.h"
+#include "components/omnibox/common/omnibox_features.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
 #include "components/search_engines/search_terms_data.h"
@@ -572,6 +573,10 @@
       config_data.SetBoolean(
           "hideShortcuts",
           base::FeatureList::IsEnabled(features::kHideShortcutsOnNtp));
+      config_data.SetBoolean(
+          "showFakeboxPlaceholderOnFocus",
+          base::FeatureList::IsEnabled(
+              omnibox::kUIExperimentShowPlaceholderWhenCaretShowing));
     }
 
     // Serialize the dictionary.
diff --git a/chrome/browser/ssl/ssl_browsertest.cc b/chrome/browser/ssl/ssl_browsertest.cc
index 9336d7c..e7c53f4 100644
--- a/chrome/browser/ssl/ssl_browsertest.cc
+++ b/chrome/browser/ssl/ssl_browsertest.cc
@@ -4082,8 +4082,15 @@
 // blocked regardless of the settings in WebPreferences when
 // block-all-mixed-content CSP is set.
 // TODO(crbug.com/890372): This test is flaky.
+#if defined(OS_WIN) && !defined(NDEBUG)
+#define MAYBE_MixedContentSettingsWithBlockingCSP \
+  DISABLED_MixedContentSettingsWithBlockingCSP
+#else
+#define MAYBE_MixedContentSettingsWithBlockingCSP \
+  MixedContentSettingsWithBlockingCSP
+#endif
 IN_PROC_BROWSER_TEST_P(SSLUIWorkerFetchTest,
-                       MixedContentSettingsWithBlockingCSP) {
+                       MAYBE_MixedContentSettingsWithBlockingCSP) {
   ChromeContentBrowserClientForMixedContentTest browser_client;
   content::ContentBrowserClient* old_browser_client =
       content::SetBrowserClientForTesting(&browser_client);
diff --git a/chrome/browser/tracing/trace_event_system_stats_monitor.cc b/chrome/browser/tracing/trace_event_system_stats_monitor.cc
index 9cbeffbb..993b96b 100644
--- a/chrome/browser/tracing/trace_event_system_stats_monitor.cc
+++ b/chrome/browser/tracing/trace_event_system_stats_monitor.cc
@@ -17,6 +17,8 @@
 namespace {
 
 using SamplingFrequency = performance_monitor::SystemMonitor::SamplingFrequency;
+using MetricsRefreshFrequencies = performance_monitor::SystemMonitor::
+    SystemObserver::MetricRefreshFrequencies;
 
 /////////////////////////////////////////////////////////////////////////////
 // Holds profiled system stats until the tracing system needs to serialize it.
@@ -84,8 +86,10 @@
   is_profiling_ = true;
   DCHECK(performance_monitor::SystemMonitor::Get());
   performance_monitor::SystemMonitor::Get()->AddOrUpdateObserver(
-      this, {.system_metrics_sampling_frequency =
-                 SamplingFrequency::kDefaultFrequency});
+      this, MetricsRefreshFrequencies::Builder()
+                .SetSystemMetricsSamplingFrequency(
+                    SamplingFrequency::kDefaultFrequency)
+                .Build());
 }
 
 void TraceEventSystemStatsMonitor::OnSystemMetricsStruct(
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index ce02205c..1a40fd40 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -3267,8 +3267,6 @@
       "app_list/search/crostini/crostini_repository_search_provider.h",
       "app_list/search/crostini/crostini_repository_search_result.cc",
       "app_list/search/crostini/crostini_repository_search_result.h",
-      "app_list/search/dictionary_data_store.cc",
-      "app_list/search/dictionary_data_store.h",
       "app_list/search/extension_app_result.cc",
       "app_list/search/extension_app_result.h",
       "app_list/search/mixer.cc",
diff --git a/chrome/browser/ui/android/usb_chooser_dialog_android.cc b/chrome/browser/ui/android/usb_chooser_dialog_android.cc
index ff8facd3..2ded612f 100644
--- a/chrome/browser/ui/android/usb_chooser_dialog_android.cc
+++ b/chrome/browser/ui/android/usb_chooser_dialog_android.cc
@@ -133,7 +133,7 @@
   auto it = std::find(item_id_map_.begin(), item_id_map_.end(), item_id);
   DCHECK(it != item_id_map_.end());
   controller_->Select({std::distance(item_id_map_.begin(), it)});
-  base::ResetAndReturn(&on_close_).Run();
+  std::move(on_close_).Run();
 }
 
 void UsbChooserDialogAndroid::OnDialogCancelled(
@@ -151,5 +151,5 @@
 
 void UsbChooserDialogAndroid::Cancel() {
   controller_->Cancel();
-  base::ResetAndReturn(&on_close_).Run();
+  std::move(on_close_).Run();
 }
diff --git a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
index 40ccc87..29b9d0c 100644
--- a/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
+++ b/chrome/browser/ui/app_list/arc/arc_app_unittest.cc
@@ -9,6 +9,7 @@
 #include <map>
 #include <memory>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "ash/public/cpp/app_list/app_list_config.h"
@@ -91,7 +92,7 @@
     ++update_image_count_;
     if (update_image_count_ == expected_update_image_count_ &&
         !icon_updated_callback_.is_null()) {
-      base::ResetAndReturn(&icon_updated_callback_).Run();
+      std::move(icon_updated_callback_).Run();
     }
   }
 
diff --git a/chrome/browser/ui/app_list/arc/arc_usb_host_permission_manager.cc b/chrome/browser/ui/app_list/arc/arc_usb_host_permission_manager.cc
index a9e5ea0..93eed2e 100644
--- a/chrome/browser/ui/app_list/arc/arc_usb_host_permission_manager.cc
+++ b/chrome/browser/ui/app_list/arc/arc_usb_host_permission_manager.cc
@@ -81,7 +81,7 @@
 void ArcUsbHostPermissionManager::UsbPermissionRequest::Resolve(bool allowed) {
   if (!callback_)
     return;
-  base::ResetAndReturn(&*callback_).Run(allowed);
+  std::move(*callback_).Run(allowed);
 }
 
 // UsbDeviceEntry
diff --git a/chrome/browser/ui/app_list/search/dictionary_data_store.cc b/chrome/browser/ui/app_list/search/dictionary_data_store.cc
deleted file mode 100644
index c57a92b..0000000
--- a/chrome/browser/ui/app_list/search/dictionary_data_store.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ui/app_list/search/dictionary_data_store.h"
-
-#include <set>
-#include <utility>
-
-#include "base/bind.h"
-#include "base/bind_helpers.h"
-#include "base/json/json_file_value_serializer.h"
-#include "base/json/json_string_value_serializer.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/sequenced_task_runner.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/synchronization/lock.h"
-#include "base/task/post_task.h"
-#include "base/task_runner_util.h"
-#include "base/values.h"
-
-namespace app_list {
-
-#if DCHECK_IS_ON()
-
-namespace {
-
-class ThreadSafeFilePathSet {
- public:
-  ThreadSafeFilePathSet() = default;
-
-  // Adds |file_path| to the set. DCHECKs if it is already in the set.
-  void AddPath(const base::FilePath& file_path) {
-    base::AutoLock auto_lock(lock_);
-    auto insert_result = file_paths_.insert(file_path);
-    DCHECK(insert_result.second) << "There can only be one active "
-                                    "DictionaryDataStore per file at a time.";
-  }
-
-  // Removes |file_path| from the set.
-  void RemovePath(const base::FilePath& file_path) {
-    base::AutoLock auto_lock(lock_);
-    file_paths_.erase(file_path);
-  }
-
- private:
-  base::Lock lock_;
-  std::set<base::FilePath> file_paths_;
-
-  DISALLOW_COPY_AND_ASSIGN(ThreadSafeFilePathSet);
-};
-
-base::LazyInstance<ThreadSafeFilePathSet>::Leaky
-    g_file_paths_with_active_dictionary_data_store = LAZY_INSTANCE_INITIALIZER;
-
-}  // namespace
-
-#endif  // DCHECK_IS_ON()
-
-DictionaryDataStore::DictionaryDataStore(const base::FilePath& data_file)
-    : data_file_(data_file),
-      // Uses a SKIP_ON_SHUTDOWN task runner because losing a couple
-      // associations is better than blocking shutdown.
-      file_task_runner_(base::CreateSequencedTaskRunnerWithTraits(
-          {base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})),
-      writer_(data_file, file_task_runner_),
-      cached_dict_(std::make_unique<base::DictionaryValue>()) {
-#if DCHECK_IS_ON()
-  g_file_paths_with_active_dictionary_data_store.Get().AddPath(data_file_);
-#endif
-}
-
-DictionaryDataStore::~DictionaryDataStore() {
-  Flush(OnFlushedCallback());
-
-#if DCHECK_IS_ON()
-  g_file_paths_with_active_dictionary_data_store.Get().RemovePath(data_file_);
-#endif
-}
-
-void DictionaryDataStore::Flush(OnFlushedCallback on_flushed) {
-  if (writer_.HasPendingWrite())
-    writer_.DoScheduledWrite();
-
-  if (on_flushed.is_null())
-    return;
-
-  file_task_runner_->PostTaskAndReply(FROM_HERE, base::DoNothing(),
-                                      std::move(on_flushed));
-}
-
-void DictionaryDataStore::Load(
-    DictionaryDataStore::OnLoadedCallback on_loaded) {
-  base::PostTaskAndReplyWithResult(
-      file_task_runner_.get(), FROM_HERE,
-      base::BindOnce(&DictionaryDataStore::LoadAsync, this),
-      std::move(on_loaded));
-}
-
-void DictionaryDataStore::ScheduleWrite() {
-  writer_.ScheduleWrite(this);
-}
-
-std::unique_ptr<base::DictionaryValue> DictionaryDataStore::LoadAsync() {
-  DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
-
-  int error_code = JSONFileValueDeserializer::JSON_NO_ERROR;
-  std::string error_message;
-  JSONFileValueDeserializer deserializer(data_file_);
-  std::unique_ptr<base::DictionaryValue> dict_value =
-      base::DictionaryValue::From(
-          deserializer.Deserialize(&error_code, &error_message));
-  if (error_code != JSONFileValueDeserializer::JSON_NO_ERROR || !dict_value) {
-    return nullptr;
-  }
-
-  std::unique_ptr<base::DictionaryValue> return_dict =
-      dict_value->CreateDeepCopy();
-  cached_dict_ = std::move(dict_value);
-  return return_dict;
-}
-
-bool DictionaryDataStore::SerializeData(std::string* data) {
-  JSONStringValueSerializer serializer(data);
-  serializer.set_pretty_print(true);
-  return serializer.Serialize(*cached_dict_.get());
-}
-
-}  // namespace app_list
diff --git a/chrome/browser/ui/app_list/search/dictionary_data_store.h b/chrome/browser/ui/app_list/search/dictionary_data_store.h
deleted file mode 100644
index b2ef8dc..0000000
--- a/chrome/browser/ui/app_list/search/dictionary_data_store.h
+++ /dev/null
@@ -1,76 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_UI_APP_LIST_SEARCH_DICTIONARY_DATA_STORE_H_
-#define CHROME_BROWSER_UI_APP_LIST_SEARCH_DICTIONARY_DATA_STORE_H_
-
-#include <memory>
-#include <string>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/files/file_path.h"
-#include "base/files/important_file_writer.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-
-namespace base {
-class DictionaryValue;
-class SequencedTaskRunner;
-}  // namespace base
-
-namespace app_list {
-
-// A simple JSON store to persist a dictionary. There must only be one
-// DictionaryDataStore instance per data file at a time (writes issued by
-// DictionaryDataStore instances bound to the same file would be racy).
-class DictionaryDataStore
-    : public base::RefCountedThreadSafe<DictionaryDataStore>,
-      public base::ImportantFileWriter::DataSerializer {
- public:
-  typedef base::OnceCallback<void(std::unique_ptr<base::DictionaryValue>)>
-      OnLoadedCallback;
-  typedef base::OnceClosure OnFlushedCallback;
-
-  explicit DictionaryDataStore(const base::FilePath& data_file);
-
-  // Flushes pending writes.
-  void Flush(OnFlushedCallback on_flushed);
-
-  // Reads the persisted data from disk asynchronously. |on_read| is called
-  // with the loaded and parsed data. If there is an error, |on_read| is called
-  // without data.
-  void Load(OnLoadedCallback on_loaded);
-
-  // Schedule a job to persist the cached dictionary.
-  void ScheduleWrite();
-
-  // Used to get a pointer to the cached dictionary. Changes to this dictionary
-  // will not be persisted unless ScheduleWrite() is called.
-  base::DictionaryValue* cached_dict() { return cached_dict_.get(); }
-
- private:
-  friend class base::RefCountedThreadSafe<DictionaryDataStore>;
-
-  ~DictionaryDataStore() override;
-
-  // Reads data from backing file.
-  std::unique_ptr<base::DictionaryValue> LoadAsync();
-
-  // ImportantFileWriter::DataSerializer overrides:
-  bool SerializeData(std::string* data) override;
-
-  const base::FilePath data_file_;
-  const scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
-  base::ImportantFileWriter writer_;
-
-  // Cached JSON dictionary to serve read and incremental change calls.
-  std::unique_ptr<base::DictionaryValue> cached_dict_;
-
-  DISALLOW_COPY_AND_ASSIGN(DictionaryDataStore);
-};
-
-}  // namespace app_list
-
-#endif  // CHROME_BROWSER_UI_APP_LIST_SEARCH_DICTIONARY_DATA_STORE_H_
diff --git a/chrome/browser/ui/ash/kiosk_next_shell_client_browsertest.cc b/chrome/browser/ui/ash/kiosk_next_shell_client_browsertest.cc
index 95ba3f0..2bee01e 100644
--- a/chrome/browser/ui/ash/kiosk_next_shell_client_browsertest.cc
+++ b/chrome/browser/ui/ash/kiosk_next_shell_client_browsertest.cc
@@ -51,7 +51,7 @@
 
     LoginDisplayHost::default_host()
         ->GetOobeUI()
-        ->GetGaiaScreenView()
+        ->GetView<GaiaScreenHandler>()
         ->ShowSigninScreenForTest(username, "password", "[]");
 
     // Wait for the session to start after submitting the credentials. This
diff --git a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
index 9298088..beef424 100644
--- a/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
+++ b/chrome/browser/ui/ash/launcher/chrome_launcher_controller_unittest.cc
@@ -323,7 +323,7 @@
     last_item_ = item;
     if (updated_count_ == expected_updated_count_ &&
         !updated_callback_.is_null()) {
-      base::ResetAndReturn(&updated_callback_).Run();
+      std::move(updated_callback_).Run();
     }
   }
 
@@ -3945,12 +3945,12 @@
                    "Back, AppList, Chrome, Play Store");
 
   // ARC is managed and enabled, Play Store pin should be available.
-  // Note: NEGOTIATING_TERMS_OF_SERVICE here means that opt-in flow starts.
+  // Note: CHECKING_ANDROID_MANAGEMENT here means that opt-in flow is skipped.
   profile()->GetTestingPrefService()->SetManagedPref(
       arc::prefs::kArcEnabled, std::make_unique<base::Value>(true));
   base::RunLoop().RunUntilIdle();
   ValidateArcState(true, true,
-                   arc::ArcSessionManager::State::NEGOTIATING_TERMS_OF_SERVICE,
+                   arc::ArcSessionManager::State::CHECKING_ANDROID_MANAGEMENT,
                    "Back, AppList, Chrome, Play Store");
 
   // ARC is managed and disabled, Play Store pin should not be available.
@@ -3968,6 +3968,7 @@
                    "Back, AppList, Chrome, Play Store");
 
   // ARC is not managed and enabled, Play Store pin should be available.
+  // Note: NEGOTIATING_TERMS_OF_SERVICE here means that opt-in flow starts.
   EnablePlayStore(true);
   ValidateArcState(true, false,
                    arc::ArcSessionManager::State::NEGOTIATING_TERMS_OF_SERVICE,
diff --git a/chrome/browser/ui/ash/tab_scrubber_browsertest.cc b/chrome/browser/ui/ash/tab_scrubber_browsertest.cc
index d816bb04..f5c0d64e 100644
--- a/chrome/browser/ui/ash/tab_scrubber_browsertest.cc
+++ b/chrome/browser/ui/ash/tab_scrubber_browsertest.cc
@@ -5,10 +5,10 @@
 #include "chrome/browser/ui/ash/tab_scrubber.h"
 
 #include <memory>
+#include <utility>
 
 #include "ash/display/event_transformation_handler.h"
 #include "ash/shell.h"
-#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "base/run_loop.h"
@@ -59,7 +59,7 @@
  private:
   void MaybeQuitRunLoop() {
     if (!quit_closure_.is_null())
-      base::ResetAndReturn(&quit_closure_).Run();
+      std::move(quit_closure_).Run();
   }
 
   // ImmersiveModeController::Observer:
diff --git a/chrome/browser/ui/extensions/blocked_action_bubble_delegate.cc b/chrome/browser/ui/extensions/blocked_action_bubble_delegate.cc
index 3a2303e4..ab87187 100644
--- a/chrome/browser/ui/extensions/blocked_action_bubble_delegate.cc
+++ b/chrome/browser/ui/extensions/blocked_action_bubble_delegate.cc
@@ -4,7 +4,8 @@
 
 #include "chrome/browser/ui/extensions/blocked_action_bubble_delegate.h"
 
-#include "base/callback_helpers.h"
+#include <utility>
+
 #include "base/strings/string16.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -61,7 +62,7 @@
     const base::Closure& close_bubble_callback) {}
 
 void BlockedActionBubbleDelegate::OnBubbleClosed(CloseAction action) {
-  base::ResetAndReturn(&callback_).Run(action);
+  std::move(callback_).Run(action);
 }
 
 std::unique_ptr<ToolbarActionsBarBubbleDelegate::ExtraViewInfo>
diff --git a/chrome/browser/ui/extensions/hosted_app_browser_controller.cc b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
index 1a1c64d4..f648336 100644
--- a/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
+++ b/chrome/browser/ui/extensions/hosted_app_browser_controller.cc
@@ -118,8 +118,7 @@
   web_contents->GetMutableRendererPrefs()->can_accept_load_drops = false;
   rvh->SyncRendererPrefs();
 
-  // This function could be called for non Hosted Apps.
-  if (!controller || !controller->IsHostedApp())
+  if (!controller)
     return;
 
   // All hosted apps should specify an app ID.
@@ -132,6 +131,20 @@
   web_contents->NotifyPreferencesChanged();
 }
 
+// static
+void HostedAppBrowserController::ClearAppPrefsForWebContents(
+    content::WebContents* web_contents) {
+  auto* rvh = web_contents->GetRenderViewHost();
+
+  web_contents->GetMutableRendererPrefs()->can_accept_load_drops = true;
+  rvh->SyncRendererPrefs();
+
+  extensions::TabHelper::FromWebContents(web_contents)
+      ->SetExtensionApp(nullptr);
+
+  web_contents->NotifyPreferencesChanged();
+}
+
 HostedAppBrowserController::HostedAppBrowserController(Browser* browser)
     : WebAppBrowserController(browser),
       extension_id_(web_app::GetAppIdFromApplicationName(browser->app_name())),
@@ -140,13 +153,9 @@
       // indicator of a Bookmark App for an installable website.
       created_for_installed_pwa_(
           base::FeatureList::IsEnabled(::features::kDesktopPWAWindowing) &&
-          UrlHandlers::GetUrlHandlers(GetExtension())) {
-  WebAppBrowserController::browser()->tab_strip_model()->AddObserver(this);
-}
+          UrlHandlers::GetUrlHandlers(GetExtension())) {}
 
-HostedAppBrowserController::~HostedAppBrowserController() {
-  browser()->tab_strip_model()->RemoveObserver(this);
-}
+HostedAppBrowserController::~HostedAppBrowserController() = default;
 
 base::Optional<std::string> HostedAppBrowserController::GetAppId() const {
   return extension_id_;
@@ -257,27 +266,21 @@
 }
 
 base::Optional<SkColor> HostedAppBrowserController::GetThemeColor() const {
-  base::Optional<SkColor> result;
+  base::Optional<SkColor> web_theme_color =
+      WebAppBrowserController::GetThemeColor();
+  if (web_theme_color)
+    return web_theme_color;
 
   const Extension* extension = GetExtension();
-  if (extension)
-    result = AppThemeColorInfo::GetThemeColor(extension);
-
-  // HTML meta theme-color tag overrides manifest theme_color, see spec:
-  // https://www.w3.org/TR/appmanifest/#theme_color-member
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  if (web_contents) {
-    base::Optional<SkColor> color = web_contents->GetThemeColor();
-    if (color)
-      result = color;
-  }
-
-  if (!result)
+  if (!extension)
     return base::nullopt;
 
-  // The frame/tabstrip code expects an opaque color.
-  return SkColorSetA(*result, SK_AlphaOPAQUE);
+  base::Optional<SkColor> extension_theme_color =
+      AppThemeColorInfo::GetThemeColor(extension);
+  if (extension_theme_color)
+    return SkColorSetA(*extension_theme_color, SK_AlphaOPAQUE);
+
+  return base::nullopt;
 }
 
 base::string16 HostedAppBrowserController::GetTitle() const {
@@ -345,37 +348,15 @@
   return GetExtension();
 }
 
-void HostedAppBrowserController::OnTabStripModelChanged(
-    TabStripModel* tab_strip_model,
-    const TabStripModelChange& change,
-    const TabStripSelectionChange& selection) {
-  if (change.type() == TabStripModelChange::kInserted) {
-    for (const auto& delta : change.deltas())
-      OnTabInserted(delta.insert.contents);
-  } else if (change.type() == TabStripModelChange::kRemoved) {
-    for (const auto& delta : change.deltas())
-      OnTabRemoved(delta.remove.contents);
-  }
-}
-
 void HostedAppBrowserController::OnTabInserted(content::WebContents* contents) {
-  DCHECK(!web_contents()) << "Hosted app windows are single tabbed only";
-  HostedAppBrowserController::SetAppPrefsForWebContents(this, contents);
-  content::WebContentsObserver::Observe(contents);
+  WebAppBrowserController::OnTabInserted(contents);
+  extensions::HostedAppBrowserController::SetAppPrefsForWebContents(this,
+                                                                    contents);
 }
 
 void HostedAppBrowserController::OnTabRemoved(content::WebContents* contents) {
-  DCHECK_EQ(contents, web_contents());
-  content::WebContentsObserver::Observe(nullptr);
-
-  auto* rvh = contents->GetRenderViewHost();
-
-  contents->GetMutableRendererPrefs()->can_accept_load_drops = true;
-  rvh->SyncRendererPrefs();
-
-  extensions::TabHelper::FromWebContents(contents)->SetExtensionApp(nullptr);
-
-  contents->NotifyPreferencesChanged();
+  WebAppBrowserController::OnTabRemoved(contents);
+  extensions::HostedAppBrowserController::ClearAppPrefsForWebContents(contents);
 }
 
 }  // namespace extensions
diff --git a/chrome/browser/ui/extensions/hosted_app_browser_controller.h b/chrome/browser/ui/extensions/hosted_app_browser_controller.h
index d2cf8f136..8d26321 100644
--- a/chrome/browser/ui/extensions/hosted_app_browser_controller.h
+++ b/chrome/browser/ui/extensions/hosted_app_browser_controller.h
@@ -35,14 +35,16 @@
 
 // Class to encapsulate logic to control the browser UI for extension based web
 // apps.
-class HostedAppBrowserController : public TabStripModelObserver,
-                                   public ExtensionUninstallDialog::Delegate,
+class HostedAppBrowserController : public ExtensionUninstallDialog::Delegate,
                                    public WebAppBrowserController {
  public:
   // Functions to set preferences that are unique to app windows.
   static void SetAppPrefsForWebContents(WebAppBrowserController* controller,
                                         content::WebContents* web_contents);
 
+  // Clear preferences that are unique to app windows.
+  static void ClearAppPrefsForWebContents(content::WebContents* web_contents);
+
   explicit HostedAppBrowserController(Browser* browser);
   ~HostedAppBrowserController() override;
 
@@ -95,19 +97,13 @@
   // the lifetime of HostedAppBrowserController).
   bool IsInstalled() const override;
 
-  // TabStripModelObserver overrides.
-  void OnTabStripModelChanged(
-      TabStripModel* tab_strip_model,
-      const TabStripModelChange& change,
-      const TabStripSelectionChange& selection) override;
-
   bool IsHostedApp() const override;
 
- private:
-  // Called by OnTabstripModelChanged().
-  void OnTabInserted(content::WebContents* contents);
-  void OnTabRemoved(content::WebContents* contents);
+ protected:
+  void OnTabInserted(content::WebContents* contents) override;
+  void OnTabRemoved(content::WebContents* contents) override;
 
+ private:
   // Will return nullptr if the extension has been uninstalled.
   const Extension* GetExtension() const;
 
diff --git a/chrome/browser/ui/manifest_web_app_browser_controller.cc b/chrome/browser/ui/manifest_web_app_browser_controller.cc
index d6c2a9e..39ec802 100644
--- a/chrome/browser/ui/manifest_web_app_browser_controller.cc
+++ b/chrome/browser/ui/manifest_web_app_browser_controller.cc
@@ -46,26 +46,6 @@
   return browser()->GetCurrentPageIcon().AsImageSkia();
 }
 
-base::Optional<SkColor> ManifestWebAppBrowserController::GetThemeColor() const {
-  base::Optional<SkColor> result;
-
-  // HTML meta theme-color tag overrides manifest theme_color, see spec:
-  // https://www.w3.org/TR/appmanifest/#theme_color-member
-  content::WebContents* web_contents =
-      browser()->tab_strip_model()->GetActiveWebContents();
-  if (web_contents) {
-    base::Optional<SkColor> color = web_contents->GetThemeColor();
-    if (color)
-      result = color;
-  }
-
-  if (!result)
-    return base::nullopt;
-
-  // The frame/tabstrip code expects an opaque color.
-  return SkColorSetA(*result, SK_AlphaOPAQUE);
-}
-
 base::string16 ManifestWebAppBrowserController::GetTitle() const {
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
diff --git a/chrome/browser/ui/manifest_web_app_browser_controller.h b/chrome/browser/ui/manifest_web_app_browser_controller.h
index 1f0ea33..3329044 100644
--- a/chrome/browser/ui/manifest_web_app_browser_controller.h
+++ b/chrome/browser/ui/manifest_web_app_browser_controller.h
@@ -39,8 +39,6 @@
 
   gfx::ImageSkia GetWindowIcon() const override;
 
-  base::Optional<SkColor> GetThemeColor() const override;
-
   base::string16 GetTitle() const override;
 
   std::string GetAppShortName() const override;
diff --git a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
index 4bcc8d0..30906b3 100644
--- a/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
+++ b/chrome/browser/ui/passwords/manage_passwords_ui_controller.cc
@@ -476,15 +476,7 @@
 }
 
 void ManagePasswordsUIController::SavePasswordInternal() {
-  password_manager::PasswordStore* password_store =
-      GetPasswordStore(web_contents());
-  password_manager::PasswordFormManagerForUI* form_manager =
-      passwords_data_.form_manager();
-  for (auto* form : form_manager->GetBlacklistedMatches()) {
-    password_store->RemoveLogin(*form);
-  }
-
-  form_manager->Save();
+  passwords_data_.form_manager()->Save();
 }
 
 void ManagePasswordsUIController::NeverSavePasswordInternal() {
diff --git a/chrome/browser/ui/test/test_app_window_icon_observer.cc b/chrome/browser/ui/test/test_app_window_icon_observer.cc
index 85541fc..31f9ec4bb 100644
--- a/chrome/browser/ui/test/test_app_window_icon_observer.cc
+++ b/chrome/browser/ui/test/test_app_window_icon_observer.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/browser/ui/test/test_app_window_icon_observer.h"
 
+#include <utility>
+
 #include "base/hash/md5.h"
 #include "base/run_loop.h"
 #include "extensions/browser/app_window/app_window.h"
@@ -91,6 +93,6 @@
   ++icon_updates_;
   if (icon_updates_ == expected_icon_updates_ &&
       !icon_updated_callback_.is_null()) {
-    base::ResetAndReturn(&icon_updated_callback_).Run();
+    std::move(icon_updated_callback_).Run();
   }
 }
diff --git a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
index f9d75d56..a293b11c 100644
--- a/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
+++ b/chrome/browser/ui/views/extensions/extension_install_dialog_view.cc
@@ -5,9 +5,9 @@
 #include "chrome/browser/ui/views/extensions/extension_install_dialog_view.h"
 
 #include <string>
+#include <utility>
 
 #include "base/bind.h"
-#include "base/callback_helpers.h"
 #include "base/i18n/message_formatter.h"
 #include "base/macros.h"
 #include "base/metrics/histogram_macros.h"
@@ -247,7 +247,7 @@
 
 ExtensionInstallDialogView::~ExtensionInstallDialogView() {
   if (!handled_result_ && !done_callback_.is_null()) {
-    base::ResetAndReturn(&done_callback_)
+    std::move(done_callback_)
         .Run(ExtensionInstallPrompt::Result::USER_CANCELED);
   }
 }
@@ -373,8 +373,7 @@
 
   handled_result_ = true;
   UpdateInstallResultHistogram(false);
-  base::ResetAndReturn(&done_callback_)
-      .Run(ExtensionInstallPrompt::Result::USER_CANCELED);
+  std::move(done_callback_).Run(ExtensionInstallPrompt::Result::USER_CANCELED);
   return true;
 }
 
@@ -383,8 +382,7 @@
 
   handled_result_ = true;
   UpdateInstallResultHistogram(true);
-  base::ResetAndReturn(&done_callback_)
-      .Run(ExtensionInstallPrompt::Result::ACCEPTED);
+  std::move(done_callback_).Run(ExtensionInstallPrompt::Result::ACCEPTED);
   return true;
 }
 
diff --git a/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc b/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc
index 9b5a396..e371066 100644
--- a/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc
+++ b/chrome/browser/ui/views/ime/ime_warning_bubble_view.cc
@@ -5,8 +5,8 @@
 #include "chrome/browser/ui/views/ime/ime_warning_bubble_view.h"
 
 #include <string>
+#include <utility>
 
-#include "base/callback_helpers.h"
 #include "chrome/browser/extensions/api/input_ime/input_ime_api_nonchromeos.h"
 #include "chrome/browser/platform_util.h"
 #include "chrome/browser/ui/browser_dialogs.h"
@@ -52,10 +52,10 @@
 
 bool ImeWarningBubbleView::Accept() {
   if (never_show_checkbox_->checked()) {
-    base::ResetAndReturn(&response_callback_)
+    std::move(response_callback_)
         .Run(ImeWarningBubblePermissionStatus::GRANTED_AND_NEVER_SHOW);
   } else {
-    base::ResetAndReturn(&response_callback_)
+    std::move(response_callback_)
         .Run(ImeWarningBubblePermissionStatus::GRANTED);
   }
   return true;
@@ -63,8 +63,7 @@
 
 bool ImeWarningBubbleView::Cancel() {
   if (!response_callback_.is_null())
-    base::ResetAndReturn(&response_callback_)
-        .Run(ImeWarningBubblePermissionStatus::DENIED);
+    std::move(response_callback_).Run(ImeWarningBubblePermissionStatus::DENIED);
   return true;
 }
 
@@ -121,7 +120,7 @@
 
 ImeWarningBubbleView::~ImeWarningBubbleView() {
   if (!response_callback_.is_null()) {
-    base::ResetAndReturn(&response_callback_)
+    std::move(response_callback_)
         .Run(ImeWarningBubblePermissionStatus::ABORTED);
   }
 
diff --git a/chrome/browser/ui/views/platform_keys_certificate_selector_chromeos.cc b/chrome/browser/ui/views/platform_keys_certificate_selector_chromeos.cc
index 6b3a361..303a13b4 100644
--- a/chrome/browser/ui/views/platform_keys_certificate_selector_chromeos.cc
+++ b/chrome/browser/ui/views/platform_keys_certificate_selector_chromeos.cc
@@ -8,7 +8,6 @@
 #include <memory>
 #include <utility>
 
-#include "base/callback_helpers.h"
 #include "base/memory/ref_counted.h"
 #include "base/strings/string16.h"
 #include "base/strings/utf_string_conversions.h"
@@ -72,7 +71,7 @@
   // Ensure to call back even if the dialog was closed because of the views
   // hierarchy being destroyed.
   if (!callback_.is_null())
-    base::ResetAndReturn(&callback_).Run(nullptr);
+    std::move(callback_).Run(nullptr);
 }
 
 void PlatformKeysCertificateSelector::Init() {
@@ -93,15 +92,14 @@
 
 bool PlatformKeysCertificateSelector::Cancel() {
   DCHECK(!callback_.is_null());
-  base::ResetAndReturn(&callback_).Run(nullptr);
+  std::move(callback_).Run(nullptr);
   return true;
 }
 
 void PlatformKeysCertificateSelector::AcceptCertificate(
     std::unique_ptr<net::ClientCertIdentity> identity) {
   DCHECK(!callback_.is_null());
-  base::ResetAndReturn(&callback_)
-      .Run(base::WrapRefCounted(identity->certificate()));
+  std::move(callback_).Run(base::WrapRefCounted(identity->certificate()));
 }
 
 void ShowPlatformKeysCertificateSelector(
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
index db5f1a8e..8a1d0747 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
+++ b/chrome/browser/ui/views/tabs/tab_drag_controller_interactive_uitest.cc
@@ -15,7 +15,6 @@
 #include "base/bind.h"
 #include "base/bind_helpers.h"
 #include "base/callback.h"
-#include "base/callback_helpers.h"
 #include "base/command_line.h"
 #include "base/location.h"
 #include "base/memory/ptr_util.h"
@@ -889,7 +888,7 @@
 
     // Quit the run_loop to end the wait.
     if (!quit_.is_null())
-      base::ResetAndReturn(&quit_).Run();
+      std::move(quit_).Run();
     return true;
   }
 
diff --git a/chrome/browser/ui/web_app_browser_controller.cc b/chrome/browser/ui/web_app_browser_controller.cc
index 1fe5117..2637fb8 100644
--- a/chrome/browser/ui/web_app_browser_controller.cc
+++ b/chrome/browser/ui/web_app_browser_controller.cc
@@ -57,12 +57,17 @@
 }
 
 WebAppBrowserController::WebAppBrowserController(Browser* browser)
-    : content::WebContentsObserver(nullptr), browser_(browser) {}
+    : content::WebContentsObserver(nullptr), browser_(browser) {
+  browser->tab_strip_model()->AddObserver(this);
+}
 
-WebAppBrowserController::~WebAppBrowserController() = default;
+WebAppBrowserController::~WebAppBrowserController() {
+  browser()->tab_strip_model()->RemoveObserver(this);
+}
 
 bool WebAppBrowserController::IsForExperimentalWebAppBrowser() const {
-  return base::FeatureList::IsEnabled(::features::kDesktopPWAWindowing);
+  return base::FeatureList::IsEnabled(::features::kDesktopPWAWindowing) ||
+         base::FeatureList::IsEnabled(::features::kFocusMode);
 }
 
 bool WebAppBrowserController::CreatedForInstalledPwa() const {
@@ -94,3 +99,46 @@
     base::Optional<SkColor> theme_color) {
   browser_->window()->UpdateFrameColor();
 }
+
+base::Optional<SkColor> WebAppBrowserController::GetThemeColor() const {
+  base::Optional<SkColor> result;
+  // HTML meta theme-color tag overrides manifest theme_color, see spec:
+  // https://www.w3.org/TR/appmanifest/#theme_color-member
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  if (web_contents) {
+    base::Optional<SkColor> color = web_contents->GetThemeColor();
+    if (color)
+      result = color;
+  }
+
+  if (!result)
+    return base::nullopt;
+
+  // The frame/tabstrip code expects an opaque color.
+  return SkColorSetA(*result, SK_AlphaOPAQUE);
+}
+
+void WebAppBrowserController::OnTabStripModelChanged(
+    TabStripModel* tab_strip_model,
+    const TabStripModelChange& change,
+    const TabStripSelectionChange& selection) {
+  if (change.type() == TabStripModelChange::kInserted) {
+    for (const auto& delta : change.deltas())
+      OnTabInserted(delta.insert.contents);
+  } else if (change.type() == TabStripModelChange::kRemoved) {
+    for (const auto& delta : change.deltas())
+      OnTabRemoved(delta.remove.contents);
+  }
+}
+
+void WebAppBrowserController::OnTabInserted(content::WebContents* contents) {
+  DCHECK(!web_contents()) << " App windows are single tabbed only";
+  content::WebContentsObserver::Observe(contents);
+  DidChangeThemeColor(GetThemeColor());
+}
+
+void WebAppBrowserController::OnTabRemoved(content::WebContents* contents) {
+  DCHECK_EQ(contents, web_contents());
+  content::WebContentsObserver::Observe(nullptr);
+}
diff --git a/chrome/browser/ui/web_app_browser_controller.h b/chrome/browser/ui/web_app_browser_controller.h
index d0a94d2f..a8bbcbf 100644
--- a/chrome/browser/ui/web_app_browser_controller.h
+++ b/chrome/browser/ui/web_app_browser_controller.h
@@ -21,7 +21,8 @@
 }
 
 // Class to encapsulate logic to control the browser UI for web apps.
-class WebAppBrowserController : public content::WebContentsObserver {
+class WebAppBrowserController : public TabStripModelObserver,
+                                public content::WebContentsObserver {
  public:
   ~WebAppBrowserController() override;
 
@@ -59,7 +60,7 @@
   virtual gfx::ImageSkia GetWindowIcon() const = 0;
 
   // Returns the color of the title bar.
-  virtual base::Optional<SkColor> GetThemeColor() const = 0;
+  virtual base::Optional<SkColor> GetThemeColor() const;
 
   // Returns the title to be displayed in the window title bar.
   virtual base::string16 GetTitle() const = 0;
@@ -92,8 +93,17 @@
   // content::WebContentsObserver:
   void DidChangeThemeColor(base::Optional<SkColor> theme_color) override;
 
+  // TabStripModelObserver:
+  void OnTabStripModelChanged(
+      TabStripModel* tab_strip_model,
+      const TabStripModelChange& change,
+      const TabStripSelectionChange& selection) override;
+
  protected:
   explicit WebAppBrowserController(Browser* browser);
+  // Called by OnTabstripModelChanged().
+  virtual void OnTabInserted(content::WebContents* contents);
+  virtual void OnTabRemoved(content::WebContents* contents);
 
  private:
   Browser* const browser_;
diff --git a/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
index c6910b6..7ea6598 100644
--- a/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/arc_terms_of_service_screen_handler.cc
@@ -276,7 +276,8 @@
 
   // Hide the Skip button if the ToS screen can not be skipped during OOBE.
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
-          chromeos::switches::kEnableArcOobeOptinNoSkip)) {
+          chromeos::switches::kEnableArcOobeOptinNoSkip) ||
+      arc::IsArcPlayStoreEnabledPreferenceManagedForProfile(profile)) {
     CallJS("login.ArcTermsOfServiceScreen.hideSkipButton");
   }
 
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
index f4357ac31..6f2a772 100644
--- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.h
@@ -69,6 +69,8 @@
                           public GaiaView,
                           public NetworkPortalDetector::Observer {
  public:
+  using TView = GaiaView;
+
   // The possible modes that the Gaia signin screen can be in.
   enum GaiaScreenMode {
     // Default Gaia authentication will be used.
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
index 67cc9e9..344d4597 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -344,7 +344,8 @@
   AddScreenHandler(
       std::make_unique<ErrorScreenHandler>(js_calls_container_.get()));
 
-  error_screen_ = std::make_unique<ErrorScreen>(GetView<ErrorScreenHandler>());
+  error_screen_ =
+      std::make_unique<ErrorScreen>(GetHandler<ErrorScreenHandler>());
   ErrorScreen* error_screen = error_screen_.get();
 
   AddScreenHandler(std::make_unique<EnrollmentScreenHandler>(
@@ -401,7 +402,7 @@
 
   auto signin_screen_handler = std::make_unique<SigninScreenHandler>(
       js_calls_container_.get(), network_state_informer_, error_screen,
-      core_handler_, GetView<GaiaScreenHandler>());
+      core_handler_, GetHandler<GaiaScreenHandler>());
   signin_screen_handler_ = signin_screen_handler.get();
   AddWebUIHandler(std::move(signin_screen_handler));
 
@@ -527,135 +528,127 @@
 }
 
 WelcomeView* OobeUI::GetWelcomeView() {
-  return GetView<WelcomeScreenHandler>();
+  return GetHandler<WelcomeScreenHandler>();
 }
 
 EulaView* OobeUI::GetEulaView() {
-  return GetView<EulaScreenHandler>();
+  return GetHandler<EulaScreenHandler>();
 }
 
 UpdateView* OobeUI::GetUpdateView() {
-  return GetView<UpdateScreenHandler>();
+  return GetHandler<UpdateScreenHandler>();
 }
 
 EnableDebuggingScreenView* OobeUI::GetEnableDebuggingScreenView() {
-  return GetView<EnableDebuggingScreenHandler>();
+  return GetHandler<EnableDebuggingScreenHandler>();
 }
 
 EnrollmentScreenView* OobeUI::GetEnrollmentScreenView() {
-  return GetView<EnrollmentScreenHandler>();
+  return GetHandler<EnrollmentScreenHandler>();
 }
 
 ResetView* OobeUI::GetResetView() {
-  return GetView<ResetScreenHandler>();
+  return GetHandler<ResetScreenHandler>();
 }
 
 DemoSetupScreenView* OobeUI::GetDemoSetupScreenView() {
-  return GetView<DemoSetupScreenHandler>();
+  return GetHandler<DemoSetupScreenHandler>();
 }
 
 DemoPreferencesScreenView* OobeUI::GetDemoPreferencesScreenView() {
-  return GetView<DemoPreferencesScreenHandler>();
+  return GetHandler<DemoPreferencesScreenHandler>();
 }
 
 FingerprintSetupScreenView* OobeUI::GetFingerprintSetupScreenView() {
-  return GetView<FingerprintSetupScreenHandler>();
+  return GetHandler<FingerprintSetupScreenHandler>();
 }
 
 KioskAutolaunchScreenView* OobeUI::GetKioskAutolaunchScreenView() {
-  return GetView<KioskAutolaunchScreenHandler>();
+  return GetHandler<KioskAutolaunchScreenHandler>();
 }
 
 KioskEnableScreenView* OobeUI::GetKioskEnableScreenView() {
-  return GetView<KioskEnableScreenHandler>();
+  return GetHandler<KioskEnableScreenHandler>();
 }
 
 TermsOfServiceScreenView* OobeUI::GetTermsOfServiceScreenView() {
-  return GetView<TermsOfServiceScreenHandler>();
+  return GetHandler<TermsOfServiceScreenHandler>();
 }
 
 SyncConsentScreenView* OobeUI::GetSyncConsentScreenView() {
-  return GetView<SyncConsentScreenHandler>();
+  return GetHandler<SyncConsentScreenHandler>();
 }
 
 MarketingOptInScreenView* OobeUI::GetMarketingOptInScreenView() {
-  return GetView<MarketingOptInScreenHandler>();
+  return GetHandler<MarketingOptInScreenHandler>();
 }
 
 ArcTermsOfServiceScreenView* OobeUI::GetArcTermsOfServiceScreenView() {
-  return GetView<ArcTermsOfServiceScreenHandler>();
+  return GetHandler<ArcTermsOfServiceScreenHandler>();
 }
 
 RecommendAppsScreenView* OobeUI::GetRecommendAppsScreenView() {
-  return GetView<RecommendAppsScreenHandler>();
+  return GetHandler<RecommendAppsScreenHandler>();
 }
 
 AppDownloadingScreenView* OobeUI::GetAppDownloadingScreenView() {
-  return GetView<AppDownloadingScreenHandler>();
+  return GetHandler<AppDownloadingScreenHandler>();
 }
 
 WrongHWIDScreenView* OobeUI::GetWrongHWIDScreenView() {
-  return GetView<WrongHWIDScreenHandler>();
+  return GetHandler<WrongHWIDScreenHandler>();
 }
 
 AutoEnrollmentCheckScreenView* OobeUI::GetAutoEnrollmentCheckScreenView() {
-  return GetView<AutoEnrollmentCheckScreenHandler>();
+  return GetHandler<AutoEnrollmentCheckScreenHandler>();
 }
 
 HIDDetectionView* OobeUI::GetHIDDetectionView() {
-  return GetView<HIDDetectionScreenHandler>();
+  return GetHandler<HIDDetectionScreenHandler>();
 }
 
 DeviceDisabledScreenView* OobeUI::GetDeviceDisabledScreenView() {
-  return GetView<DeviceDisabledScreenHandler>();
+  return GetHandler<DeviceDisabledScreenHandler>();
 }
 
 EncryptionMigrationScreenView* OobeUI::GetEncryptionMigrationScreenView() {
-  return GetView<EncryptionMigrationScreenHandler>();
+  return GetHandler<EncryptionMigrationScreenHandler>();
 }
 
 SupervisionTransitionScreenView* OobeUI::GetSupervisionTransitionScreenView() {
-  return GetView<SupervisionTransitionScreenHandler>();
+  return GetHandler<SupervisionTransitionScreenHandler>();
 }
 
 UpdateRequiredView* OobeUI::GetUpdateRequiredScreenView() {
-  return GetView<UpdateRequiredScreenHandler>();
+  return GetHandler<UpdateRequiredScreenHandler>();
 }
 
 AssistantOptInFlowScreenView* OobeUI::GetAssistantOptInFlowScreenView() {
-  return GetView<AssistantOptInFlowScreenHandler>();
+  return GetHandler<AssistantOptInFlowScreenHandler>();
 }
 
 MultiDeviceSetupScreenView* OobeUI::GetMultiDeviceSetupScreenView() {
-  return GetView<MultiDeviceSetupScreenHandler>();
+  return GetHandler<MultiDeviceSetupScreenHandler>();
 }
 
 ErrorScreen* OobeUI::GetErrorScreen() {
   return error_screen_.get();
 }
 
-GaiaView* OobeUI::GetGaiaScreenView() {
-  return GetView<GaiaScreenHandler>();
-}
-
-UserBoardView* OobeUI::GetUserBoardView() {
-  return GetView<UserBoardScreenHandler>();
-}
-
 NetworkScreenView* OobeUI::GetNetworkScreenView() {
-  return GetView<NetworkScreenHandler>();
+  return GetHandler<NetworkScreenHandler>();
 }
 
 AppLaunchSplashScreenView* OobeUI::GetAppLaunchSplashScreenView() {
-  return GetView<AppLaunchSplashScreenHandler>();
+  return GetHandler<AppLaunchSplashScreenHandler>();
 }
 
 ArcKioskSplashScreenView* OobeUI::GetArcKioskSplashScreenView() {
-  return GetView<ArcKioskSplashScreenHandler>();
+  return GetHandler<ArcKioskSplashScreenHandler>();
 }
 
 DiscoverScreenView* OobeUI::GetDiscoverScreenView() {
-  return GetView<DiscoverScreenHandler>();
+  return GetHandler<DiscoverScreenHandler>();
 }
 
 void OobeUI::GetLocalizedStrings(base::DictionaryValue* localized_strings) {
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
index f848ebf..0aa7cff 100644
--- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
+++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.h
@@ -47,7 +47,6 @@
 class ErrorScreen;
 class DiscoverScreenView;
 class FingerprintSetupScreenView;
-class GaiaView;
 class HIDDetectionView;
 class KioskAutolaunchScreenView;
 class KioskEnableScreenView;
@@ -64,7 +63,6 @@
 class SigninScreenHandlerDelegate;
 class SyncConsentScreenView;
 class TermsOfServiceScreenView;
-class UserBoardView;
 class UpdateView;
 class UpdateRequiredView;
 class SupervisionTransitionScreenView;
@@ -133,8 +131,6 @@
   UpdateRequiredView* GetUpdateRequiredScreenView();
   AssistantOptInFlowScreenView* GetAssistantOptInFlowScreenView();
   MultiDeviceSetupScreenView* GetMultiDeviceSetupScreenView();
-  GaiaView* GetGaiaScreenView();
-  UserBoardView* GetUserBoardView();
   DiscoverScreenView* GetDiscoverScreenView();
   NetworkScreenView* GetNetworkScreenView();
   MarketingOptInScreenView* GetMarketingOptInScreenView();
@@ -190,14 +186,23 @@
   // Notify WebUI of the user count on the views login screen.
   void SetLoginUserCount(int user_count);
 
+  // Find a *View instance provided by a given *Handler type.
+  //
+  // This is the same as GetHandler() except the return type is limited to the
+  // view.
+  template <typename THandler>
+  typename THandler::TView* GetView() {
+    return GetHandler<THandler>();
+  }
+
  private:
-  // Lookup a view by its statically registered OobeScreen.
-  template <typename TView>
-  TView* GetView() {
-    OobeScreen expected_screen = TView::kScreenId;
+  // Find a handler instance.
+  template <typename THandler>
+  THandler* GetHandler() {
+    OobeScreen expected_screen = THandler::kScreenId;
     for (BaseScreenHandler* handler : screen_handlers_) {
       if (expected_screen == handler->oobe_screen())
-        return static_cast<TView*>(handler);
+        return static_cast<THandler*>(handler);
     }
 
     NOTREACHED() << "Unable to find handler for screen "
diff --git a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h
index 22badc0..ada66bdb 100644
--- a/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/user_board_screen_handler.h
@@ -21,6 +21,8 @@
 // A class that handles WebUI hooks in Gaia screen.
 class UserBoardScreenHandler : public BaseScreenHandler, public UserBoardView {
  public:
+  using TView = UserBoardView;
+
   explicit UserBoardScreenHandler(JSCallsContainer* js_calls_container);
   ~UserBoardScreenHandler() override;
 
diff --git a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
index efb11ef..e1f1d900 100644
--- a/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
+++ b/chrome/browser/ui/webui/print_preview/print_preview_ui.cc
@@ -457,7 +457,7 @@
     source->AddResourcePath(kPrintPreviewResources[i].name,
                             kPrintPreviewResources[i].value);
   }
-  source->SetDefaultResource(IDR_PRINT_PREVIEW_NEW_HTML);
+  source->SetDefaultResource(IDR_PRINT_PREVIEW_HTML);
   SetupPrintPreviewPlugin(source);
 #endif
   AddPrintPreviewFlags(source, profile);
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
index ee1d4df..460f00a2 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.cc
@@ -573,7 +573,8 @@
 void CupsPrintersHandler::OnPpdResolved(const std::string& callback_id,
                                         base::Value info,
                                         PpdProvider::CallbackResultCode res,
-                                        const Printer::PpdReference& ppd_ref) {
+                                        const Printer::PpdReference& ppd_ref,
+                                        const std::string& usb_manufacturer) {
   if (res != PpdProvider::CallbackResultCode::SUCCESS) {
     info.SetKey("ppdReferenceResolved", base::Value(false));
     ResolveJavascriptCallback(base::Value(callback_id), info);
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
index 7ab1f8e..8805050 100644
--- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
+++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler.h
@@ -100,7 +100,8 @@
   void OnPpdResolved(const std::string& callback_id,
                      base::Value info,
                      PpdProvider::CallbackResultCode res,
-                     const Printer::PpdReference& ppd_ref);
+                     const Printer::PpdReference& ppd_ref,
+                     const std::string& usb_manufacturer);
 
   void HandleAddCupsPrinter(const base::ListValue* args);
 
diff --git a/chrome/browser/vr/test/xr_browser_test.cc b/chrome/browser/vr/test/xr_browser_test.cc
index eb3a2e8..ebab5fe4 100644
--- a/chrome/browser/vr/test/xr_browser_test.cc
+++ b/chrome/browser/vr/test/xr_browser_test.cc
@@ -23,6 +23,7 @@
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/content_features.h"
 #include "content/public/test/browser_test_utils.h"
 #include "url/gurl.h"
 
@@ -47,7 +48,9 @@
     XrBrowserTestBase::kRequiredTestSwitchesWithValues{
         std::pair<std::string, std::string>("test-launcher-jobs", "1")};
 
-XrBrowserTestBase::XrBrowserTestBase() : env_(base::Environment::Create()) {}
+XrBrowserTestBase::XrBrowserTestBase() : env_(base::Environment::Create()) {
+  enable_features_.push_back(features::kLogJsConsoleMessages);
+}
 
 XrBrowserTestBase::~XrBrowserTestBase() = default;
 
diff --git a/chrome/browser/vr/win/vr_browser_renderer_thread_win.cc b/chrome/browser/vr/win/vr_browser_renderer_thread_win.cc
index c7c9e264..083b287d 100644
--- a/chrome/browser/vr/win/vr_browser_renderer_thread_win.cc
+++ b/chrome/browser/vr/win/vr_browser_renderer_thread_win.cc
@@ -371,21 +371,20 @@
         }
       }
     }
+  }  // if (data->pose)
 
-    if (!ret->pose->orientation) {
-      ret->pose->orientation = std::vector<float>{0, 0, 0, 1};
-    }
-
-    if (!ret->pose->position) {
-      ret->pose->position = std::vector<float>{0, 0, 0};
-    }
-
-    ret->frame_id = data->frame_id;
-
-    // Frame data has several other fields that we are ignoring.  If they are
-    // used, validate them before use.
+  if (!ret->pose->orientation) {
+    ret->pose->orientation = std::vector<float>{0, 0, 0, 1};
   }
 
+  if (!ret->pose->position) {
+    ret->pose->position = std::vector<float>{0, 0, 0};
+  }
+
+  ret->frame_id = data->frame_id;
+
+  // Frame data has several other fields that we are ignoring.  If they are
+  // used, validate them before use.
   return ret;
 }
 
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index fd844ca3..50ffc41 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -255,6 +255,12 @@
 const base::Feature kEnableIncognitoWindowCounter{
     "EnableIncognitoWindowCounter", base::FEATURE_ENABLED_BY_DEFAULT};
 
+#if !defined(OS_ANDROID)
+// Upload enterprise cloud reporting without the extension.
+const base::Feature kEnterpriseReportingInBrowser{
+    "EnterpriseReportingInBrowser", base::FEATURE_DISABLED_BY_DEFAULT};
+#endif
+
 #if defined(OS_CHROMEOS)
 // Enables event-based status reporting for child accounts in Chrome OS.
 const base::Feature kEventBasedStatusReporting{
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 7dbf915..30cbd74 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -151,6 +151,11 @@
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kEnableIncognitoWindowCounter;
 
+#if !defined(OS_ANDROID)
+COMPONENT_EXPORT(CHROME_FEATURES)
+extern const base::Feature kEnterpriseReportingInBrowser;
+#endif
+
 #if defined(OS_CHROMEOS)
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kEventBasedStatusReporting;
diff --git a/chrome/common/safe_browsing/rar_analyzer.cc b/chrome/common/safe_browsing/rar_analyzer.cc
index 1623dff..c0a277c0 100644
--- a/chrome/common/safe_browsing/rar_analyzer.cc
+++ b/chrome/common/safe_browsing/rar_analyzer.cc
@@ -6,6 +6,7 @@
 
 #include <memory>
 #include <string>
+
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/i18n/streaming_utf8_validator.h"
@@ -27,106 +28,28 @@
   results->file_count = 0;
   results->directory_count = 0;
 
-  // If the file is too big to unpack, fall back to the old method.
-  if (base::FeatureList::IsEnabled(kInspectRarContentFeature)) {
-    bool too_big_to_unpack =
-        base::checked_cast<uint64_t>(rar_file.GetLength()) >
-        FileTypePolicies::GetInstance()->GetMaxFileSizeToAnalyze("rar");
-    if (too_big_to_unpack)
-      return;
+  // If the file is too big to unpack, return failure. This will still send a
+  // ping as an "invalid" RAR.
+  bool too_big_to_unpack =
+      base::checked_cast<uint64_t>(rar_file.GetLength()) >
+      FileTypePolicies::GetInstance()->GetMaxFileSizeToAnalyze("rar");
+  if (too_big_to_unpack)
+    return;
 
-    third_party_unrar::RarReader reader;
-    if (!reader.Open(std::move(rar_file), temp_file.Duplicate()))
-      return;
+  third_party_unrar::RarReader reader;
+  if (!reader.Open(std::move(rar_file), temp_file.Duplicate()))
+    return;
 
-    while (reader.ExtractNextEntry()) {
-      const third_party_unrar::RarReader::EntryInfo& entry =
-          reader.current_entry();
-      UpdateArchiveAnalyzerResultsWithFile(entry.file_path, &temp_file,
-                                           entry.file_size, entry.is_encrypted,
-                                           results);
-      if (entry.is_directory)
-        results->directory_count++;
-      else
-        results->file_count++;
-    }
-  } else {
-    // TODO(drubery): Remove this path once http://crbug/909778 is fully rolled
-    // out.
-    auto archive = std::make_unique<third_party_unrar::Archive>();
-    archive->SetFileHandle(rar_file.GetPlatformFile());
-
-    if (base::FeatureList::IsEnabled(kInspectRarContentFeature)) {
-      archive->SetTempFileHandle(temp_file.GetPlatformFile());
-    }
-
-    bool open_success = archive->Open(L"dummy.rar");
-    UMA_HISTOGRAM_BOOLEAN("SBClientDownload.RarOpenSuccess", open_success);
-    if (!open_success) {
-      DLOG(ERROR) << __FUNCTION__ << ": Unable to open rar_file: "
-                  << rar_file.GetPlatformFile();
-      return;
-    }
-
-    bool is_valid_archive = archive->IsArchive(/*EnableBroken=*/true);
-    UMA_HISTOGRAM_BOOLEAN("SBClientDownload.RarValidArchive", is_valid_archive);
-    if (!is_valid_archive) {
-      DLOG(ERROR) << __FUNCTION__
-                  << ": !IsArchive: rar_file: " << rar_file.GetPlatformFile();
-      return;
-    }
-    std::set<base::FilePath> archived_archive_filenames;
-    for (archive->ViewComment();
-         archive->ReadHeader() > 0 &&
-         archive->GetHeaderType() != third_party_unrar::kUnrarEndarcHead;
-         archive->SeekToNext()) {
-      std::wstring wide_filename(archive->FileHead.FileName);
-#if defined(OS_WIN)
-      base::FilePath file_path(wide_filename);
-#else
-      std::string filename(wide_filename.begin(), wide_filename.end());
-      base::FilePath file_path(filename);
-#endif  // OS_WIN
-      bool is_executable =
-          FileTypePolicies::GetInstance()->IsCheckedBinaryFile(file_path);
-      bool is_archive =
-          FileTypePolicies::GetInstance()->IsArchiveFile(file_path);
-      int64 unpacked_size =
-          archive->FileHead.UnpSize;  // Read from header, may not be accurate.
-      // TODO(vakh): Log UMA if |unpacked_size| < 0.
-
-      base::FilePath basename = file_path.BaseName();
-      std::string basename_utf8(basename.AsUTF8Unsafe());
-      bool is_utf8_valid_basename =
-          base::StreamingUtf8Validator::Validate(basename_utf8);
-
-      if (archive->FileHead.Dir)
-        results->directory_count++;
-      else
-        results->file_count++;
-
-      if (is_archive) {
-        results->has_archive = true;
-        archived_archive_filenames.insert(basename);
-        ClientDownloadRequest::ArchivedBinary* archived_archive =
-            results->archived_binary.Add();
-        if (is_utf8_valid_basename)
-          archived_archive->set_file_basename(basename_utf8);
-        archived_archive->set_download_type(ClientDownloadRequest::ARCHIVE);
-        archived_archive->set_length(unpacked_size);
-      } else if (is_executable) {
-        results->has_executable = true;
-        ClientDownloadRequest::ArchivedBinary* archived_binary =
-            results->archived_binary.Add();
-        if (is_utf8_valid_basename)
-          archived_binary->set_file_basename(basename_utf8);
-        archived_binary->set_download_type(
-            download_type_util::GetDownloadType(file_path));
-        archived_binary->set_length(unpacked_size);
-      }
-      results->archived_archive_filenames.assign(
-          archived_archive_filenames.begin(), archived_archive_filenames.end());
-    }
+  while (reader.ExtractNextEntry()) {
+    const third_party_unrar::RarReader::EntryInfo& entry =
+        reader.current_entry();
+    UpdateArchiveAnalyzerResultsWithFile(entry.file_path, &temp_file,
+                                         entry.file_size, entry.is_encrypted,
+                                         results);
+    if (entry.is_directory)
+      results->directory_count++;
+    else
+      results->file_count++;
   }
 
   results->success = true;
diff --git a/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer_unittest.cc b/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer_unittest.cc
index 881cc03..9a1245a 100644
--- a/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer_unittest.cc
+++ b/chrome/services/file_util/public/cpp/sandboxed_rar_analyzer_unittest.cc
@@ -271,9 +271,6 @@
 
 TEST_F(SandboxedRarAnalyzerTest,
        AnalyzeRarContainingExecutableWithContentInspection) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(kInspectRarContentFeature);
-
   // Can detect when .rar contains executable files.
   // has_exe.rar contains 1 file: signed.exe
   base::FilePath path;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 7813c4e..8c7cc7b 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -3339,6 +3339,7 @@
       "../browser/media_galleries/win/mtp_device_delegate_impl_win_unittest.cc",
       "../browser/media_galleries/win/mtp_device_object_enumerator_unittest.cc",
       "../browser/memory/memory_pressure_monitor_utils_unittest.cc",
+      "../browser/memory/memory_pressure_monitor_win_unittest.cc",
       "../browser/memory/swap_thrashing_monitor_delegate_win_unittest.cc",
       "../browser/metrics/desktop_session_duration/desktop_session_duration_tracker_unittest.cc",
       "../browser/metrics/tab_stats_data_store_unittest.cc",
diff --git a/chrome/test/base/in_process_browser_test.cc b/chrome/test/base/in_process_browser_test.cc
index 117b43d..c3508d8 100644
--- a/chrome/test/base/in_process_browser_test.cc
+++ b/chrome/test/base/in_process_browser_test.cc
@@ -4,6 +4,8 @@
 
 #include "chrome/test/base/in_process_browser_test.h"
 
+#include <utility>
+
 #include "base/auto_reset.h"
 #include "base/bind.h"
 #include "base/command_line.h"
@@ -414,7 +416,7 @@
 }
 
 void InProcessBrowserTest::RunUntilBrowserProcessQuits() {
-  std::move(run_loop_)->Run();
+  std::exchange(run_loop_, nullptr)->Run();
 }
 
 // TODO(alexmos): This function should expose success of the underlying
@@ -623,8 +625,8 @@
 
   // Sometimes tests leave Quit tasks in the MessageLoop (for shame), so let's
   // run all pending messages here to avoid preempting the QuitBrowsers tasks.
-  // TODO(jbates) Once crbug.com/134753 is fixed, this can be removed because it
-  // will not be possible to post Quit tasks.
+  // TODO(https://crbug.com/922118): Remove this once it is no longer possible
+  // to post QuitCurrent* tasks.
   content::RunAllPendingInMessageLoop();
 
   QuitBrowsers();
diff --git a/chrome/test/chromedriver/server/http_handler.cc b/chrome/test/chromedriver/server/http_handler.cc
index 0d7d791..ec4d3f1 100644
--- a/chrome/test/chromedriver/server/http_handler.cc
+++ b/chrome/test/chromedriver/server/http_handler.cc
@@ -1148,6 +1148,17 @@
     inner_params->SetString("error", StatusCodeToString(status.code()));
     inner_params->SetString("message", status.message());
     inner_params->SetString("stacktrace", status.stack_trace());
+    // According to
+    // https://www.w3.org/TR/2018/REC-webdriver1-20180605/#dfn-annotated-unexpected-alert-open-error
+    // error UnexpectedAlertOpen should contain 'data.text' with alert text
+    if (status.code() == kUnexpectedAlertOpen) {
+      const std::string& message = status.message();
+      unsigned first = message.find("{");
+      unsigned last = message.find_last_of("}");
+      std::string alertText = message.substr(first, last-first);
+      alertText = alertText.substr(alertText.find(":") + 2);
+      inner_params->SetString("data.text", alertText);
+    }
     body_params.SetDictionary("value", std::move(inner_params));
   } else {
     body_params.Set("value", std::move(value));
diff --git a/chrome/test/data/webui/print_preview/button_strip_interactive_test.js b/chrome/test/data/webui/print_preview/button_strip_interactive_test.js
index 6f1fc4b..3ac1d0b 100644
--- a/chrome/test/data/webui/print_preview/button_strip_interactive_test.js
+++ b/chrome/test/data/webui/print_preview/button_strip_interactive_test.js
@@ -26,7 +26,7 @@
           'FooDevice', print_preview.DestinationType.GOOGLE,
           print_preview.DestinationOrigin.COOKIES, 'FooName',
           print_preview.DestinationConnectionStatus.ONLINE);
-      buttonStrip.state = print_preview_new.State.NOT_READY;
+      buttonStrip.state = print_preview.State.NOT_READY;
       document.body.appendChild(buttonStrip);
     });
 
@@ -38,7 +38,7 @@
       const whenFocusDone = test_util.eventToPromise('focus', printButton);
 
       // Simulate initialization finishing.
-      buttonStrip.state = print_preview_new.State.READY;
+      buttonStrip.state = print_preview.State.READY;
       return whenFocusDone;
     });
   });
diff --git a/chrome/test/data/webui/print_preview/button_strip_test.js b/chrome/test/data/webui/print_preview/button_strip_test.js
index 693f8b0..6e0c4a55 100644
--- a/chrome/test/data/webui/print_preview/button_strip_test.js
+++ b/chrome/test/data/webui/print_preview/button_strip_test.js
@@ -27,7 +27,7 @@
           'FooDevice', print_preview.DestinationType.GOOGLE,
           print_preview.DestinationOrigin.COOKIES, 'FooName',
           print_preview.DestinationConnectionStatus.ONLINE);
-      buttonStrip.state = print_preview_new.State.READY;
+      buttonStrip.state = print_preview.State.READY;
       document.body.appendChild(buttonStrip);
     });
 
@@ -37,16 +37,16 @@
       const printButton = buttonStrip.$$('.action-button');
       assertFalse(printButton.disabled);
 
-      buttonStrip.state = print_preview_new.State.NOT_READY;
+      buttonStrip.state = print_preview.State.NOT_READY;
       assertTrue(printButton.disabled);
 
-      buttonStrip.state = print_preview_new.State.PRINTING;
+      buttonStrip.state = print_preview.State.PRINTING;
       assertTrue(printButton.disabled);
 
-      buttonStrip.state = print_preview_new.State.ERROR;
+      buttonStrip.state = print_preview.State.ERROR;
       assertTrue(printButton.disabled);
 
-      buttonStrip.state = print_preview_new.State.FATAL_ERROR;
+      buttonStrip.state = print_preview.State.FATAL_ERROR;
       assertTrue(printButton.disabled);
     });
 
diff --git a/chrome/test/data/webui/print_preview/custom_margins_test.js b/chrome/test/data/webui/print_preview/custom_margins_test.js
index 0834bda..6e78007 100644
--- a/chrome/test/data/webui/print_preview/custom_margins_test.js
+++ b/chrome/test/data/webui/print_preview/custom_margins_test.js
@@ -65,7 +65,7 @@
           defaultMarginPts);
       container.measurementSystem = new print_preview.MeasurementSystem(
           ',', '.', print_preview.MeasurementSystemUnitType.IMPERIAL);
-      container.state = print_preview_new.State.NOT_READY;
+      container.state = print_preview.State.NOT_READY;
     });
 
     /** @return {!Array<!PrintPreviewMarginControlElement>} */
@@ -92,7 +92,7 @@
         container.settings = model.settings;
         test_util.fakeDataBind(model, container, 'settings');
 
-        container.state = print_preview_new.State.READY;
+        container.state = print_preview.State.READY;
         container.updateClippingMask(new print_preview.Size(850, 1100));
         container.updateScaleTransform(pixelsPerInch / pointsPerInch);
         container.previewLoaded = true;
diff --git a/chrome/test/data/webui/print_preview/destination_settings_test.js b/chrome/test/data/webui/print_preview/destination_settings_test.js
index 162b035..1890bd0 100644
--- a/chrome/test/data/webui/print_preview/destination_settings_test.js
+++ b/chrome/test/data/webui/print_preview/destination_settings_test.js
@@ -62,7 +62,7 @@
       destinationSettings =
           document.createElement('print-preview-destination-settings');
       destinationSettings.settings = model.settings;
-      destinationSettings.state = print_preview_new.State.NOT_READY;
+      destinationSettings.state = print_preview.State.NOT_READY;
       destinationSettings.disabled = true;
       test_util.fakeDataBind(model, destinationSettings, 'settings');
       document.body.appendChild(destinationSettings);
@@ -95,19 +95,19 @@
             // prevent brief losses of focus when the destination changes.
             assertFalse(dropdown.disabled);
             assertFalse(dropdown.hidden);
-            destinationSettings.state = print_preview_new.State.READY;
+            destinationSettings.state = print_preview.State.READY;
             destinationSettings.disabled = false;
 
             // Simulate setting a setting to an invalid value. Dropdown is
             // disabled due to validation error on another control.
-            destinationSettings.state = print_preview_new.State.ERROR;
+            destinationSettings.state = print_preview.State.ERROR;
             destinationSettings.disabled = true;
             assertTrue(dropdown.disabled);
 
             // Simulate the user fixing the validation error, and then selecting
             // an invalid printer. Dropdown is enabled, so that the user can fix
             // the error.
-            destinationSettings.state = print_preview_new.State.READY;
+            destinationSettings.state = print_preview.State.READY;
             destinationSettings.disabled = false;
             destinationSettings.destinationStore_.dispatchEvent(new CustomEvent(
                 print_preview.DestinationStore.EventType.ERROR,
@@ -118,9 +118,8 @@
                 print_preview.DestinationState.ERROR,
                 destinationSettings.destinationState);
             assertEquals(
-                print_preview_new.Error.INVALID_PRINTER,
-                destinationSettings.error);
-            destinationSettings.state = print_preview_new.State.ERROR;
+                print_preview.Error.INVALID_PRINTER, destinationSettings.error);
+            destinationSettings.state = print_preview.State.ERROR;
             destinationSettings.disabled = true;
             assertFalse(dropdown.disabled);
 
@@ -138,9 +137,9 @@
                   print_preview.DestinationState.ERROR,
                   destinationSettings.destinationState);
               assertEquals(
-                  print_preview_new.Error.NO_DESTINATIONS,
+                  print_preview.Error.NO_DESTINATIONS,
                   destinationSettings.error);
-              destinationSettings.state = print_preview_new.State.FATAL_ERROR;
+              destinationSettings.state = print_preview.State.FATAL_ERROR;
               destinationSettings.disabled = true;
               assertTrue(dropdown.disabled);
             }
@@ -165,7 +164,7 @@
       destinationSettings.initDestinationStore(
           '' /* printerName */,
           '' /* serializedDefaultDestinationSelectionRulesStr */);
-      destinationSettings.state = print_preview_new.State.READY;
+      destinationSettings.state = print_preview.State.READY;
       destinationSettings.disabled = false;
     }
 
diff --git a/chrome/test/data/webui/print_preview/duplex_settings_test.js b/chrome/test/data/webui/print_preview/duplex_settings_test.js
index fd013c1..6e60a0a4 100644
--- a/chrome/test/data/webui/print_preview/duplex_settings_test.js
+++ b/chrome/test/data/webui/print_preview/duplex_settings_test.js
@@ -52,13 +52,12 @@
       assertTrue(collapse.opened);
 
       const select = duplexSection.$$('select');
-      assertEquals(
-          print_preview_new.DuplexMode.LONG_EDGE.toString(), select.value);
+      assertEquals(print_preview.DuplexMode.LONG_EDGE.toString(), select.value);
 
       duplexSection.setSetting('duplexShortEdge', true);
       await test_util.eventToPromise('process-select-change', duplexSection);
       assertEquals(
-          print_preview_new.DuplexMode.SHORT_EDGE.toString(), select.value);
+          print_preview.DuplexMode.SHORT_EDGE.toString(), select.value);
     });
 
     // Tests that checking the box or selecting a new option in the dropdown
@@ -78,13 +77,12 @@
       assertFalse(duplexSection.getSettingValue('duplexShortEdge'));
 
       const select = duplexSection.$$('select');
-      assertEquals(
-          print_preview_new.DuplexMode.LONG_EDGE.toString(), select.value);
+      assertEquals(print_preview.DuplexMode.LONG_EDGE.toString(), select.value);
       assertEquals(2, select.options.length);
 
       // Verify that selecting an new option in the dropdown sets the setting.
       await print_preview_test_utils.selectOption(
-          duplexSection, print_preview_new.DuplexMode.SHORT_EDGE.toString());
+          duplexSection, print_preview.DuplexMode.SHORT_EDGE.toString());
       assertTrue(duplexSection.getSettingValue('duplex'));
       assertTrue(duplexSection.getSettingValue('duplexShortEdge'));
     });
diff --git a/chrome/test/data/webui/print_preview/header_new_test.js b/chrome/test/data/webui/print_preview/header_new_test.js
index 72cacbef..71c9e5a 100644
--- a/chrome/test/data/webui/print_preview/header_new_test.js
+++ b/chrome/test/data/webui/print_preview/header_new_test.js
@@ -36,7 +36,7 @@
           'FooDevice', print_preview.DestinationType.GOOGLE,
           print_preview.DestinationOrigin.COOKIES, 'FooName',
           print_preview.DestinationConnectionStatus.ONLINE);
-      header.state = print_preview_new.State.READY;
+      header.state = print_preview.State.READY;
       header.managed = false;
       test_util.fakeDataBind(model, header, 'settings');
       document.body.appendChild(header);
@@ -98,23 +98,23 @@
       const summary = header.$$('.summary');
       assertEquals('1 sheet of paper', summary.textContent.trim());
 
-      header.state = print_preview_new.State.NOT_READY;
+      header.state = print_preview.State.NOT_READY;
       assertEquals('', summary.textContent.trim());
 
-      header.state = print_preview_new.State.PRINTING;
+      header.state = print_preview.State.PRINTING;
       assertEquals(
           loadTimeData.getString('printing'), summary.textContent.trim());
       setPdfDestination();
       assertEquals(
           loadTimeData.getString('saving'), summary.textContent.trim());
 
-      header.state = print_preview_new.State.ERROR;
+      header.state = print_preview.State.ERROR;
       assertEquals('', summary.textContent.trim());
 
       const testError = 'Error printing to cloud print';
       header.cloudPrintErrorMessage = testError;
-      header.error = print_preview_new.Error.CLOUD_PRINT_ERROR;
-      header.state = print_preview_new.State.FATAL_ERROR;
+      header.error = print_preview.Error.CLOUD_PRINT_ERROR;
+      header.state = print_preview.State.FATAL_ERROR;
       assertEquals(testError, summary.textContent.trim());
     });
 
diff --git a/chrome/test/data/webui/print_preview/header_test.js b/chrome/test/data/webui/print_preview/header_test.js
index 842d850..189c2db4 100644
--- a/chrome/test/data/webui/print_preview/header_test.js
+++ b/chrome/test/data/webui/print_preview/header_test.js
@@ -37,7 +37,7 @@
           'FooDevice', print_preview.DestinationType.GOOGLE,
           print_preview.DestinationOrigin.COOKIES, 'FooName',
           print_preview.DestinationConnectionStatus.ONLINE);
-      header.state = print_preview_new.State.READY;
+      header.state = print_preview.State.READY;
       header.managed = false;
       test_util.fakeDataBind(model, header, 'settings');
       document.body.appendChild(header);
@@ -101,31 +101,31 @@
       assertEquals('Total: 1 sheet of paper', summary.textContent);
       assertFalse(printButton.disabled);
 
-      header.state = print_preview_new.State.NOT_READY;
+      header.state = print_preview.State.NOT_READY;
       assertEquals('', summary.textContent);
       assertTrue(printButton.disabled);
 
-      header.state = print_preview_new.State.PRINTING;
+      header.state = print_preview.State.PRINTING;
       assertEquals(loadTimeData.getString('printing'), summary.textContent);
       assertTrue(printButton.disabled);
       setPdfDestination();
       assertEquals(loadTimeData.getString('saving'), summary.textContent);
 
-      header.error = print_preview_new.Error.INVALID_TICKET;
-      header.state = print_preview_new.State.ERROR;
+      header.error = print_preview.Error.INVALID_TICKET;
+      header.state = print_preview.State.ERROR;
       assertEquals('', summary.textContent);
       assertTrue(printButton.disabled);
 
-      header.state = print_preview_new.State.READY;
-      header.error = print_preview_new.Error.INVALID_PRINTER;
-      header.state = print_preview_new.State.ERROR;
+      header.state = print_preview.State.READY;
+      header.error = print_preview.Error.INVALID_PRINTER;
+      header.state = print_preview.State.ERROR;
       assertEquals('', summary.textContent);
       assertTrue(printButton.disabled);
 
       const testError = 'Error printing to cloud print';
       header.cloudPrintErrorMessage = testError;
-      header.error = print_preview_new.Error.CLOUD_PRINT_ERROR;
-      header.state = print_preview_new.State.FATAL_ERROR;
+      header.error = print_preview.Error.CLOUD_PRINT_ERROR;
+      header.state = print_preview.State.FATAL_ERROR;
       assertEquals(testError, summary.textContent);
       assertTrue(printButton.disabled);
     });
diff --git a/chrome/test/data/webui/print_preview/invalid_settings_browsertest.js b/chrome/test/data/webui/print_preview/invalid_settings_browsertest.js
index 51ca6dd7..006be23 100644
--- a/chrome/test/data/webui/print_preview/invalid_settings_browsertest.js
+++ b/chrome/test/data/webui/print_preview/invalid_settings_browsertest.js
@@ -71,7 +71,7 @@
       }
       const pluginProxy = new print_preview.PDFPluginStub();
       pluginProxy.setPluginCompatible(pluginCompatible);
-      print_preview_new.PluginProxy.setInstance(pluginProxy);
+      print_preview.PluginProxy.setInstance(pluginProxy);
 
       page = document.createElement('print-preview-app');
       document.body.appendChild(page);
@@ -115,7 +115,7 @@
       return nativeLayer.whenCalled('getInitialSettings').then(function() {
         const overlayEl = previewArea.$$('.preview-area-overlay-layer');
         const messageEl = previewArea.$$('.preview-area-message');
-        assertEquals(print_preview_new.State.FATAL_ERROR, page.state);
+        assertEquals(print_preview.State.FATAL_ERROR, page.state);
 
         // Make sure the overlay is visible.
         assertFalse(overlayEl.classList.contains('invisible'));
@@ -184,7 +184,7 @@
             // FooDevice was set as an invalid printer.
             assertFalse(overlay.classList.contains('invisible'));
             assertTrue(messageEl.textContent.includes(expectedMessage));
-            assertEquals(print_preview_new.State.ERROR, page.state);
+            assertEquals(print_preview.State.ERROR, page.state);
 
             // Verify that the print button is disabled
             assertTrue(printButton.disabled);
@@ -209,7 +209,7 @@
 
             // Has active print button and successfully 'prints', indicating
             assertFalse(printButton.disabled);
-            assertEquals(print_preview_new.State.READY, page.state);
+            assertEquals(print_preview.State.READY, page.state);
             printButton.click();
             // This should result in a call to print.
             return nativeLayer.whenCalled('print');
@@ -303,7 +303,7 @@
 
             // Verify the state is invalid and that some settings sections are
             // also disabled, so there is no way to regenerate the preview.
-            assertEquals(print_preview_new.State.ERROR, page.state);
+            assertEquals(print_preview.State.ERROR, page.state);
             assertTrue(layoutSettings.$$('select').disabled);
             assertTrue(scalingSettings.$$('cr-input').disabled);
 
@@ -323,7 +323,7 @@
           .then(function() {
             // Has active print button, indicating recovery from error state.
             assertFalse(printButton.disabled);
-            assertEquals(print_preview_new.State.READY, page.state);
+            assertEquals(print_preview.State.READY, page.state);
 
             // Settings sections are now active.
             assertFalse(layoutSettings.$$('select').disabled);
@@ -385,7 +385,7 @@
               .then(function() {
                 // Has active print button.
                 assertFalse(printButton.disabled);
-                assertEquals(print_preview_new.State.READY, page.state);
+                assertEquals(print_preview.State.READY, page.state);
                 // No error message.
                 assertTrue(overlayEl.classList.contains('invisible'));
 
@@ -400,7 +400,7 @@
               .then(function() {
                 // Should have error message.
                 assertFalse(overlayEl.classList.contains('invisible'));
-                assertEquals(print_preview_new.State.ERROR, page.state);
+                assertEquals(print_preview.State.ERROR, page.state);
 
                 // Reset
                 nativeLayer.reset();
diff --git a/chrome/test/data/webui/print_preview/key_event_test.js b/chrome/test/data/webui/print_preview/key_event_test.js
index f062c37..d8a2909 100644
--- a/chrome/test/data/webui/print_preview/key_event_test.js
+++ b/chrome/test/data/webui/print_preview/key_event_test.js
@@ -37,7 +37,7 @@
       nativeLayer.setPageCount(3);
       print_preview.NativeLayer.setInstance(nativeLayer);
       const pluginProxy = new print_preview.PDFPluginStub();
-      print_preview_new.PluginProxy.setInstance(pluginProxy);
+      print_preview.PluginProxy.setInstance(pluginProxy);
 
       PolymerTest.clearBody();
       page = document.createElement('print-preview-app');
diff --git a/chrome/test/data/webui/print_preview/model_settings_availability_test.js b/chrome/test/data/webui/print_preview/model_settings_availability_test.js
index c6f310d8..78f30d5 100644
--- a/chrome/test/data/webui/print_preview/model_settings_availability_test.js
+++ b/chrome/test/data/webui/print_preview/model_settings_availability_test.js
@@ -453,8 +453,7 @@
               .capabilities;
       delete capabilities.printer.duplex;
       capabilities.printer.duplex = {
-        option:
-            [{type: print_preview_new.DuplexType.NO_DUPLEX, is_default: true}]
+        option: [{type: print_preview.DuplexType.NO_DUPLEX, is_default: true}]
       };
       model.set('destination.capabilities', capabilities);
       assertFalse(model.settings.duplex.available);
@@ -467,8 +466,8 @@
       delete capabilities.printer.duplex;
       capabilities.printer.duplex = {
         option: [
-          {type: print_preview_new.DuplexType.NO_DUPLEX},
-          {type: print_preview_new.DuplexType.LONG_EDGE, is_default: true}
+          {type: print_preview.DuplexType.NO_DUPLEX},
+          {type: print_preview.DuplexType.LONG_EDGE, is_default: true}
         ]
       };
       model.set('destination.capabilities', capabilities);
diff --git a/chrome/test/data/webui/print_preview/model_test.js b/chrome/test/data/webui/print_preview/model_test.js
index 547db4e..1fb3e04 100644
--- a/chrome/test/data/webui/print_preview/model_test.js
+++ b/chrome/test/data/webui/print_preview/model_test.js
@@ -270,7 +270,7 @@
         color: testDestination.getNativeColorModel(true),
         headerFooterEnabled: false,  // Only used in print preview
         marginsType: print_preview.ticket_items.MarginsTypeValue.DEFAULT,
-        duplex: print_preview_new.DuplexMode.SIMPLEX,
+        duplex: print_preview.DuplexMode.SIMPLEX,
         copies: 1,
         collate: true,
         shouldPrintBackgrounds: false,
@@ -305,7 +305,7 @@
         color: testDestination.getNativeColorModel(false),
         headerFooterEnabled: false,
         marginsType: print_preview.ticket_items.MarginsTypeValue.CUSTOM,
-        duplex: print_preview_new.DuplexMode.SHORT_EDGE,
+        duplex: print_preview.DuplexMode.SHORT_EDGE,
         copies: 2,
         collate: false,
         shouldPrintBackgrounds: true,
diff --git a/chrome/test/data/webui/print_preview/pin_settings_test.js b/chrome/test/data/webui/print_preview/pin_settings_test.js
index 53fbdc51..7acca87 100644
--- a/chrome/test/data/webui/print_preview/pin_settings_test.js
+++ b/chrome/test/data/webui/print_preview/pin_settings_test.js
@@ -22,7 +22,7 @@
 
       pinSection = document.createElement('print-preview-pin-settings');
       pinSection.settings = model.settings;
-      pinSection.state = print_preview_new.State.READY;
+      pinSection.state = print_preview.State.READY;
       pinSection.disabled = false;
       test_util.fakeDataBind(model, pinSection, 'settings');
       document.body.appendChild(pinSection);
diff --git a/chrome/test/data/webui/print_preview/plugin_stub.js b/chrome/test/data/webui/print_preview/plugin_stub.js
index 09676cf..54f82c0 100644
--- a/chrome/test/data/webui/print_preview/plugin_stub.js
+++ b/chrome/test/data/webui/print_preview/plugin_stub.js
@@ -45,7 +45,7 @@
      * Sets the load callback to imitate the plugin.
      * @param {number} previewUid The unique ID of the preview UI.
      * @param {number} index The preview index to load.
-     * @return {?print_preview_new.PDFPlugin}
+     * @return {?print_preview.PDFPlugin}
      */
     createPlugin(previewUid, index) {
       return null;
diff --git a/chrome/test/data/webui/print_preview/policy_test.js b/chrome/test/data/webui/print_preview/policy_test.js
index 8cfe178..5b6f913 100644
--- a/chrome/test/data/webui/print_preview/policy_test.js
+++ b/chrome/test/data/webui/print_preview/policy_test.js
@@ -29,7 +29,7 @@
       nativeLayer.setPageCount(3);
       print_preview.NativeLayer.setInstance(nativeLayer);
       const pluginProxy = new print_preview.PDFPluginStub();
-      print_preview_new.PluginProxy.setInstance(pluginProxy);
+      print_preview.PluginProxy.setInstance(pluginProxy);
 
       PolymerTest.clearBody();
       page = document.createElement('print-preview-app');
diff --git a/chrome/test/data/webui/print_preview/preview_generation_test.js b/chrome/test/data/webui/print_preview/preview_generation_test.js
index e0a0821..002b09c 100644
--- a/chrome/test/data/webui/print_preview/preview_generation_test.js
+++ b/chrome/test/data/webui/print_preview/preview_generation_test.js
@@ -53,7 +53,7 @@
           print_preview_test_utils.getCddTemplate(initialSettings.printerName));
       nativeLayer.setPageCount(3);
       const pluginProxy = new print_preview.PDFPluginStub();
-      print_preview_new.PluginProxy.setInstance(pluginProxy);
+      print_preview.PluginProxy.setInstance(pluginProxy);
 
       page = document.createElement('print-preview-app');
       document.body.appendChild(page);
diff --git a/chrome/test/data/webui/print_preview/print_button_test.js b/chrome/test/data/webui/print_preview/print_button_test.js
index 6b92945..58e38a0 100644
--- a/chrome/test/data/webui/print_preview/print_button_test.js
+++ b/chrome/test/data/webui/print_preview/print_button_test.js
@@ -45,7 +45,7 @@
 
       const pluginProxy = new print_preview.PDFPluginStub();
       pluginProxy.setPluginCompatible(true);
-      print_preview_new.PluginProxy.setInstance(pluginProxy);
+      print_preview.PluginProxy.setInstance(pluginProxy);
 
       page = document.createElement('print-preview-app');
       document.body.appendChild(page);
diff --git a/chrome/test/data/webui/print_preview/print_header_interactive_test.js b/chrome/test/data/webui/print_preview/print_header_interactive_test.js
index e31bad25..f6d4110 100644
--- a/chrome/test/data/webui/print_preview/print_header_interactive_test.js
+++ b/chrome/test/data/webui/print_preview/print_header_interactive_test.js
@@ -29,7 +29,7 @@
           'FooDevice', print_preview.DestinationType.GOOGLE,
           print_preview.DestinationOrigin.COOKIES, 'FooName',
           print_preview.DestinationConnectionStatus.ONLINE);
-      header.state = print_preview_new.State.NOT_READY;
+      header.state = print_preview.State.NOT_READY;
       test_util.fakeDataBind(model, header, 'settings');
       document.body.appendChild(header);
     });
@@ -42,7 +42,7 @@
       const whenFocusDone = test_util.eventToPromise('focus', printButton);
 
       // Simulate initialization finishing.
-      header.state = print_preview_new.State.READY;
+      header.state = print_preview.State.READY;
       return whenFocusDone;
     });
   });
diff --git a/chrome/test/data/webui/print_preview/print_preview_app_test.js b/chrome/test/data/webui/print_preview/print_preview_app_test.js
index 645321d..1e4e222 100644
--- a/chrome/test/data/webui/print_preview/print_preview_app_test.js
+++ b/chrome/test/data/webui/print_preview/print_preview_app_test.js
@@ -52,7 +52,7 @@
       cloudPrintInterface = new print_preview.CloudPrintInterfaceStub();
       cloudprint.setCloudPrintInterfaceForTesting(cloudPrintInterface);
       pluginProxy = new print_preview.PDFPluginStub();
-      print_preview_new.PluginProxy.setInstance(pluginProxy);
+      print_preview.PluginProxy.setInstance(pluginProxy);
 
       page = document.createElement('print-preview-app');
       document.body.appendChild(page);
@@ -90,7 +90,7 @@
 
       // Send preset values of duplex LONG_EDGE and 2 copies.
       const copies = 2;
-      const duplex = print_preview_new.DuplexMode.LONG_EDGE;
+      const duplex = print_preview.DuplexMode.LONG_EDGE;
       cr.webUIListenerCallback('print-preset-options', true, copies, duplex);
       assertEquals(copies, page.getSettingValue('copies'));
       assertTrue(page.getSettingValue('duplex'));
diff --git a/chrome/test/data/webui/print_preview/print_preview_test_utils.js b/chrome/test/data/webui/print_preview/print_preview_test_utils.js
index a047807..23aab7b 100644
--- a/chrome/test/data/webui/print_preview/print_preview_test_utils.js
+++ b/chrome/test/data/webui/print_preview/print_preview_test_utils.js
@@ -265,7 +265,7 @@
 
   /**
    * Returns a media size capability with custom and localized names.
-   * @return {!{ option: Array<!print_preview_new.SelectOption> }}
+   * @return {!{ option: Array<!print_preview.SelectOption> }}
    */
   function getMediaSizeCapabilityWithCustomNames() {
     const customLocalizedMediaName = 'Vendor defined localized media name';
diff --git a/chrome/test/data/webui/print_preview/restore_state_test.js b/chrome/test/data/webui/print_preview/restore_state_test.js
index 4f5d11e..abd52b52 100644
--- a/chrome/test/data/webui/print_preview/restore_state_test.js
+++ b/chrome/test/data/webui/print_preview/restore_state_test.js
@@ -26,7 +26,7 @@
     });
 
     /**
-     * @param {!print_preview_new.SerializedSettings} stickySettings Settings
+     * @param {!print_preview.SerializedSettings} stickySettings Settings
      *     to verify.
      */
     function verifyStickySettingsApplied(stickySettings) {
@@ -66,7 +66,7 @@
     }
 
     /**
-     * @param {!print_preview_new.SerializedSettings} stickySettings
+     * @param {!print_preview.SerializedSettings} stickySettings
      * @return {!Promise} Promise that resolves when initialization is done and
      *     settings have been verified.
      */
@@ -78,7 +78,7 @@
           print_preview_test_utils.getCddTemplateWithAdvancedSettings(
               2, initialSettings.printerName));
       const pluginProxy = new print_preview.PDFPluginStub();
-      print_preview_new.PluginProxy.setInstance(pluginProxy);
+      print_preview.PluginProxy.setInstance(pluginProxy);
 
       page = document.createElement('print-preview-app');
       document.body.appendChild(page);
diff --git a/chrome/test/data/webui/print_preview/select_behavior_test.js b/chrome/test/data/webui/print_preview/select_behavior_test.js
index 4d8166e..97d35e24 100644
--- a/chrome/test/data/webui/print_preview/select_behavior_test.js
+++ b/chrome/test/data/webui/print_preview/select_behavior_test.js
@@ -32,7 +32,7 @@
 
       Polymer({
         is: 'test-select',
-        behaviors: [print_preview_new.SelectBehavior],
+        behaviors: [print_preview.SelectBehavior],
 
         onProcessSelectChange: function(value) {
           settingValue = value;
diff --git a/chrome/test/data/webui/print_preview/system_dialog_browsertest.js b/chrome/test/data/webui/print_preview/system_dialog_browsertest.js
index c30d85d..2192250 100644
--- a/chrome/test/data/webui/print_preview/system_dialog_browsertest.js
+++ b/chrome/test/data/webui/print_preview/system_dialog_browsertest.js
@@ -38,7 +38,7 @@
       nativeLayer.setLocalDestinationCapabilities(
           print_preview_test_utils.getCddTemplate(initialSettings.printerName));
       const pluginProxy = new print_preview.PDFPluginStub();
-      print_preview_new.PluginProxy.setInstance(pluginProxy);
+      print_preview.PluginProxy.setInstance(pluginProxy);
 
       const page = document.createElement('print-preview-app');
       document.body.appendChild(page);
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn
index b497d4c2a..0fd62a0b 100644
--- a/chromecast/browser/BUILD.gn
+++ b/chromecast/browser/BUILD.gn
@@ -383,6 +383,7 @@
     deps += [
       "//components/exo",
       "//components/exo/wayland",
+      "//services/viz/privileged/interfaces/compositing",
       "//ui/display/manager",
     ]
   }
diff --git a/chromecast/browser/exo/DEPS b/chromecast/browser/exo/DEPS
index c0058eb..fab8d50 100644
--- a/chromecast/browser/exo/DEPS
+++ b/chromecast/browser/exo/DEPS
@@ -1,3 +1,4 @@
 include_rules = [
-  "+components/exo"
+  "+components/exo",
+  "+services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom.h",
 ]
diff --git a/chromecast/browser/exo/wm_helper_cast_shell.cc b/chromecast/browser/exo/wm_helper_cast_shell.cc
index cdfb4cd..f6fd4d0 100644
--- a/chromecast/browser/exo/wm_helper_cast_shell.cc
+++ b/chromecast/browser/exo/wm_helper_cast_shell.cc
@@ -27,10 +27,7 @@
     : cast_window_manager_aura_(cast_window_manager_aura),
       env_(env),
       cast_screen_(cast_screen),
-      vsync_manager_(cast_window_manager_aura->GetRootWindow()
-                         ->layer()
-                         ->GetCompositor()
-                         ->vsync_manager()) {
+      vsync_timing_manager_(this) {
   cast_screen_->AddObserver(&display_observer_);
 }
 
@@ -78,14 +75,8 @@
   aura::client::SetDragDropDelegate(window, nullptr);
 }
 
-void WMHelperCastShell::AddVSyncObserver(
-    ui::CompositorVSyncManager::Observer* observer) {
-  vsync_manager_->AddObserver(observer);
-}
-
-void WMHelperCastShell::RemoveVSyncObserver(
-    ui::CompositorVSyncManager::Observer* observer) {
-  vsync_manager_->RemoveObserver(observer);
+VSyncTimingManager& WMHelperCastShell::GetVSyncTimingManager() {
+  return vsync_timing_manager_;
 }
 
 void WMHelperCastShell::OnDragEntered(const ui::DropTargetEvent& event) {}
@@ -102,6 +93,14 @@
   return ui::DragDropTypes::DRAG_MOVE;
 }
 
+void WMHelperCastShell::AddVSyncParameterObserver(
+    viz::mojom::VSyncParameterObserverPtr observer) {
+  cast_window_manager_aura_->GetRootWindow()
+      ->layer()
+      ->GetCompositor()
+      ->AddVSyncObserver(std::move(observer));
+}
+
 const display::ManagedDisplayInfo& WMHelperCastShell::GetDisplayInfo(
     int64_t display_id) const {
   return display_observer_.GetDisplayInfo(display_id);
diff --git a/chromecast/browser/exo/wm_helper_cast_shell.h b/chromecast/browser/exo/wm_helper_cast_shell.h
index 1f28771..feb9c3b 100644
--- a/chromecast/browser/exo/wm_helper_cast_shell.h
+++ b/chromecast/browser/exo/wm_helper_cast_shell.h
@@ -11,10 +11,10 @@
 
 #include "base/macros.h"
 #include "base/observer_list.h"
+#include "components/exo/vsync_timing_manager.h"
 #include "components/exo/wm_helper.h"
 #include "ui/aura/client/drag_drop_delegate.h"
 #include "ui/base/cursor/cursor.h"
-#include "ui/compositor/compositor_vsync_manager.h"
 #include "ui/display/display_observer.h"
 
 namespace aura {
@@ -55,7 +55,7 @@
 
 // A CastShell-specific helper class for accessing WindowManager related
 // features.
-class WMHelperCastShell : public WMHelper {
+class WMHelperCastShell : public WMHelper, public VSyncTimingManager::Delegate {
  public:
   WMHelperCastShell(aura::Env* env,
                     chromecast::CastWindowManagerAura* cast_window_manager_aura,
@@ -75,10 +75,7 @@
   void RemoveDragDropObserver(DragDropObserver* observer) override;
   void SetDragDropDelegate(aura::Window*) override;
   void ResetDragDropDelegate(aura::Window*) override;
-  void AddVSyncObserver(
-      ui::CompositorVSyncManager::Observer* observer) override;
-  void RemoveVSyncObserver(
-      ui::CompositorVSyncManager::Observer* observer) override;
+  VSyncTimingManager& GetVSyncTimingManager() override;
 
   const display::ManagedDisplayInfo& GetDisplayInfo(
       int64_t display_id) const override;
@@ -107,6 +104,10 @@
   void OnDragExited() override;
   int OnPerformDrop(const ui::DropTargetEvent& event) override;
 
+  // Overridden from VSyncTimingManager::Delegate:
+  void AddVSyncParameterObserver(
+      viz::mojom::VSyncParameterObserverPtr observer) override;
+
  private:
   class CastDisplayObserver : public display::DisplayObserver {
    public:
@@ -132,11 +133,11 @@
   chromecast::CastScreen* cast_screen_;
   CastDisplayObserver display_observer_;
   LifetimeManager lifetime_manager_;
-  scoped_refptr<ui::CompositorVSyncManager> vsync_manager_;
+  VSyncTimingManager vsync_timing_manager_;
 
   DISALLOW_COPY_AND_ASSIGN(WMHelperCastShell);
 };
 
 }  // namespace exo
 
-#endif  // CHROMECAST_BROWSER_EXO_EM_HELPER_CAST_SHELL_H_
+#endif  // CHROMECAST_BROWSER_EXO_WM_HELPER_CAST_SHELL_H_
diff --git a/chromecast/media/cma/decoder/cast_audio_decoder.cc b/chromecast/media/cma/decoder/cast_audio_decoder.cc
index aef70d6..4a69169 100644
--- a/chromecast/media/cma/decoder/cast_audio_decoder.cc
+++ b/chromecast/media/cma/decoder/cast_audio_decoder.cc
@@ -220,7 +220,7 @@
     decode_queue_.pop();
   }
 
-  void OnDecoderOutput(const scoped_refptr<::media::AudioBuffer>& decoded) {
+  void OnDecoderOutput(scoped_refptr<::media::AudioBuffer> decoded) {
     if (decoded->sample_rate() != config_.samples_per_second) {
       LOG(WARNING) << "sample_rate changed to " << decoded->sample_rate()
                    << " from " << config_.samples_per_second;
@@ -233,7 +233,7 @@
       decoded_bus_.reset();
     }
 
-    decoded_chunks_.push_back(decoded);
+    decoded_chunks_.push_back(std::move(decoded));
   }
 
   scoped_refptr<media::DecoderBufferBase> ConvertDecoded() {
diff --git a/chromeos/components/proximity_auth/unlock_manager_impl.cc b/chromeos/components/proximity_auth/unlock_manager_impl.cc
index b6f0fe8..52f4922 100644
--- a/chromeos/components/proximity_auth/unlock_manager_impl.cc
+++ b/chromeos/components/proximity_auth/unlock_manager_impl.cc
@@ -113,15 +113,13 @@
       proximity_auth_client_(proximity_auth_client),
       pref_manager_(pref_manager),
       is_attempting_auth_(false),
-      is_waking_up_(false),
+      is_performing_initial_scan_(false),
       screenlock_state_(ScreenlockState::INACTIVE),
-      clear_waking_up_state_weak_ptr_factory_(this),
+      initial_scan_timeout_weak_ptr_factory_(this),
       reject_auth_attempt_weak_ptr_factory_(this),
       weak_ptr_factory_(this) {
   chromeos::PowerManagerClient::Get()->AddObserver(this);
 
-  SetWakingUpState(true /* is_waking_up */);
-
   if (device::BluetoothAdapterFactory::IsBluetoothSupported()) {
     device::BluetoothAdapterFactory::GetAdapter(
         base::BindOnce(&UnlockManagerImpl::OnBluetoothAdapterInitialized,
@@ -155,6 +153,9 @@
 
 void UnlockManagerImpl::SetRemoteDeviceLifeCycle(
     RemoteDeviceLifeCycle* life_cycle) {
+  PA_LOG(VERBOSE) << "Request received to change scan state to: "
+                  << (life_cycle == nullptr ? "inactive" : "active") << ".";
+
   if (GetMessenger())
     GetMessenger()->RemoveObserver(this);
 
@@ -164,7 +165,7 @@
         base::DefaultClock::GetInstance()->Now();
 
     AttemptToStartRemoteDeviceLifecycle();
-    SetWakingUpState(true /* is_waking_up */);
+    SetIsPerformingInitialScan(true /* is_performing_initial_scan */);
   } else {
     ResetPerformanceMetricsTimestamps();
 
@@ -199,7 +200,7 @@
   }
 
   if (state == RemoteDeviceLifeCycle::State::AUTHENTICATION_FAILED)
-    SetWakingUpState(false /* is_waking_up */);
+    SetIsPerformingInitialScan(false /* is_performing_initial_scan */);
 
   UpdateLockScreen();
 }
@@ -233,7 +234,7 @@
       GetScreenlockStateFromRemoteUpdate(status_update)));
 
   // This also calls |UpdateLockScreen()|
-  SetWakingUpState(false /* is_waking_up */);
+  SetIsPerformingInitialScan(false /* is_performing_initial_scan */);
 }
 
 void UnlockManagerImpl::OnDecryptResponse(const std::string& decrypted_bytes) {
@@ -314,7 +315,7 @@
 }
 
 void UnlockManagerImpl::SuspendDone(const base::TimeDelta& sleep_duration) {
-  SetWakingUpState(true /* is_waking_up */);
+  SetIsPerformingInitialScan(true /* is_performing_initial_scan */);
 }
 
 bool UnlockManagerImpl::IsBluetoothPresentAndPowered() const {
@@ -383,7 +384,7 @@
 }
 
 void UnlockManagerImpl::CancelConnectionAttempt() {
-  SetWakingUpState(false /* is_waking_up */);
+  SetIsPerformingInitialScan(false /* is_performing_initial_scan */);
 }
 
 std::unique_ptr<ProximityMonitor> UnlockManagerImpl::CreateProximityMonitor(
@@ -441,14 +442,14 @@
   if (life_cycle_state == RemoteDeviceLifeCycle::State::AUTHENTICATION_FAILED)
     return ScreenlockState::PHONE_NOT_AUTHENTICATED;
 
-  if (is_waking_up_)
+  if (is_performing_initial_scan_)
     return ScreenlockState::BLUETOOTH_CONNECTING;
 
   Messenger* messenger = GetMessenger();
 
   // Show a timeout state if we can not connect to the remote device in a
   // reasonable amount of time.
-  if (!is_waking_up_ && !messenger)
+  if (!is_performing_initial_scan_ && !messenger)
     return ScreenlockState::NO_PHONE;
 
   if (screenlock_type_ == ProximityAuthSystem::SIGN_IN && messenger &&
@@ -509,23 +510,30 @@
   screenlock_state_ = new_state;
 }
 
-void UnlockManagerImpl::SetWakingUpState(bool is_waking_up) {
-  is_waking_up_ = is_waking_up;
+void UnlockManagerImpl::SetIsPerformingInitialScan(
+    bool is_performing_initial_scan) {
+  PA_LOG(VERBOSE) << "Initial scan state is ["
+                  << (is_performing_initial_scan_ ? "active" : "inactive")
+                  << "]. Requesting state ["
+                  << (is_performing_initial_scan ? "active" : "inactive")
+                  << "].";
+
+  is_performing_initial_scan_ = is_performing_initial_scan;
 
   // Clear the waking up state after a timeout.
-  clear_waking_up_state_weak_ptr_factory_.InvalidateWeakPtrs();
-  if (is_waking_up_) {
+  initial_scan_timeout_weak_ptr_factory_.InvalidateWeakPtrs();
+  if (is_performing_initial_scan_) {
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE,
-        base::BindOnce(&UnlockManagerImpl::OnConnectionAttemptTimeOut,
-                       clear_waking_up_state_weak_ptr_factory_.GetWeakPtr()),
+        base::BindOnce(&UnlockManagerImpl::OnInitialScanTimeout,
+                       initial_scan_timeout_weak_ptr_factory_.GetWeakPtr()),
         kWakingUpDuration);
   }
 
   UpdateLockScreen();
 }
 
-void UnlockManagerImpl::OnConnectionAttemptTimeOut() {
+void UnlockManagerImpl::OnInitialScanTimeout() {
   if (IsBluetoothPresentAndPowered()) {
     if (life_cycle_ &&
         life_cycle_->GetState() ==
@@ -549,7 +557,7 @@
   }
 
   PA_LOG(INFO) << "Failed to connect to host within allotted time.";
-  SetWakingUpState(false /* is_waking_up */);
+  SetIsPerformingInitialScan(false /* is_performing_initial_scan */);
 }
 
 void UnlockManagerImpl::FinalizeAuthAttempt(
diff --git a/chromeos/components/proximity_auth/unlock_manager_impl.h b/chromeos/components/proximity_auth/unlock_manager_impl.h
index 1671320..c393339 100644
--- a/chromeos/components/proximity_auth/unlock_manager_impl.h
+++ b/chromeos/components/proximity_auth/unlock_manager_impl.h
@@ -125,8 +125,9 @@
   // current state of |this| unlock manager.
   void UpdateProximityMonitorState();
 
-  // Sets waking up state.
-  void SetWakingUpState(bool is_waking_up);
+  // Sets if the "initial scan" is in progress. This state factors into what is
+  // shown to the user. See |is_performing_initial_scan_| for more.
+  void SetIsPerformingInitialScan(bool is_performing_initial_scan);
 
   // Accepts or rejects the current auth attempt according to |error|. Accepts
   // if and only if |error| is empty. If the auth attempt is accepted, unlocks
@@ -135,8 +136,9 @@
       const base::Optional<
           SmartLockMetricsRecorder::SmartLockAuthResultFailureReason>& error);
 
-  // Failed to create a connection to the host.
-  void OnConnectionAttemptTimeOut();
+  // Failed to create a connection to the host during the "initial scan". See
+  // |is_performing_initial_scan_| for more.
+  void OnInitialScanTimeout();
 
   // Returns the screen lock state corresponding to the given remote |status|
   // update.
@@ -180,8 +182,14 @@
   // attempt, which is initiated when the user pod is clicked.
   bool is_attempting_auth_;
 
-  // Whether the system is waking up from sleep.
-  bool is_waking_up_;
+  // If true, either the lock screen was just shown (after resuming from
+  // suspend, or directly locking the screen), or the focused user pod was
+  // switched. It becomes false if the phone is found, something goes wrong
+  // while searching for the phone, or the initial scan times out (at which
+  // point the user visually sees an indication that the phone cannot be found).
+  // Though this field becomes false after this timeout, Smart Lock continues
+  // to scan for the phone until the user unlocks the screen.
+  bool is_performing_initial_scan_;
 
   // The Bluetooth adapter. Null if there is no adapter present on the local
   // device.
@@ -204,9 +212,10 @@
   // RemoteDeviceLifeCycle, and begins to try to fetch its "remote status".
   base::Time attempt_get_remote_status_start_time_;
 
-  // Used to clear the waking up state after a timeout.
+  // Used to track if the "initial scan" has timed out. See
+  // |is_performing_initial_scan_| for more.
   base::WeakPtrFactory<UnlockManagerImpl>
-      clear_waking_up_state_weak_ptr_factory_;
+      initial_scan_timeout_weak_ptr_factory_;
 
   // Used to reject auth attempts after a timeout. An in-progress auth attempt
   // blocks the sign-in screen UI, so it's important to prevent the auth attempt
diff --git a/chromeos/network/BUILD.gn b/chromeos/network/BUILD.gn
index d762e37..b04dd1e 100644
--- a/chromeos/network/BUILD.gn
+++ b/chromeos/network/BUILD.gn
@@ -18,6 +18,7 @@
     "//chromeos/dbus/permission_broker",
     "//chromeos/dbus/shill",
     "//chromeos/login/login_state",
+    "//chromeos/services/network_config/public/mojom",
     "//components/account_id",
     "//components/certificate_matching",
     "//components/device_event_log",
diff --git a/chromeos/network/DEPS b/chromeos/network/DEPS
index 3ff0236a..db836558 100644
--- a/chromeos/network/DEPS
+++ b/chromeos/network/DEPS
@@ -7,6 +7,7 @@
   "+chromeos/test",
   "+chromeos/dbus",
   "+chromeos/login/login_state",
+  "+chromeos/services/network_config/public",
   "+components/account_id",
   "+components/certificate_matching",
   "+components/device_event_log",
diff --git a/chromeos/network/network_state.cc b/chromeos/network/network_state.cc
index af3f7e3..3bdd774 100644
--- a/chromeos/network/network_state.cc
+++ b/chromeos/network/network_state.cc
@@ -522,6 +522,40 @@
   return last_error();
 }
 
+network_config::mojom::ActivationStateType
+NetworkState::GetMojoActivationState() const {
+  using network_config::mojom::ActivationStateType;
+  if (activation_state_.empty())
+    return ActivationStateType::kUnknown;
+  if (activation_state_ == shill::kActivationStateActivated)
+    return ActivationStateType::kActivated;
+  if (activation_state_ == shill::kActivationStateActivating)
+    return ActivationStateType::kActivating;
+  if (activation_state_ == shill::kActivationStateNotActivated)
+    return ActivationStateType::kNotActivated;
+  if (activation_state_ == shill::kActivationStatePartiallyActivated)
+    return ActivationStateType::kPartiallyActivated;
+  NET_LOG(ERROR) << "Unexpected shill activation state: " << activation_state_;
+  return ActivationStateType::kUnknown;
+}
+
+network_config::mojom::SecurityType NetworkState::GetMojoSecurity() const {
+  using network_config::mojom::SecurityType;
+  if (security_class_.empty() || security_class_ == shill::kSecurityNone)
+    return SecurityType::kNone;
+  if (IsDynamicWep())
+    return SecurityType::kWep8021x;
+
+  if (security_class_ == shill::kSecurityWep)
+    return SecurityType::kWepPsk;
+  if (security_class_ == shill::kSecurityPsk)
+    return SecurityType::kWpaPsk;
+  if (security_class_ == shill::kSecurity8021x)
+    return SecurityType::kWpaEap;
+  NET_LOG(ERROR) << "Unsupported shill security class: " << security_class_;
+  return SecurityType::kNone;
+}
+
 // static
 bool NetworkState::StateIsConnected(const std::string& connection_state) {
   return (connection_state == shill::kStateReady ||
diff --git a/chromeos/network/network_state.h b/chromeos/network/network_state.h
index 4d83d8b..96ff747 100644
--- a/chromeos/network/network_state.h
+++ b/chromeos/network/network_state.h
@@ -14,6 +14,7 @@
 #include "base/macros.h"
 #include "base/values.h"
 #include "chromeos/network/managed_state.h"
+#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
 #include "components/onc/onc_constants.h"
 #include "url/gurl.h"
 
@@ -215,6 +216,10 @@
   // Returns |error_| if valid, otherwise returns |last_error_|.
   std::string GetErrorState() const;
 
+  // Helpers for returning mojo types.
+  network_config::mojom::ActivationStateType GetMojoActivationState() const;
+  network_config::mojom::SecurityType GetMojoSecurity() const;
+
   // Setters for testing.
   void set_connection_state_for_testing(const std::string& connection_state) {
     connection_state_ = connection_state;
diff --git a/chromeos/network/onc/onc_utils.cc b/chromeos/network/onc/onc_utils.cc
index bfcb059..907057b4 100644
--- a/chromeos/network/onc/onc_utils.cc
+++ b/chromeos/network/onc/onc_utils.cc
@@ -1031,7 +1031,8 @@
     it->GetAsDictionary(&network);
     if (!ResolveServerCertRefsInNetwork(certs_by_guid, network)) {
       std::string guid;
-      network->GetStringWithoutPathExpansion(network_config::kGUID, &guid);
+      network->GetStringWithoutPathExpansion(::onc::network_config::kGUID,
+                                             &guid);
       // This might happen even with correct validation, if the referenced
       // certificate couldn't be imported.
       LOG(ERROR) << "Couldn't resolve some certificate reference of network "
diff --git a/chromeos/printing/ppd_provider.cc b/chromeos/printing/ppd_provider.cc
index fc8a4f6..9edf7d17 100644
--- a/chromeos/printing/ppd_provider.cc
+++ b/chromeos/printing/ppd_provider.cc
@@ -18,6 +18,7 @@
 #include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/json/json_parser.h"
+#include "base/no_destructor.h"
 #include "base/optional.h"
 #include "base/sequenced_task_runner.h"
 #include "base/strings/string_number_conversions.h"
@@ -51,6 +52,11 @@
 
 const char kEpsonGenericPPD[] = "epson generic escpr printer";
 
+struct UsbVendorPair {
+  int vendor_id;
+  const char* vendor_name;
+};
+
 // Holds a metadata_v2 reverse-index response
 struct ReverseIndexJSON {
   // Canonical name of printer
@@ -360,6 +366,32 @@
   });
 }
 
+// TODO(crbug.com/953968): Implement network lookup to PPD server to get the USB
+// manufacturer.
+const std::unordered_map<int, std::string>& GetVendorIdMap() {
+  static base::NoDestructor<std::unordered_map<int, std::string>> keys(
+      {{0x05ac, "Apple"},
+       {0x04f9, "Brother"},
+       {0x04a9, "Canon"},
+       {0x049f, "Compaq"},
+       {0x413c, "Dell"},
+       {0x04b8, "Epson"},
+       {0x0550, "Fuji Xerox"},
+       {0x03f0, "HP"},
+       {0x040a, "Kodak"},
+       {0x0482, "Kyocera"},
+       {0x043d, "LexMark"},
+       {0x0409, "NEC"},
+       {0x06bc, "Oki"},
+       {0x04da, "Panasonic"},
+       {0x05ca, "Ricoh"},
+       {0x04e8, "Samsung"},
+       {0x04dd, "Sharp"},
+       {0x0930, "Toshiba"},
+       {0x0924, "Xerox"}});
+  return *keys;
+}
+
 class PpdProviderImpl : public PpdProvider {
  public:
   // What kind of thing is the fetcher currently fetching?  We use this to
@@ -434,12 +466,8 @@
           if (base::ContainsKey(cached_ppd_idxs_[ppd_index_shard],
                                 make_and_model)) {
             // Found a hit, satisfy this resolution.
-            Printer::PpdReference ret;
-            ret.effective_make_and_model = make_and_model;
-            base::SequencedTaskRunnerHandle::Get()->PostTask(
-                FROM_HERE,
-                base::BindOnce(std::move(next.cb), PpdProvider::SUCCESS, ret));
-            ppd_reference_resolution_queue_.pop_front();
+            RunPpdReferenceResolutionSucceeded(std::move(next.cb),
+                                               make_and_model);
             resolved_next = true;
             break;
           }
@@ -460,20 +488,12 @@
       // If possible, here we fall back to OEM designated generic PPDs.
       if (CanUseEpsonGenericPPD(search_data)) {
         // Found a hit, satisfy this resolution.
-        Printer::PpdReference ret;
-        ret.effective_make_and_model = kEpsonGenericPPD;
-        base::SequencedTaskRunnerHandle::Get()->PostTask(
-            FROM_HERE,
-            base::BindOnce(std::move(next.cb), PpdProvider::SUCCESS, ret));
-        ppd_reference_resolution_queue_.pop_front();
-      } else {
-        // We don't have anything else left to try.  NOT_FOUND it is.
-        base::SequencedTaskRunnerHandle::Get()->PostTask(
-            FROM_HERE,
-            base::BindOnce(std::move(next.cb), PpdProvider::NOT_FOUND,
-                           Printer::PpdReference()));
-        ppd_reference_resolution_queue_.pop_front();
+        RunPpdReferenceResolutionSucceeded(std::move(next.cb),
+                                           kEpsonGenericPPD);
       }
+      // We don't have anything else left to try. We've reached unsupported USB
+      // printer, try to grab the manufacturer name.
+      ResolveUsbManufacturer(std::move(next.cb), search_data.usb_vendor_id);
     }
     // Didn't start any fetches.
     return false;
@@ -1085,13 +1105,8 @@
       }
     }
     if (result == PpdProvider::SUCCESS) {
-      Printer::PpdReference ret;
-      ret.effective_make_and_model = contents;
-      base::SequencedTaskRunnerHandle::Get()->PostTask(
-          FROM_HERE,
-          base::BindOnce(std::move(ppd_reference_resolution_queue_.front().cb),
-                         result, std::move(ret)));
-      ppd_reference_resolution_queue_.pop_front();
+      RunPpdReferenceResolutionSucceeded(
+          std::move(ppd_reference_resolution_queue_.front().cb), contents);
     } else {
       ppd_reference_resolution_queue_.front().usb_resolution_attempted = true;
     }
@@ -1131,8 +1146,10 @@
     // so should also be failed.
     auto task_runner = base::SequencedTaskRunnerHandle::Get();
     for (auto& entry : ppd_reference_resolution_queue_) {
-      task_runner->PostTask(FROM_HERE, base::BindOnce(std::move(entry.cb), code,
-                                                      Printer::PpdReference()));
+      task_runner->PostTask(
+          FROM_HERE,
+          base::BindOnce(std::move(entry.cb), code, Printer::PpdReference(),
+                         "" /* usb_manufacturer */));
     }
     ppd_reference_resolution_queue_.clear();
   }
@@ -1469,6 +1486,18 @@
     return ret;
   }
 
+  void ResolveUsbManufacturer(ResolvePpdReferenceCallback cb, int vendor_id) {
+    std::string manufacturer;
+    if (base::ContainsKey(GetVendorIdMap(), vendor_id)) {
+      manufacturer = GetVendorIdMap().at(vendor_id);
+    } else {
+      LOG(ERROR) << "Unable to find vendor_id: " << vendor_id;
+    }
+    // This look up is done asynchronously since we will later be using a server
+    // look up for the manufacturer name.
+    RunPpdReferenceResolutionNotFound(std::move(cb), manufacturer);
+  }
+
   void PostReverseLookupFailure(CallbackResultCode result,
                                 ReverseLookupCallback cb) {
     base::SequencedTaskRunnerHandle::Get()->PostTask(
@@ -1476,6 +1505,31 @@
         base::BindOnce(std::move(cb), result, std::string(), std::string()));
   }
 
+  // Helper function that runs |cb| with the PpdProvider::SUCCESS as the result.
+  void RunPpdReferenceResolutionSucceeded(ResolvePpdReferenceCallback cb,
+                                          const std::string& make_and_model) {
+    DCHECK(!ppd_reference_resolution_queue_.empty());
+
+    Printer::PpdReference ret;
+    ret.effective_make_and_model = make_and_model;
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(cb), PpdProvider::SUCCESS, ret,
+                                  "" /* usb_manufacturer */));
+    ppd_reference_resolution_queue_.pop_front();
+  }
+
+  // Helper function that runs |cb| with the PpdProvider::NOT_FOUND as the
+  // result.
+  void RunPpdReferenceResolutionNotFound(ResolvePpdReferenceCallback cb,
+                                         const std::string& manufacturer) {
+    DCHECK(!ppd_reference_resolution_queue_.empty());
+
+    base::SequencedTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(cb), PpdProvider::NOT_FOUND,
+                                  Printer::PpdReference(), manufacturer));
+    ppd_reference_resolution_queue_.pop_front();
+  }
+
   // The hash function to calculate the hash of canonical identifiers to the
   // name of the ppd file for that printer.
   int IndexShard(std::string effective_make_and_model) {
diff --git a/chromeos/printing/ppd_provider.h b/chromeos/printing/ppd_provider.h
index b868579..51baa82a 100644
--- a/chromeos/printing/ppd_provider.h
+++ b/chromeos/printing/ppd_provider.h
@@ -149,14 +149,16 @@
   using ResolvePrintersCallback =
       base::OnceCallback<void(CallbackResultCode, const ResolvedPrintersList&)>;
 
-  // Result of a ResolvePpdReference call.  If the result code is
-  // SUCCESS, then the second argument contains the a PpdReference
-  // that we have high confidence can be used to obtain a driver for
-  // the printer.  NOT_FOUND means we couldn't confidently figure out
-  // a driver for the printer.
+  // Result of a ResolvePpdReference call.  If the result code is SUCCESS, then
+  // the second argument contains the a PpdReference that we have high
+  // confidence can be used to obtain a driver for the printer.  NOT_FOUND means
+  // we couldn't confidently figure out a driver for the printer.  If we got
+  // NOT_FOUND from a USB printer, we may have been able to determine the
+  // manufacturer name which is the third argument.
   using ResolvePpdReferenceCallback =
       base::OnceCallback<void(CallbackResultCode,
-                              const Printer::PpdReference&)>;
+                              const Printer::PpdReference& ref,
+                              const std::string& manufacturer)>;
 
   // Result of a ReverseLookup call.  If the result code is SUCCESS, then
   // |manufactuer| and |model| contain the strings that could have generated
diff --git a/chromeos/printing/ppd_provider_unittest.cc b/chromeos/printing/ppd_provider_unittest.cc
index 98458214..96c0ede 100644
--- a/chromeos/printing/ppd_provider_unittest.cc
+++ b/chromeos/printing/ppd_provider_unittest.cc
@@ -2,6 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "chromeos/printing/ppd_provider.h"
+
 #include <algorithm>
 #include <map>
 #include <memory>
@@ -22,7 +24,6 @@
 #include "base/version.h"
 #include "chromeos/constants/chromeos_paths.h"
 #include "chromeos/printing/ppd_cache.h"
-#include "chromeos/printing/ppd_provider.h"
 #include "chromeos/printing/printer_configuration.h"
 #include "net/base/net_errors.h"
 #include "net/url_request/url_request_test_util.h"
@@ -152,8 +153,9 @@
 
   // Capture the result of a ResolveUsbIds() call.
   void CaptureResolvePpdReference(PpdProvider::CallbackResultCode code,
-                                  const Printer::PpdReference& ref) {
-    captured_resolve_ppd_references_.push_back({code, ref});
+                                  const Printer::PpdReference& ref,
+                                  const std::string& usb_manufacturer) {
+    captured_resolve_ppd_references_.push_back({code, ref, usb_manufacturer});
   }
 
   void CaptureReverseLookup(PpdProvider::CallbackResultCode code,
@@ -239,6 +241,7 @@
              [1592, "Some canonical reference"],
              [6535, "Some other canonical reference"]
             ])"},
+            {"metadata_v2/usb-03f0.json", ""},
             {"metadata_v2/usb-1234.json", ""},
             {"metadata_v2/manufacturers-en.json",
              R"([
@@ -315,7 +318,13 @@
   };
   std::vector<CapturedResolvePpdResults> captured_resolve_ppd_;
 
-  std::vector<std::pair<PpdProvider::CallbackResultCode, Printer::PpdReference>>
+  struct CapturedResolvePpdReferenceResults {
+    PpdProvider::CallbackResultCode code;
+    Printer::PpdReference ref;
+    std::string usb_manufacturer;
+  };
+
+  std::vector<CapturedResolvePpdReferenceResults>
       captured_resolve_ppd_references_;
 
   struct CapturedReverseLookup {
@@ -416,15 +425,13 @@
   scoped_task_environment_.RunUntilIdle();
 
   ASSERT_EQ(static_cast<size_t>(3), captured_resolve_ppd_references_.size());
-  EXPECT_EQ(PpdProvider::NOT_FOUND, captured_resolve_ppd_references_[0].first);
-  EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_references_[1].first);
-  EXPECT_EQ(
-      "printer_a_ref",
-      captured_resolve_ppd_references_[1].second.effective_make_and_model);
-  EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_references_[2].first);
-  EXPECT_EQ(
-      "printer_a_ref",
-      captured_resolve_ppd_references_[2].second.effective_make_and_model);
+  EXPECT_EQ(PpdProvider::NOT_FOUND, captured_resolve_ppd_references_[0].code);
+  EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_references_[1].code);
+  EXPECT_EQ("printer_a_ref",
+            captured_resolve_ppd_references_[1].ref.effective_make_and_model);
+  EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_references_[2].code);
+  EXPECT_EQ("printer_a_ref",
+            captured_resolve_ppd_references_[2].ref.effective_make_and_model);
 }
 
 // Test successful and unsuccessful usb resolutions.
@@ -447,15 +454,15 @@
       search_data, base::BindOnce(&PpdProviderTest::CaptureResolvePpdReference,
                                   base::Unretained(this)));
 
-  // Extant vendor id, nonexistant device id, should get a NOT_FOUND
+  // Vendor id that exists, nonexistent device id, should get a NOT_FOUND.
   search_data.usb_vendor_id = 0x031f;
   search_data.usb_product_id = 8162;
   provider->ResolvePpdReference(
       search_data, base::BindOnce(&PpdProviderTest::CaptureResolvePpdReference,
                                   base::Unretained(this)));
 
-  // Nonexistant vendor id, should get a NOT_FOUND in the real world, but
-  // the URL interceptor we're using considers all nonexistant files to
+  // Nonexistent vendor id, should get a NOT_FOUND in the real world, but
+  // the URL interceptor we're using considers all nonexistent files to
   // be effectively CONNECTION REFUSED, so we just check for non-success
   // on this one.
   search_data.usb_vendor_id = 0x1234;
@@ -466,14 +473,14 @@
   scoped_task_environment_.RunUntilIdle();
 
   ASSERT_EQ(captured_resolve_ppd_references_.size(), static_cast<size_t>(4));
-  EXPECT_EQ(captured_resolve_ppd_references_[0].first, PpdProvider::SUCCESS);
-  EXPECT_EQ(captured_resolve_ppd_references_[0].second.effective_make_and_model,
+  EXPECT_EQ(captured_resolve_ppd_references_[0].code, PpdProvider::SUCCESS);
+  EXPECT_EQ(captured_resolve_ppd_references_[0].ref.effective_make_and_model,
             "Some canonical reference");
-  EXPECT_EQ(captured_resolve_ppd_references_[1].first, PpdProvider::SUCCESS);
-  EXPECT_EQ(captured_resolve_ppd_references_[1].second.effective_make_and_model,
+  EXPECT_EQ(captured_resolve_ppd_references_[1].code, PpdProvider::SUCCESS);
+  EXPECT_EQ(captured_resolve_ppd_references_[1].ref.effective_make_and_model,
             "Some other canonical reference");
-  EXPECT_EQ(captured_resolve_ppd_references_[2].first, PpdProvider::NOT_FOUND);
-  EXPECT_FALSE(captured_resolve_ppd_references_[3].first ==
+  EXPECT_EQ(captured_resolve_ppd_references_[2].code, PpdProvider::NOT_FOUND);
+  EXPECT_FALSE(captured_resolve_ppd_references_[3].code ==
                PpdProvider::SUCCESS);
 }
 
@@ -751,10 +758,9 @@
 
   // Check PpdProvider::ResolvePpdReference
   ASSERT_EQ(1UL, captured_resolve_ppd_references_.size());
-  EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_references_[0].first);
-  EXPECT_EQ(
-      "printer_a_ref",
-      captured_resolve_ppd_references_[0].second.effective_make_and_model);
+  EXPECT_EQ(PpdProvider::SUCCESS, captured_resolve_ppd_references_[0].code);
+  EXPECT_EQ("printer_a_ref",
+            captured_resolve_ppd_references_[0].ref.effective_make_and_model);
 }
 
 // Verifies that we can extract the Manufacturer and Model selectison for a
@@ -942,5 +948,48 @@
   EXPECT_EQ(captured_find_result.contents, disk_ppd_contents);
 }
 
+// Test resolving usb manufacturer when failed to resolve PpdReference.
+TEST_F(PpdProviderTest, ResolveUsbManufacturer) {
+  StartFakePpdServer();
+  auto provider = CreateProvider("en", false);
+
+  PrinterSearchData search_data;
+
+  // Vendor id that exists, nonexistent device id, should get a NOT_FOUND.
+  // Although this is an unsupported printer model, we can still expect to get
+  // the manufacturer name.
+  search_data.usb_vendor_id = 0x03f0;
+  search_data.usb_product_id = 9999;
+  provider->ResolvePpdReference(
+      search_data, base::BindOnce(&PpdProviderTest::CaptureResolvePpdReference,
+                                  base::Unretained(this)));
+
+  // Nonexistent vendor id, should get a NOT_FOUND in the real world, but
+  // the URL interceptor we're using considers all nonexistent files to
+  // be effectively CONNECTION REFUSED, so we just check for non-success
+  // on this one. We should also not be able to get a manufacturer name from a
+  // nonexistent vendor id.
+  search_data.usb_vendor_id = 0x1234;
+  search_data.usb_product_id = 1782;
+  provider->ResolvePpdReference(
+      search_data, base::BindOnce(&PpdProviderTest::CaptureResolvePpdReference,
+                                  base::Unretained(this)));
+  scoped_task_environment_.RunUntilIdle();
+
+  ASSERT_EQ(static_cast<size_t>(2), captured_resolve_ppd_references_.size());
+  // Was able to find the printer manufactuer but unable to find the printer
+  // model should result in a NOT_FOUND.
+  EXPECT_EQ(PpdProvider::NOT_FOUND, captured_resolve_ppd_references_[0].code);
+  // Failed to grab the PPD for a USB printer, but should still be able to grab
+  // its manufacturer name.
+  EXPECT_EQ("HP", captured_resolve_ppd_references_[0].usb_manufacturer);
+
+  // Unable to find the PPD file should result in a failure.
+  EXPECT_FALSE(captured_resolve_ppd_references_[1].code ==
+               PpdProvider::SUCCESS);
+  // Unknown vendor id should result in an empty manufacturer string.
+  EXPECT_TRUE(captured_resolve_ppd_references_[1].usb_manufacturer.empty());
+}
+
 }  // namespace
 }  // namespace chromeos
diff --git a/chromeos/printing/printer_translator.cc b/chromeos/printing/printer_translator.cc
index a4abf4a5..33a7706 100644
--- a/chromeos/printing/printer_translator.cc
+++ b/chromeos/printing/printer_translator.cc
@@ -199,6 +199,7 @@
     // entire host/path/query block is the printer address for USB.
     printer_info->SetString("printerAddress",
                             printer.uri().substr(strlen("usb://")));
+    printer_info->SetString("ppdManufacturer", printer.manufacturer());
   } else {
     printer_info->SetString("printerAddress",
                             PrinterAddress(uri.host(), uri.port()));
diff --git a/chromeos/services/network_config/BUILD.gn b/chromeos/services/network_config/BUILD.gn
index 7d31ac3..b7e14024 100644
--- a/chromeos/services/network_config/BUILD.gn
+++ b/chromeos/services/network_config/BUILD.gn
@@ -15,6 +15,7 @@
   deps = [
     "//base",
     "//chromeos/network",
+    "//chromeos/services/network_config/public/cpp",
     "//chromeos/services/network_config/public/mojom",
     "//components/device_event_log",
     "//components/onc",
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc
index 27befc26..e399dd1 100644
--- a/chromeos/services/network_config/cros_network_config.cc
+++ b/chromeos/services/network_config/cros_network_config.cc
@@ -9,6 +9,7 @@
 #include "chromeos/network/network_state_handler.h"
 #include "chromeos/network/network_type_pattern.h"
 #include "chromeos/network/onc/onc_translation_tables.h"
+#include "chromeos/services/network_config/public/cpp/cros_network_config_util.h"
 #include "chromeos/services/network_config/public/mojom/cros_network_config_mojom_traits.h"
 #include "components/device_event_log/device_event_log.h"
 #include "third_party/cros_system_api/dbus/service_constants.h"
@@ -81,19 +82,6 @@
   return mojom::ConnectionStateType::kNotConnected;
 }
 
-mojom::ActivationStateType ShillActivationStateToMojo(
-    const std::string& shill_state) {
-  if (shill_state == shill::kActivationStateActivated)
-    return mojom::ActivationStateType::kActivated;
-  if (shill_state == shill::kActivationStateActivating)
-    return mojom::ActivationStateType::kActivating;
-  if (shill_state == shill::kActivationStateNotActivated)
-    return mojom::ActivationStateType::kNotActivated;
-  if (shill_state == shill::kActivationStatePartiallyActivated)
-    return mojom::ActivationStateType::kPartiallyActivated;
-  return mojom::ActivationStateType::kUnknown;
-}
-
 mojom::VPNType ShillVpnTypeToMojo(const std::string& shill_vpn_type) {
   if (shill_vpn_type == shill::kProviderL2tpIpsec)
     return mojom::VPNType::kL2TPIPsec;
@@ -107,21 +95,6 @@
   return mojom::VPNType::kOpenVPN;
 }
 
-mojom::SecurityType ShillSecurityToMojo(const std::string& shill_security) {
-  if (shill_security.empty() || shill_security == shill::kSecurityNone)
-    return mojom::SecurityType::kNone;
-  if (shill_security == shill::kSecurityWep)
-    return mojom::SecurityType::kWepPsk;
-  if (shill_security == shill::kSecurityPsk)
-    return mojom::SecurityType::kWpaPsk;
-  if (shill_security == shill::kSecurity8021x)
-    return mojom::SecurityType::kWpaEap;
-  if (shill_security == shill::kSecurityWep)
-    return mojom::SecurityType::kWep8021x;
-  NOTREACHED() << "Unsupported shill security: " << shill_security;
-  return mojom::SecurityType::kNone;
-}
-
 base::Optional<mojom::DeviceStateType> GetMojoDeviceStateType(
     NetworkStateHandler::TechnologyState technology_state) {
   switch (technology_state) {
@@ -167,8 +140,7 @@
   switch (type) {
     case mojom::NetworkType::kCellular: {
       auto cellular = mojom::CellularStateProperties::New();
-      cellular->activation_state =
-          ShillActivationStateToMojo(network->activation_state());
+      cellular->activation_state = network->GetMojoActivationState();
       cellular->network_technology = ShillToONC(network->network_technology(),
                                                 onc::kNetworkTechnologyTable);
       cellular->roaming = network->IndicateRoaming();
@@ -221,7 +193,7 @@
       wifi->bssid = network->bssid();
       wifi->frequency = network->frequency();
       wifi->hex_ssid = network->GetHexSsid();
-      wifi->security = ShillSecurityToMojo(network->security_class());
+      wifi->security = network->GetMojoSecurity();
       wifi->signal_strength = network->signal_strength();
       wifi->ssid = network->name();
       result->wifi = std::move(wifi);
diff --git a/chromeos/services/network_config/public/cpp/BUILD.gn b/chromeos/services/network_config/public/cpp/BUILD.gn
index b3cd2a0..faf0522 100644
--- a/chromeos/services/network_config/public/cpp/BUILD.gn
+++ b/chromeos/services/network_config/public/cpp/BUILD.gn
@@ -4,6 +4,17 @@
 
 assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos")
 
+source_set("cpp") {
+  sources = [
+    "cros_network_config_util.cc",
+    "cros_network_config_util.h",
+  ]
+
+  deps = [
+    "//chromeos/services/network_config/public/mojom",
+  ]
+}
+
 source_set("manifest") {
   sources = [
     "manifest.cc",
@@ -20,6 +31,10 @@
 source_set("test_support") {
   testonly = true
 
+  public_deps = [
+    ":cpp",
+  ]
+
   sources = [
     "cros_network_config_test_helper.cc",
     "cros_network_config_test_helper.h",
diff --git a/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h b/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h
index 24438ce..571821f 100644
--- a/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h
+++ b/chromeos/services/network_config/public/cpp/cros_network_config_test_helper.h
@@ -42,6 +42,7 @@
   mojom::CrosNetworkConfig* service_interface_ptr() {
     return service_interface_ptr_.get();
   }
+  service_manager::Connector* connector() { return connector_.get(); }
   CrosNetworkConfigTestObserver* observer() { return observer_.get(); }
 
   void FlushForTesting();
diff --git a/chromeos/services/network_config/public/cpp/cros_network_config_util.cc b/chromeos/services/network_config/public/cpp/cros_network_config_util.cc
new file mode 100644
index 0000000..b7c97c5
--- /dev/null
+++ b/chromeos/services/network_config/public/cpp/cros_network_config_util.cc
@@ -0,0 +1,47 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chromeos/services/network_config/public/cpp/cros_network_config_util.h"
+
+namespace chromeos {
+namespace network_config {
+
+bool NetworkStateMatchesType(const mojom::NetworkStateProperties* network,
+                             mojom::NetworkType type) {
+  switch (type) {
+    case mojom::NetworkType::kAll:
+      return true;
+    case mojom::NetworkType::kCellular:
+    case mojom::NetworkType::kEthernet:
+    case mojom::NetworkType::kTether:
+    case mojom::NetworkType::kVPN:
+    case mojom::NetworkType::kWiFi:
+    case mojom::NetworkType::kWiMAX:
+      return network->type == type;
+    case mojom::NetworkType::kWireless:
+      return network->type == mojom::NetworkType::kCellular ||
+             network->type == mojom::NetworkType::kTether ||
+             network->type == mojom::NetworkType::kWiFi ||
+             network->type == mojom::NetworkType::kWiMAX;
+  }
+  NOTREACHED();
+  return false;
+}
+
+bool StateIsConnected(mojom::ConnectionStateType connection_state) {
+  switch (connection_state) {
+    case mojom::ConnectionStateType::kOnline:
+    case mojom::ConnectionStateType::kConnected:
+    case mojom::ConnectionStateType::kPortal:
+      return true;
+    case mojom::ConnectionStateType::kConnecting:
+    case mojom::ConnectionStateType::kNotConnected:
+      return false;
+  }
+  NOTREACHED();
+  return false;
+}
+
+}  // namespace network_config
+}  // namespace chromeos
diff --git a/chromeos/services/network_config/public/cpp/cros_network_config_util.h b/chromeos/services/network_config/public/cpp/cros_network_config_util.h
new file mode 100644
index 0000000..0a4ef77
--- /dev/null
+++ b/chromeos/services/network_config/public/cpp/cros_network_config_util.h
@@ -0,0 +1,24 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_SERVICES_NETWORK_CONFIG_PUBLIC_CPP_CROS_NETWORK_CONFIG_UTIL_H_
+#define CHROMEOS_SERVICES_NETWORK_CONFIG_PUBLIC_CPP_CROS_NETWORK_CONFIG_UTIL_H_
+
+#include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
+
+namespace chromeos {
+namespace network_config {
+
+// Returns true if network->type matches |type|, which may include kAll or
+// kWireless.
+bool NetworkStateMatchesType(const mojom::NetworkStateProperties* network,
+                             mojom::NetworkType type);
+
+// Returns true if |connection_state| is in a connected state, including portal.
+bool StateIsConnected(mojom::ConnectionStateType connection_state);
+
+}  // namespace network_config
+}  // namespace chromeos
+
+#endif  // CHROMEOS_SERVICES_NETWORK_CONFIG_PUBLIC_CPP_CROS_NETWORK_CONFIG_UTIL_H_
diff --git a/chromeos/settings/cros_settings_names.cc b/chromeos/settings/cros_settings_names.cc
index e6e6cdf..d23a2ce 100644
--- a/chromeos/settings/cros_settings_names.cc
+++ b/chromeos/settings/cros_settings_names.cc
@@ -11,19 +11,16 @@
 // All cros.accounts.* settings are stored in SignedSettings.
 const char kAccountsPrefAllowGuest[] = "cros.accounts.allowBWSI";
 const char kAccountsPrefAllowNewUser[] = "cros.accounts.allowGuest";
-const char kAccountsPrefShowUserNamesOnSignIn[]
-    = "cros.accounts.showUserNamesOnSignIn";
+const char kAccountsPrefShowUserNamesOnSignIn[] =
+    "cros.accounts.showUserNamesOnSignIn";
 const char kAccountsPrefUsers[] = "cros.accounts.users";
 const char kAccountsPrefEphemeralUsersEnabled[] =
     "cros.accounts.ephemeralUsersEnabled";
 const char kAccountsPrefDeviceLocalAccounts[] =
     "cros.accounts.deviceLocalAccounts";
-const char kAccountsPrefDeviceLocalAccountsKeyId[] =
-    "id";
-const char kAccountsPrefDeviceLocalAccountsKeyType[] =
-    "type";
-const char kAccountsPrefDeviceLocalAccountsKeyKioskAppId[] =
-    "kiosk_app_id";
+const char kAccountsPrefDeviceLocalAccountsKeyId[] = "id";
+const char kAccountsPrefDeviceLocalAccountsKeyType[] = "type";
+const char kAccountsPrefDeviceLocalAccountsKeyKioskAppId[] = "kiosk_app_id";
 const char kAccountsPrefDeviceLocalAccountsKeyKioskAppUpdateURL[] =
     "kiosk_app_update_url";
 const char kAccountsPrefDeviceLocalAccountsKeyArcKioskPackage[] =
@@ -379,4 +376,10 @@
 // An enum pref that specifies the device dock MAC address source.
 const char kDeviceDockMacAddressSource[] =
     "cros.device.device_dock_mac_address_source";
+
+// A dictionary pref that mandates the recurring schedule for update checks. The
+// schedule is followed even if the device is suspended, however, it's not
+// respected when the device is shutdown.
+const char kDeviceScheduledUpdateCheck[] =
+    "cros.device.device_scheduled_update_check";
 }  // namespace chromeos
diff --git a/chromeos/settings/cros_settings_names.h b/chromeos/settings/cros_settings_names.h
index a7f9a31..68c04fb4 100644
--- a/chromeos/settings/cros_settings_names.h
+++ b/chromeos/settings/cros_settings_names.h
@@ -219,6 +219,9 @@
 COMPONENT_EXPORT(CHROMEOS_SETTINGS)
 extern const char kDeviceDockMacAddressSource[];
 
+COMPONENT_EXPORT(CHROMEOS_SETTINGS)
+extern const char kDeviceScheduledUpdateCheck[];
+
 }  // namespace chromeos
 
 #endif  // CHROMEOS_SETTINGS_CROS_SETTINGS_NAMES_H_
diff --git a/components/download/internal/background_service/controller_impl.cc b/components/download/internal/background_service/controller_impl.cc
index 2177e6a8..c93a1fdf 100644
--- a/components/download/internal/background_service/controller_impl.cc
+++ b/components/download/internal/background_service/controller_impl.cc
@@ -438,13 +438,8 @@
 
   download::Client* client = clients_->GetClient(entry->client);
   DCHECK(client);
-  using ShouldDownload = download::Client::ShouldDownload;
-  ShouldDownload should_download = client->OnDownloadStarted(
-      download.guid, download.url_chain, download.response_headers);
-  stats::LogStartDownloadResponse(entry->client, should_download);
-  if (should_download == ShouldDownload::ABORT) {
-    HandleCompleteDownload(CompletionType::ABORT, entry->guid);
-  }
+  client->OnDownloadStarted(download.guid, download.url_chain,
+                            download.response_headers);
 }
 
 void ControllerImpl::OnDownloadFailed(const DriverEntry& download,
diff --git a/components/download/internal/background_service/controller_impl_unittest.cc b/components/download/internal/background_service/controller_impl_unittest.cc
index 0cd66071..f1524e58 100644
--- a/components/download/internal/background_service/controller_impl_unittest.cc
+++ b/components/download/internal/background_service/controller_impl_unittest.cc
@@ -1221,23 +1221,20 @@
   Entry entry1 = test::BuildBasicEntry(Entry::State::ACTIVE);
   Entry entry2 = test::BuildBasicEntry(Entry::State::ACTIVE);
   Entry entry3 = test::BuildBasicEntry(Entry::State::ACTIVE);
-  Entry entry4 = test::BuildBasicEntry(Entry::State::ACTIVE);
-  entry4.scheduling_params.cancel_time = base::Time::Now();
-  std::vector<Entry> entries = {entry1, entry2, entry3, entry4};
+  entry3.scheduling_params.cancel_time = base::Time::Now();
+  std::vector<Entry> entries = {entry1, entry2, entry3};
 
   DriverEntry dentry1 =
       BuildDriverEntry(entry1, DriverEntry::State::IN_PROGRESS);
-  // dentry2 will effectively be created by the test to simulate a start
-  // download.
-  DriverEntry dentry3 =
-      BuildDriverEntry(entry3, DriverEntry::State::IN_PROGRESS);
-  driver_->AddTestData(std::vector<DriverEntry>{dentry1, dentry3});
+  DriverEntry dentry2 =
+      BuildDriverEntry(entry2, DriverEntry::State::IN_PROGRESS);
+  driver_->AddTestData(std::vector<DriverEntry>{dentry1, dentry2});
 
   EXPECT_CALL(*client_, OnServiceInitialized(false, _)).Times(1);
 
   // Test FailureReason::TIMEDOUT.
   EXPECT_CALL(*client_,
-              OnDownloadFailed(entry4.guid, _, Client::FailureReason::TIMEDOUT))
+              OnDownloadFailed(entry3.guid, _, Client::FailureReason::TIMEDOUT))
       .Times(1);
 
   // Set up the Controller.
@@ -1254,21 +1251,11 @@
       .Times(1);
   controller_->CancelDownload(entry1.guid);
 
-  // Test FailureReason::ABORTED.
-  EXPECT_CALL(*client_, OnDownloadStarted(entry2.guid, _, _))
-      .Times(1)
-      .WillOnce(Return(Client::ShouldDownload::ABORT));
-  EXPECT_CALL(*client_,
-              OnDownloadFailed(entry2.guid, _, Client::FailureReason::ABORTED))
-      .Times(1);
-  driver_->Start(RequestParams(), entry2.guid, entry2.target_file_path, nullptr,
-                 TRAFFIC_ANNOTATION_FOR_TESTS);
-
   // Test FailureReason::NETWORK.
   EXPECT_CALL(*client_,
-              OnDownloadFailed(entry3.guid, _, Client::FailureReason::NETWORK))
+              OnDownloadFailed(entry2.guid, _, Client::FailureReason::NETWORK))
       .Times(1);
-  driver_->NotifyDownloadFailed(dentry3, FailureType::NOT_RECOVERABLE);
+  driver_->NotifyDownloadFailed(dentry2, FailureType::NOT_RECOVERABLE);
 
   task_runner_->RunUntilIdle();
 }
diff --git a/components/download/internal/background_service/debugging_client.cc b/components/download/internal/background_service/debugging_client.cc
index 9bc4298..4c1879c0 100644
--- a/components/download/internal/background_service/debugging_client.cc
+++ b/components/download/internal/background_service/debugging_client.cc
@@ -17,12 +17,10 @@
 
 void DebuggingClient::OnServiceUnavailable() {}
 
-Client::ShouldDownload DebuggingClient::OnDownloadStarted(
+void DebuggingClient::OnDownloadStarted(
     const std::string& guid,
     const std::vector<GURL>& url_chain,
-    const scoped_refptr<const net::HttpResponseHeaders>& headers) {
-  return Client::ShouldDownload::CONTINUE;
-}
+    const scoped_refptr<const net::HttpResponseHeaders>& headers) {}
 
 void DebuggingClient::OnDownloadUpdated(const std::string& guid,
                                         uint64_t bytes_uploaded,
diff --git a/components/download/internal/background_service/debugging_client.h b/components/download/internal/background_service/debugging_client.h
index 74db9bf5..252c811 100644
--- a/components/download/internal/background_service/debugging_client.h
+++ b/components/download/internal/background_service/debugging_client.h
@@ -23,7 +23,7 @@
       bool state_lost,
       const std::vector<DownloadMetaData>& downloads) override;
   void OnServiceUnavailable() override;
-  ShouldDownload OnDownloadStarted(
+  void OnDownloadStarted(
       const std::string& guid,
       const std::vector<GURL>& url_chain,
       const scoped_refptr<const net::HttpResponseHeaders>& headers) override;
diff --git a/components/download/internal/background_service/stats.cc b/components/download/internal/background_service/stats.cc
index a5062f3..e2834aa5 100644
--- a/components/download/internal/background_service/stats.cc
+++ b/components/download/internal/background_service/stats.cc
@@ -221,19 +221,6 @@
                                 DownloadParams::StartResult::COUNT);
 }
 
-void LogStartDownloadResponse(DownloadClient client,
-                              Client::ShouldDownload should_download) {
-  // Total count for each start response.
-  std::string name("Download.Service.Request.StartResponse");
-  base::UmaHistogramEnumeration(name, should_download,
-                                Client::ShouldDownload::COUNT);
-
-  // Total count for each client response with client suffix.
-  name.append(".").append(ClientToHistogramSuffix(client));
-  base::UmaHistogramEnumeration(name, should_download,
-                                Client::ShouldDownload::COUNT);
-}
-
 void LogDownloadParams(const DownloadParams& params) {
   UMA_HISTOGRAM_ENUMERATION("Download.Service.Request.BatteryRequirement",
                             params.scheduling_params.battery_requirements,
diff --git a/components/download/internal/background_service/stats.h b/components/download/internal/background_service/stats.h
index 49de816..2961309 100644
--- a/components/download/internal/background_service/stats.h
+++ b/components/download/internal/background_service/stats.h
@@ -159,10 +159,6 @@
 void LogStartDownloadResult(DownloadClient client,
                             DownloadParams::StartResult result);
 
-// Logs the client response to StartDownload() attempt on the service.
-void LogStartDownloadResponse(DownloadClient client,
-                              download::Client::ShouldDownload should_download);
-
 // Logs the download parameters when StartDownload() is called.
 void LogDownloadParams(const DownloadParams& params);
 
diff --git a/components/download/public/background_service/BUILD.gn b/components/download/public/background_service/BUILD.gn
index 424ed0b..4317331 100644
--- a/components/download/public/background_service/BUILD.gn
+++ b/components/download/public/background_service/BUILD.gn
@@ -9,6 +9,7 @@
 
 source_set("public") {
   sources = [
+    "client.cc",
     "client.h",
     "clients.h",
     "download_metadata.cc",
diff --git a/components/download/public/background_service/client.cc b/components/download/public/background_service/client.cc
new file mode 100644
index 0000000..68f9120a
--- /dev/null
+++ b/components/download/public/background_service/client.cc
@@ -0,0 +1,22 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/download/public/background_service/client.h"
+
+namespace download {
+
+void Client::OnDownloadStarted(
+    const std::string& guid,
+    const std::vector<GURL>& url_chain,
+    const scoped_refptr<const net::HttpResponseHeaders>& headers) {}
+
+void Client::OnDownloadUpdated(const std::string& guid,
+                               uint64_t bytes_uploaded,
+                               uint64_t bytes_downloaded) {}
+
+void Client::OnDownloadFailed(const std::string& guid,
+                              const download::CompletionInfo& completion_info,
+                              download::Client::FailureReason reason) {}
+
+}  // namespace download
diff --git a/components/download/public/background_service/client.h b/components/download/public/background_service/client.h
index da5956c..1374d0d 100644
--- a/components/download/public/background_service/client.h
+++ b/components/download/public/background_service/client.h
@@ -30,19 +30,6 @@
 // when the DownloadService is created (see the factory).
 class Client {
  public:
-  // Used by OnDownloadStarted to determine whether or not the DownloadService
-  // should continue downloading the file or abort the attempt.
-  enum class ShouldDownload {
-    // Continue to download the file.
-    CONTINUE,
-
-    // Abort the download.
-    ABORT,
-
-    // The count of entries for the enum.
-    COUNT,
-  };
-
   // Used by OnDownloadFailed to determine the reason of the abort.
   enum class FailureReason {
     // Used when the download has been aborted after reaching a threshold where
@@ -88,13 +75,12 @@
   // Called when the DownloadService fails to initialize and should not be used.
   virtual void OnServiceUnavailable() = 0;
 
-  // Return whether or not the download should be aborted (potentially in
-  // response to |headers|).  The download will be downloading at the time this
-  // call is made.
-  virtual ShouldDownload OnDownloadStarted(
+  // Will be called when a download has been started and the headers have been
+  // retrieved. The download will be downloading at the time this call is made.
+  virtual void OnDownloadStarted(
       const std::string& guid,
       const std::vector<GURL>& url_chain,
-      const scoped_refptr<const net::HttpResponseHeaders>& headers) = 0;
+      const scoped_refptr<const net::HttpResponseHeaders>& headers);
 
   // Will be called when there is an update to the current progress state of the
   // underlying download.  Note that |bytes_downloaded| may go backwards if the
@@ -104,7 +90,7 @@
   // driver.
   virtual void OnDownloadUpdated(const std::string& guid,
                                  uint64_t bytes_uploaded,
-                                 uint64_t bytes_downloaded) = 0;
+                                 uint64_t bytes_downloaded);
 
   // Called when a download failed.  Check FailureReason for a list of possible
   // reasons why this failure occurred.  Note that this will also be called for
@@ -112,7 +98,7 @@
   // and response headers filled in if available.
   virtual void OnDownloadFailed(const std::string& guid,
                                 const download::CompletionInfo& info,
-                                FailureReason reason) = 0;
+                                FailureReason reason);
 
   // Called when a download has been successfully completed.
   // The file and the database record will be automatically removed if it is not
diff --git a/components/download/public/background_service/test/empty_client.cc b/components/download/public/background_service/test/empty_client.cc
index 9288908a..8a5146a 100644
--- a/components/download/public/background_service/test/empty_client.cc
+++ b/components/download/public/background_service/test/empty_client.cc
@@ -17,12 +17,10 @@
 
 void EmptyClient::OnServiceUnavailable() {}
 
-Client::ShouldDownload EmptyClient::OnDownloadStarted(
+void EmptyClient::OnDownloadStarted(
     const std::string& guid,
     const std::vector<GURL>& url_chain,
-    const scoped_refptr<const net::HttpResponseHeaders>& headers) {
-  return Client::ShouldDownload::CONTINUE;
-}
+    const scoped_refptr<const net::HttpResponseHeaders>& headers) {}
 
 void EmptyClient::OnDownloadUpdated(const std::string& guid,
                                     uint64_t bytes_uploaded,
diff --git a/components/download/public/background_service/test/empty_client.h b/components/download/public/background_service/test/empty_client.h
index d70577c..6d134d4a 100644
--- a/components/download/public/background_service/test/empty_client.h
+++ b/components/download/public/background_service/test/empty_client.h
@@ -22,7 +22,7 @@
       bool state_lost,
       const std::vector<DownloadMetaData>& downloads) override;
   void OnServiceUnavailable() override;
-  ShouldDownload OnDownloadStarted(
+  void OnDownloadStarted(
       const std::string& guid,
       const std::vector<GURL>& url_chain,
       const scoped_refptr<const net::HttpResponseHeaders>& headers) override;
diff --git a/components/download/public/background_service/test/mock_client.h b/components/download/public/background_service/test/mock_client.h
index 006951d3..c5721918 100644
--- a/components/download/public/background_service/test/mock_client.h
+++ b/components/download/public/background_service/test/mock_client.h
@@ -22,11 +22,10 @@
   MOCK_METHOD2(OnServiceInitialized,
                void(bool, const std::vector<DownloadMetaData>&));
   MOCK_METHOD0(OnServiceUnavailable, void());
-  MOCK_METHOD3(
-      OnDownloadStarted,
-      ShouldDownload(const std::string&,
-                     const std::vector<GURL>&,
-                     const scoped_refptr<const net::HttpResponseHeaders>&));
+  MOCK_METHOD3(OnDownloadStarted,
+               void(const std::string&,
+                    const std::vector<GURL>&,
+                    const scoped_refptr<const net::HttpResponseHeaders>&));
   MOCK_METHOD3(OnDownloadUpdated, void(const std::string&, uint64_t, uint64_t));
   MOCK_METHOD3(OnDownloadFailed,
                void(const std::string&, const CompletionInfo&, FailureReason));
diff --git a/components/exo/BUILD.gn b/components/exo/BUILD.gn
index 79e6af1..c0169bf 100644
--- a/components/exo/BUILD.gn
+++ b/components/exo/BUILD.gn
@@ -48,6 +48,8 @@
     "touch.cc",
     "touch.h",
     "touch_delegate.h",
+    "vsync_timing_manager.cc",
+    "vsync_timing_manager.h",
     "wm_helper.cc",
     "wm_helper.h",
   ]
@@ -60,6 +62,7 @@
     "//device/gamepad/public/cpp:shared_with_blink",
     "//gpu",
     "//gpu/command_buffer/client:raster_interface",
+    "//services/viz/privileged/interfaces/compositing",
     "//services/ws/public/mojom",
     "//skia",
     "//ui/aura",
diff --git a/components/exo/DEPS b/components/exo/DEPS
index 0ef6c813..c2cc5f2 100644
--- a/components/exo/DEPS
+++ b/components/exo/DEPS
@@ -7,6 +7,7 @@
   "+device/gamepad",
   "+gpu",
   "+mojo/public/cpp",
+  "+services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom.h",
   "+services/ws/public/mojom",
   "+third_party/khronos",
   "+third_party/skia",
diff --git a/components/exo/test/exo_test_base_aura.cc b/components/exo/test/exo_test_base_aura.cc
index 473f0cc..d28691d6 100644
--- a/components/exo/test/exo_test_base_aura.cc
+++ b/components/exo/test/exo_test_base_aura.cc
@@ -4,6 +4,7 @@
 
 #include "components/exo/test/exo_test_base_aura.h"
 
+#include "components/exo/vsync_timing_manager.h"
 #include "components/exo/wm_helper.h"
 #include "ui/base/ime/init/input_method_factory.h"
 #include "ui/compositor/test/context_factories_for_test.h"
@@ -16,10 +17,10 @@
 
 namespace {
 
-class WMHelperTester : public WMHelper {
+class WMHelperTester : public WMHelper, public VSyncTimingManager::Delegate {
  public:
   WMHelperTester(aura::Env* env, aura::Window* root_window)
-      : env_(env), root_window_(root_window) {}
+      : env_(env), root_window_(root_window), vsync_timing_manager_(this) {}
   ~WMHelperTester() override {}
 
   // Overridden from WMHelper
@@ -34,10 +35,9 @@
   void RemoveDragDropObserver(DragDropObserver* observer) override {}
   void SetDragDropDelegate(aura::Window*) override {}
   void ResetDragDropDelegate(aura::Window*) override {}
-  void AddVSyncObserver(
-      ui::CompositorVSyncManager::Observer* observer) override {}
-  void RemoveVSyncObserver(
-      ui::CompositorVSyncManager::Observer* observer) override {}
+  VSyncTimingManager& GetVSyncTimingManager() override {
+    return vsync_timing_manager_;
+  }
 
   const display::ManagedDisplayInfo& GetDisplayInfo(
       int64_t display_id) const override {
@@ -76,10 +76,15 @@
   void OnDragExited() override {}
   int OnPerformDrop(const ui::DropTargetEvent& event) override { return 0; }
 
+  // Overridden from VSyncTimingManager::Delegate:
+  void AddVSyncParameterObserver(
+      viz::mojom::VSyncParameterObserverPtr observer) override {}
+
  private:
   aura::Env* const env_;
   aura::Window* root_window_;
   LifetimeManager lifetime_manager_;
+  VSyncTimingManager vsync_timing_manager_;
 
   DISALLOW_COPY_AND_ASSIGN(WMHelperTester);
 };
diff --git a/components/exo/vsync_timing_manager.cc b/components/exo/vsync_timing_manager.cc
new file mode 100644
index 0000000..f0168ca
--- /dev/null
+++ b/components/exo/vsync_timing_manager.cc
@@ -0,0 +1,76 @@
+// Copyright 2019 The Chromium 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/exo/vsync_timing_manager.h"
+
+#include "base/stl_util.h"
+#include "base/threading/thread_task_runner_handle.h"
+
+namespace exo {
+
+VSyncTimingManager::VSyncTimingManager(Delegate* delegate)
+    : delegate_(delegate) {}
+
+VSyncTimingManager::~VSyncTimingManager() = default;
+
+void VSyncTimingManager::AddObserver(Observer* obs) {
+  DCHECK(obs);
+
+  // This is adding the first observer so start receiving IPCs.
+  if (observers_.empty())
+    InitializeConnection();
+
+  observers_.push_back(obs);
+}
+
+void VSyncTimingManager::RemoveObserver(Observer* obs) {
+  DCHECK(obs);
+
+  base::Erase(observers_, obs);
+
+  // There are no more observers so stop receiving IPCs.
+  if (observers_.empty())
+    binding_.Close();
+}
+
+void VSyncTimingManager::OnUpdateVSyncParameters(base::TimeTicks timebase,
+                                                 base::TimeDelta interval) {
+  for (auto* observer : observers_)
+    observer->OnUpdateVSyncParameters(timebase, interval);
+}
+
+void VSyncTimingManager::InitializeConnection() {
+  viz::mojom::VSyncParameterObserverPtr ptr;
+  binding_.Bind(MakeRequest(&ptr));
+
+  // Unretained is safe because |this| owns |binding_| and will outlive it.
+  binding_.set_connection_error_handler(base::BindOnce(
+      &VSyncTimingManager::OnConnectionError, base::Unretained(this)));
+
+  delegate_->AddVSyncParameterObserver(std::move(ptr));
+}
+
+void VSyncTimingManager::MaybeInitializeConnection() {
+  // The last observer might have been unregistered between when there was a
+  // connection error, in which case we don't need to reconnect. Alternatively,
+  // the last observer might have been unregistered and then a new observer
+  // registered, in which case we already reconnected.
+  if (!observers_.empty() || binding_.is_bound())
+    InitializeConnection();
+}
+
+void VSyncTimingManager::OnConnectionError() {
+  binding_.Close();
+
+  // Try to add a new observer after a short delay. If adding a new observer
+  // fails we'll retry again until successful. The delay avoids spamming
+  // retries.
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&VSyncTimingManager::MaybeInitializeConnection,
+                     weak_ptr_factory_.GetWeakPtr()),
+      base::TimeDelta::FromMilliseconds(250));
+}
+
+}  // namespace exo
diff --git a/components/exo/vsync_timing_manager.h b/components/exo/vsync_timing_manager.h
new file mode 100644
index 0000000..9153dd9
--- /dev/null
+++ b/components/exo/vsync_timing_manager.h
@@ -0,0 +1,68 @@
+// Copyright 2019 The Chromium 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_EXO_VSYNC_TIMING_MANAGER_H_
+#define COMPONENTS_EXO_VSYNC_TIMING_MANAGER_H_
+
+#include <vector>
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom.h"
+
+namespace exo {
+
+// Multiplexes vsync parameter updates from the display compositor to exo
+// clients using the zcr_vsync_feedback_v1 protocol. Will maintain an IPC
+// connection to the display compositor only when necessary.
+class VSyncTimingManager : public viz::mojom::VSyncParameterObserver {
+ public:
+  // Will be notified about changes in vsync parameters.
+  class Observer {
+   public:
+    virtual ~Observer() = default;
+
+    virtual void OnUpdateVSyncParameters(base::TimeTicks timebase,
+                                         base::TimeDelta interval) = 0;
+  };
+
+  // Used to setup IPC connection to display compositor.
+  class Delegate {
+   public:
+    virtual ~Delegate() = default;
+
+    virtual void AddVSyncParameterObserver(
+        viz::mojom::VSyncParameterObserverPtr observer) = 0;
+  };
+
+  explicit VSyncTimingManager(Delegate* delegate);
+  ~VSyncTimingManager() override;
+
+  void AddObserver(Observer* obs);
+  void RemoveObserver(Observer* obs);
+
+ private:
+  // Overridden from viz::mojom::VSyncParameterObserver:
+  void OnUpdateVSyncParameters(base::TimeTicks timebase,
+                               base::TimeDelta interval) override;
+
+  void InitializeConnection();
+  void MaybeInitializeConnection();
+  void OnConnectionError();
+
+  Delegate* const delegate_;
+
+  std::vector<Observer*> observers_;
+
+  mojo::Binding<viz::mojom::VSyncParameterObserver> binding_{this};
+
+  base::WeakPtrFactory<VSyncTimingManager> weak_ptr_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(VSyncTimingManager);
+};
+
+}  // namespace exo
+
+#endif  // COMPONENTS_EXO_VSYNC_TIMING_MANAGER_H_
diff --git a/components/exo/wayland/BUILD.gn b/components/exo/wayland/BUILD.gn
index c91a9ba..6bbab208 100644
--- a/components/exo/wayland/BUILD.gn
+++ b/components/exo/wayland/BUILD.gn
@@ -117,6 +117,7 @@
     "//components/exo",
     "//components/exo/wayland/protocol:aura_shell_protocol",
     "//device/gamepad",
+    "//services/viz/privileged/interfaces/compositing",
     "//services/viz/public/interfaces",
     "//skia",
     "//third_party/libsync",
diff --git a/components/exo/wayland/zcr_vsync_feedback.cc b/components/exo/wayland/zcr_vsync_feedback.cc
index 99d91de..c704c3216 100644
--- a/components/exo/wayland/zcr_vsync_feedback.cc
+++ b/components/exo/wayland/zcr_vsync_feedback.cc
@@ -6,6 +6,7 @@
 
 #include <vsync-feedback-unstable-v1-server-protocol.h>
 
+#include "components/exo/vsync_timing_manager.h"
 #include "components/exo/wayland/server_util.h"
 
 namespace exo {
@@ -16,63 +17,32 @@
 // vsync_timing_interface:
 
 // Implements VSync timing interface by monitoring updates to VSync parameters.
-class VSyncTiming final : public ui::CompositorVSyncManager::Observer {
+class VSyncTiming final : public VSyncTimingManager::Observer {
  public:
+  explicit VSyncTiming(wl_resource* timing_resource)
+      : timing_resource_(timing_resource) {
+    WMHelper::GetInstance()->GetVSyncTimingManager().AddObserver(this);
+  }
   ~VSyncTiming() override {
-    WMHelper::GetInstance()->RemoveVSyncObserver(this);
+    WMHelper::GetInstance()->GetVSyncTimingManager().RemoveObserver(this);
   }
 
-  static std::unique_ptr<VSyncTiming> Create(wl_resource* timing_resource) {
-    std::unique_ptr<VSyncTiming> vsync_timing(new VSyncTiming(timing_resource));
-    // Note: AddObserver() will call OnUpdateVSyncParameters.
-    WMHelper::GetInstance()->AddVSyncObserver(vsync_timing.get());
-    return vsync_timing;
-  }
-
-  // Overridden from ui::CompositorVSyncManager::Observer:
+  // Overridden from VSyncTimingManager::Observer:
   void OnUpdateVSyncParameters(base::TimeTicks timebase,
                                base::TimeDelta interval) override {
-    uint64_t timebase_us = timebase.ToInternalValue();
-    uint64_t interval_us = interval.ToInternalValue();
-
-    // Ignore updates with interval 0.
-    if (!interval_us)
-      return;
-
-    uint64_t offset_us = timebase_us % interval_us;
-
-    // Avoid sending update events if interval did not change.
-    if (interval_us == last_interval_us_) {
-      int64_t offset_delta_us =
-          static_cast<int64_t>(last_offset_us_ - offset_us);
-
-      // Reduce the amount of events by only sending an update if the offset
-      // changed compared to the last offset sent to the client by this amount.
-      const int64_t kOffsetDeltaThresholdInMicroseconds = 25;
-
-      if (std::abs(offset_delta_us) < kOffsetDeltaThresholdInMicroseconds)
-        return;
-    }
+    uint64_t timebase_us = timebase.since_origin().InMicroseconds();
+    uint64_t interval_us = interval.InMicroseconds();
 
     zcr_vsync_timing_v1_send_update(timing_resource_, timebase_us & 0xffffffff,
                                     timebase_us >> 32, interval_us & 0xffffffff,
                                     interval_us >> 32);
     wl_client_flush(wl_resource_get_client(timing_resource_));
-
-    last_interval_us_ = interval_us;
-    last_offset_us_ = offset_us;
   }
 
  private:
-  explicit VSyncTiming(wl_resource* timing_resource)
-      : timing_resource_(timing_resource) {}
-
   // The VSync timing resource.
   wl_resource* const timing_resource_;
 
-  uint64_t last_interval_us_{0};
-  uint64_t last_offset_us_{0};
-
   DISALLOW_COPY_AND_ASSIGN(VSyncTiming);
 };
 
@@ -97,7 +67,7 @@
   wl_resource* timing_resource =
       wl_resource_create(client, &zcr_vsync_timing_v1_interface, 1, id);
   SetImplementation(timing_resource, &vsync_timing_implementation,
-                    VSyncTiming::Create(timing_resource));
+                    std::make_unique<VSyncTiming>(timing_resource));
 }
 
 const struct zcr_vsync_feedback_v1_interface vsync_feedback_implementation = {
diff --git a/components/exo/wm_helper.cc b/components/exo/wm_helper.cc
index de45b22..0af57fd 100644
--- a/components/exo/wm_helper.cc
+++ b/components/exo/wm_helper.cc
@@ -3,7 +3,6 @@
 // found in the LICENSE file.
 
 #include "components/exo/wm_helper.h"
-#include "ui/compositor/compositor_vsync_manager.h"
 
 namespace exo {
 
diff --git a/components/exo/wm_helper.h b/components/exo/wm_helper.h
index 1f6c1801..62db25e3 100644
--- a/components/exo/wm_helper.h
+++ b/components/exo/wm_helper.h
@@ -9,10 +9,10 @@
 
 #include "base/macros.h"
 #include "base/observer_list.h"
+#include "base/time/time.h"
 #include "ui/aura/client/drag_drop_delegate.h"
 #include "ui/aura/env.h"
 #include "ui/base/cursor/cursor.h"
-#include "ui/compositor/compositor_vsync_manager.h"
 
 namespace aura {
 class Window;
@@ -41,6 +41,7 @@
 }
 
 namespace exo {
+class VSyncTimingManager;
 
 // Helper interface for accessing WindowManager related features.
 class WMHelper : public aura::client::DragDropDelegate {
@@ -102,10 +103,7 @@
   virtual void RemoveDragDropObserver(DragDropObserver* observer) = 0;
   virtual void SetDragDropDelegate(aura::Window*) = 0;
   virtual void ResetDragDropDelegate(aura::Window*) = 0;
-  virtual void AddVSyncObserver(
-      ui::CompositorVSyncManager::Observer* observer) = 0;
-  virtual void RemoveVSyncObserver(
-      ui::CompositorVSyncManager::Observer* observer) = 0;
+  virtual VSyncTimingManager& GetVSyncTimingManager() = 0;
 
   virtual const display::ManagedDisplayInfo& GetDisplayInfo(
       int64_t display_id) const = 0;
diff --git a/components/exo/wm_helper_chromeos.cc b/components/exo/wm_helper_chromeos.cc
index 435cac1..0665833 100644
--- a/components/exo/wm_helper_chromeos.cc
+++ b/components/exo/wm_helper_chromeos.cc
@@ -15,8 +15,8 @@
 #include "ui/display/manager/display_configurator.h"
 #include "ui/display/manager/display_manager.h"
 #include "ui/display/types/display_snapshot.h"
-#include "ui/wm/public/activation_client.h"
 #include "ui/wm/core/capture_controller.h"
+#include "ui/wm/public/activation_client.h"
 
 namespace exo {
 namespace {
@@ -31,9 +31,7 @@
 // WMHelperChromeOS, public:
 
 WMHelperChromeOS::WMHelperChromeOS(aura::Env* env)
-    : vsync_manager_(
-          GetPrimaryRoot()->layer()->GetCompositor()->vsync_manager()),
-      env_(env) {}
+    : env_(env), vsync_timing_manager_(this) {}
 
 WMHelperChromeOS::~WMHelperChromeOS() {}
 
@@ -101,14 +99,8 @@
   aura::client::SetDragDropDelegate(window, nullptr);
 }
 
-void WMHelperChromeOS::AddVSyncObserver(
-    ui::CompositorVSyncManager::Observer* observer) {
-  vsync_manager_->AddObserver(observer);
-}
-
-void WMHelperChromeOS::RemoveVSyncObserver(
-    ui::CompositorVSyncManager::Observer* observer) {
-  vsync_manager_->RemoveObserver(observer);
+VSyncTimingManager& WMHelperChromeOS::GetVSyncTimingManager() {
+  return vsync_timing_manager_;
 }
 
 void WMHelperChromeOS::OnDragEntered(const ui::DropTargetEvent& event) {
@@ -136,6 +128,12 @@
   return ui::DragDropTypes::DRAG_MOVE;
 }
 
+void WMHelperChromeOS::AddVSyncParameterObserver(
+    viz::mojom::VSyncParameterObserverPtr observer) {
+  GetPrimaryRoot()->layer()->GetCompositor()->AddVSyncParameterObserver(
+      std::move(observer));
+}
+
 const display::ManagedDisplayInfo& WMHelperChromeOS::GetDisplayInfo(
     int64_t display_id) const {
   return ash::Shell::Get()->display_manager()->GetDisplayInfo(display_id);
diff --git a/components/exo/wm_helper_chromeos.h b/components/exo/wm_helper_chromeos.h
index f50908e..2fd8879 100644
--- a/components/exo/wm_helper_chromeos.h
+++ b/components/exo/wm_helper_chromeos.h
@@ -10,10 +10,10 @@
 #include "ash/display/window_tree_host_manager.h"
 #include "base/macros.h"
 #include "base/observer_list.h"
+#include "components/exo/vsync_timing_manager.h"
 #include "components/exo/wm_helper.h"
 #include "ui/aura/client/drag_drop_delegate.h"
 #include "ui/base/cursor/cursor.h"
-#include "ui/compositor/compositor_vsync_manager.h"
 
 namespace ash {
 class TabletModeObserver;
@@ -49,7 +49,7 @@
 
 // A ChromeOS-specific helper class for accessing WindowManager related
 // features.
-class WMHelperChromeOS : public WMHelper {
+class WMHelperChromeOS : public WMHelper, public VSyncTimingManager::Delegate {
  public:
   explicit WMHelperChromeOS(aura::Env* env);
   ~WMHelperChromeOS() override;
@@ -73,10 +73,7 @@
   void RemoveDragDropObserver(DragDropObserver* observer) override;
   void SetDragDropDelegate(aura::Window*) override;
   void ResetDragDropDelegate(aura::Window*) override;
-  void AddVSyncObserver(
-      ui::CompositorVSyncManager::Observer* observer) override;
-  void RemoveVSyncObserver(
-      ui::CompositorVSyncManager::Observer* observer) override;
+  VSyncTimingManager& GetVSyncTimingManager() override;
 
   const display::ManagedDisplayInfo& GetDisplayInfo(
       int64_t display_id) const override;
@@ -105,11 +102,15 @@
   void OnDragExited() override;
   int OnPerformDrop(const ui::DropTargetEvent& event) override;
 
+  // Overridden from VSyncTimingManager::Delegate:
+  void AddVSyncParameterObserver(
+      viz::mojom::VSyncParameterObserverPtr observer) override;
+
  private:
   base::ObserverList<DragDropObserver>::Unchecked drag_drop_observers_;
-  scoped_refptr<ui::CompositorVSyncManager> vsync_manager_;
   aura::Env* const env_;
   LifetimeManager lifetime_manager_;
+  VSyncTimingManager vsync_timing_manager_;
 
   DISALLOW_COPY_AND_ASSIGN(WMHelperChromeOS);
 };
diff --git a/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc b/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc
index c8eb412..fd31e14c 100644
--- a/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc
+++ b/components/offline_items_collection/core/android/offline_content_aggregator_bridge.cc
@@ -27,6 +27,9 @@
 using base::android::ScopedJavaLocalRef;
 
 namespace offline_items_collection {
+
+using GetVisualsOptions = OfflineContentProvider::GetVisualsOptions;
+
 namespace android {
 
 namespace {
@@ -207,6 +210,7 @@
   provider_->GetVisualsForItem(
       JNI_OfflineContentAggregatorBridge_CreateContentId(env, j_namespace,
                                                          j_id),
+      GetVisualsOptions::IconOnly(),
       base::BindOnce(&GetVisualsForItemHelperCallback,
                      ScopedJavaGlobalRef<jobject>(env, j_callback)));
 }
diff --git a/components/offline_items_collection/core/offline_content_aggregator.cc b/components/offline_items_collection/core/offline_content_aggregator.cc
index 5737275..7febd48b 100644
--- a/components/offline_items_collection/core/offline_content_aggregator.cc
+++ b/components/offline_items_collection/core/offline_content_aggregator.cc
@@ -195,6 +195,7 @@
 }
 
 void OfflineContentAggregator::GetVisualsForItem(const ContentId& id,
+                                                 GetVisualsOptions options,
                                                  VisualsCallback callback) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   auto it = providers_.find(id.name_space);
@@ -205,7 +206,7 @@
     return;
   }
 
-  it->second->GetVisualsForItem(id, std::move(callback));
+  it->second->GetVisualsForItem(id, options, std::move(callback));
 }
 
 void OfflineContentAggregator::GetShareInfoForItem(const ContentId& id,
diff --git a/components/offline_items_collection/core/offline_content_aggregator.h b/components/offline_items_collection/core/offline_content_aggregator.h
index ca2ce72..1e0be794 100644
--- a/components/offline_items_collection/core/offline_content_aggregator.h
+++ b/components/offline_items_collection/core/offline_content_aggregator.h
@@ -75,6 +75,7 @@
   void GetItemById(const ContentId& id, SingleItemCallback callback) override;
   void GetAllItems(MultipleItemCallback callback) override;
   void GetVisualsForItem(const ContentId& id,
+                         GetVisualsOptions options,
                          VisualsCallback callback) override;
   void GetShareInfoForItem(const ContentId& id,
                            ShareCallback callback) override;
diff --git a/components/offline_items_collection/core/offline_content_aggregator_unittest.cc b/components/offline_items_collection/core/offline_content_aggregator_unittest.cc
index e5951e1..00fb425 100644
--- a/components/offline_items_collection/core/offline_content_aggregator_unittest.cc
+++ b/components/offline_items_collection/core/offline_content_aggregator_unittest.cc
@@ -23,6 +23,8 @@
 namespace offline_items_collection {
 namespace {
 
+using GetVisualsOptions = OfflineContentProvider::GetVisualsOptions;
+
 struct CompareOfflineItemsById {
   bool operator()(const OfflineItem& a, const OfflineItem& b) const {
     return a.id < b.id;
@@ -186,8 +188,8 @@
   EXPECT_CALL(provider2, ResumeDownload(id2, true)).Times(1);
   EXPECT_CALL(provider1, PauseDownload(id1)).Times(1);
   EXPECT_CALL(provider2, PauseDownload(id2)).Times(1);
-  EXPECT_CALL(provider1, GetVisualsForItem_(id1, _)).Times(1);
-  EXPECT_CALL(provider2, GetVisualsForItem_(id2, _)).Times(1);
+  EXPECT_CALL(provider1, GetVisualsForItem_(id1, _, _)).Times(1);
+  EXPECT_CALL(provider2, GetVisualsForItem_(id2, _, _)).Times(1);
   EXPECT_CALL(provider1, GetShareInfoForItem(id1, _)).Times(1);
   EXPECT_CALL(provider2, GetShareInfoForItem(id2, _)).Times(1);
   aggregator_.OpenItem(LaunchLocation::DOWNLOAD_HOME, id1);
@@ -200,8 +202,10 @@
   aggregator_.ResumeDownload(id2, true);
   aggregator_.PauseDownload(id1);
   aggregator_.PauseDownload(id2);
-  aggregator_.GetVisualsForItem(id1, OfflineContentProvider::VisualsCallback());
-  aggregator_.GetVisualsForItem(id2, OfflineContentProvider::VisualsCallback());
+  aggregator_.GetVisualsForItem(id1, GetVisualsOptions::IconOnly(),
+                                OfflineContentProvider::VisualsCallback());
+  aggregator_.GetVisualsForItem(id2, GetVisualsOptions::IconOnly(),
+                                OfflineContentProvider::VisualsCallback());
   aggregator_.GetShareInfoForItem(id1, OfflineContentProvider::ShareCallback());
   aggregator_.GetShareInfoForItem(id2, OfflineContentProvider::ShareCallback());
 }
diff --git a/components/offline_items_collection/core/offline_content_provider.h b/components/offline_items_collection/core/offline_content_provider.h
index a5afb8ea5..3d75481e 100644
--- a/components/offline_items_collection/core/offline_content_provider.h
+++ b/components/offline_items_collection/core/offline_content_provider.h
@@ -38,6 +38,29 @@
   using RenameCallback = base::OnceCallback<void(RenameResult)>;
   using DownloadRenameCallback = base::OnceCallback<RenameCallback>;
 
+  // Used by GetVisualsForItem to specify which visuals are needed.
+  struct GetVisualsOptions {
+    bool get_icon;
+    bool get_custom_favicon;
+    static GetVisualsOptions NoVisuals() { return GetVisualsOptions(); }
+    static GetVisualsOptions IconOnly() {
+      GetVisualsOptions options;
+      options.get_icon = true;
+      return options;
+    }
+    static GetVisualsOptions CustomFaviconOnly() {
+      GetVisualsOptions options;
+      options.get_custom_favicon = true;
+      return options;
+    }
+    static GetVisualsOptions IconAndCustomFavicon() {
+      GetVisualsOptions options;
+      options.get_icon = true;
+      options.get_custom_favicon = true;
+      return options;
+    }
+  };
+
   // An observer class that should be notified of relevant changes to the
   // underlying data source.
   // For the Observer that maintains its own cache of items, populated via
@@ -103,10 +126,12 @@
   // Asks for an OfflineItemVisuals struct for an OfflineItem represented by
   // |id| or |nullptr| if one doesn't exist.  The implementer should post any
   // replies even if the results are available immediately to prevent reentrancy
-  // and for consistent behavior.
+  // and for consistent behavior. |options| may be set to let the implementer
+  // know that it need not create the |icon| or |custom_favicon| members.
   // |callback| should be called no matter what (error, unavailable content,
   // etc.).
   virtual void GetVisualsForItem(const ContentId& id,
+                                 GetVisualsOptions options,
                                  VisualsCallback callback) = 0;
 
   // Asks for the right URI to use to share an OfflineItem represented by |id|
diff --git a/components/offline_items_collection/core/offline_item.cc b/components/offline_items_collection/core/offline_item.cc
index f8e32928..2780308 100644
--- a/components/offline_items_collection/core/offline_item.cc
+++ b/components/offline_items_collection/core/offline_item.cc
@@ -88,6 +88,7 @@
          page_url == offline_item.page_url &&
          original_url == offline_item.original_url &&
          is_off_the_record == offline_item.is_off_the_record &&
+         attribution == offline_item.attribution &&
          state == offline_item.state && fail_state == offline_item.fail_state &&
          pending_state == offline_item.pending_state &&
          is_resumable == offline_item.is_resumable &&
@@ -99,6 +100,9 @@
 }
 
 OfflineItemVisuals::OfflineItemVisuals() = default;
+OfflineItemVisuals::OfflineItemVisuals(const gfx::Image& icon,
+                                       const gfx::Image& custom_favicon)
+    : icon(icon), custom_favicon(custom_favicon) {}
 OfflineItemVisuals::OfflineItemVisuals(const OfflineItemVisuals& other) =
     default;
 OfflineItemVisuals::~OfflineItemVisuals() = default;
diff --git a/components/offline_items_collection/core/offline_item.h b/components/offline_items_collection/core/offline_item.h
index fd60d843..97e99f8 100644
--- a/components/offline_items_collection/core/offline_item.h
+++ b/components/offline_items_collection/core/offline_item.h
@@ -165,6 +165,9 @@
   // Whether or not this item is off the record.
   bool is_off_the_record;
 
+  // Identifies the item's publisher.
+  std::string attribution;
+
   // In Progress Metadata.
   // ---------------------------------------------------------------------------
   // The current state of the OfflineItem.
@@ -216,6 +219,7 @@
 // an OfflineItem update to let us know about an update to the visuals.
 struct OfflineItemVisuals {
   OfflineItemVisuals();
+  OfflineItemVisuals(const gfx::Image& icon, const gfx::Image& custom_favicon);
   OfflineItemVisuals(const OfflineItemVisuals& other);
 
   ~OfflineItemVisuals();
@@ -224,6 +228,9 @@
   // TODO(dtrainor): Suggest icon size based on the icon size supported by the
   // current OS.
   gfx::Image icon;
+
+  // Favicon to be shown with the item; optional.
+  gfx::Image custom_favicon;
 };
 
 // This struct holds additional information related to sharing a particular
diff --git a/components/offline_items_collection/core/test_support/mock_offline_content_provider.cc b/components/offline_items_collection/core/test_support/mock_offline_content_provider.cc
index d717332..9a1127a 100644
--- a/components/offline_items_collection/core/test_support/mock_offline_content_provider.cc
+++ b/components/offline_items_collection/core/test_support/mock_offline_content_provider.cc
@@ -46,9 +46,10 @@
 }
 
 void MockOfflineContentProvider::GetVisualsForItem(const ContentId& id,
+                                                   GetVisualsOptions options,
                                                    VisualsCallback callback) {
   if (!override_visuals_) {
-    GetVisualsForItem_(id, std::move(callback));
+    GetVisualsForItem_(id, options, std::move(callback));
   } else {
     std::unique_ptr<OfflineItemVisuals> visuals;
     auto iter = visuals_.find(id);
diff --git a/components/offline_items_collection/core/test_support/mock_offline_content_provider.h b/components/offline_items_collection/core/test_support/mock_offline_content_provider.h
index 90e039a..edaeb57 100644
--- a/components/offline_items_collection/core/test_support/mock_offline_content_provider.h
+++ b/components/offline_items_collection/core/test_support/mock_offline_content_provider.h
@@ -44,9 +44,12 @@
   MOCK_METHOD1(CancelDownload, void(const ContentId&));
   MOCK_METHOD1(PauseDownload, void(const ContentId&));
   MOCK_METHOD2(ResumeDownload, void(const ContentId&, bool));
-  MOCK_METHOD2(GetVisualsForItem_,
-               void(const ContentId&, const VisualsCallback&));
+  MOCK_METHOD3(GetVisualsForItem_,
+               void(const ContentId&,
+                    GetVisualsOptions,
+                    const VisualsCallback&));
   void GetVisualsForItem(const ContentId& id,
+                         GetVisualsOptions options,
                          VisualsCallback callback) override;
   MOCK_METHOD2(GetShareInfoForItem, void(const ContentId&, ShareCallback));
   void GetAllItems(MultipleItemCallback callback) override;
diff --git a/components/offline_items_collection/core/test_support/offline_item_test_support.cc b/components/offline_items_collection/core/test_support/offline_item_test_support.cc
index e4aaa64..a6f5646 100644
--- a/components/offline_items_collection/core/test_support/offline_item_test_support.cc
+++ b/components/offline_items_collection/core/test_support/offline_item_test_support.cc
@@ -34,6 +34,7 @@
   os << ", page_url: " << item.page_url;
   os << ", original_url: " << item.original_url;
   os << ", is_off_the_record: " << item.is_off_the_record;
+  os << ", attribution: " << item.attribution;
   os << ", state: " << item.state;
   os << ", fail_state: " << item.fail_state;
   os << ", pending_state: " << item.pending_state;
diff --git a/components/offline_items_collection/core/throttled_offline_content_provider.cc b/components/offline_items_collection/core/throttled_offline_content_provider.cc
index c1620de1..59671d9 100644
--- a/components/offline_items_collection/core/throttled_offline_content_provider.cc
+++ b/components/offline_items_collection/core/throttled_offline_content_provider.cc
@@ -97,8 +97,9 @@
 
 void ThrottledOfflineContentProvider::GetVisualsForItem(
     const ContentId& id,
+    GetVisualsOptions options,
     VisualsCallback callback) {
-  wrapped_provider_->GetVisualsForItem(id, std::move(callback));
+  wrapped_provider_->GetVisualsForItem(id, options, std::move(callback));
 }
 
 void ThrottledOfflineContentProvider::GetShareInfoForItem(
diff --git a/components/offline_items_collection/core/throttled_offline_content_provider.h b/components/offline_items_collection/core/throttled_offline_content_provider.h
index ecb4ac6..7c3bc4b2 100644
--- a/components/offline_items_collection/core/throttled_offline_content_provider.h
+++ b/components/offline_items_collection/core/throttled_offline_content_provider.h
@@ -45,6 +45,7 @@
   void GetItemById(const ContentId& id, SingleItemCallback callback) override;
   void GetAllItems(MultipleItemCallback callback) override;
   void GetVisualsForItem(const ContentId& id,
+                         GetVisualsOptions options,
                          VisualsCallback callback) override;
   void GetShareInfoForItem(const ContentId& id,
                            ShareCallback callback) override;
diff --git a/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc b/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc
index 96f4234..77403790 100644
--- a/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc
+++ b/components/offline_items_collection/core/throttled_offline_content_provider_unittest.cc
@@ -24,6 +24,8 @@
 namespace offline_items_collection {
 namespace {
 
+using GetVisualsOptions = OfflineContentProvider::GetVisualsOptions;
+
 // Helper class to automatically trigger another OnItemUpdated() to the
 // underlying provider when this observer gets notified of OnItemUpdated().
 // This will only happen the first time the ContentId of the udpated OfflineItem
@@ -98,14 +100,15 @@
   EXPECT_CALL(wrapped_provider_, CancelDownload(id));
   EXPECT_CALL(wrapped_provider_, PauseDownload(id));
   EXPECT_CALL(wrapped_provider_, ResumeDownload(id, true));
-  EXPECT_CALL(wrapped_provider_, GetVisualsForItem_(id, _));
+  EXPECT_CALL(wrapped_provider_, GetVisualsForItem_(id, _, _));
   wrapped_provider_.SetItems(items);
   provider_.OpenItem(LaunchLocation::DOWNLOAD_HOME, id);
   provider_.RemoveItem(id);
   provider_.CancelDownload(id);
   provider_.PauseDownload(id);
   provider_.ResumeDownload(id, true);
-  provider_.GetVisualsForItem(id, OfflineContentProvider::VisualsCallback());
+  provider_.GetVisualsForItem(id, GetVisualsOptions::IconOnly(),
+                              OfflineContentProvider::VisualsCallback());
 
   EXPECT_CALL(*this, OnGetAllItemsDone(items)).Times(1);
   provider_.GetAllItems(
diff --git a/components/offline_pages/core/downloads/download_ui_adapter.cc b/components/offline_pages/core/downloads/download_ui_adapter.cc
index 1445ce0..cc60171 100644
--- a/components/offline_pages/core/downloads/download_ui_adapter.cc
+++ b/components/offline_pages/core/downloads/download_ui_adapter.cc
@@ -244,13 +244,14 @@
 }
 
 void DownloadUIAdapter::GetVisualsForItem(const ContentId& id,
+                                          GetVisualsOptions options,
                                           VisualsCallback visuals_callback) {
   PageCriteria criteria;
   criteria.guid = id.id;
   criteria.maximum_matches = 1;
   model_->GetPagesWithCriteria(
       criteria, base::BindOnce(&DownloadUIAdapter::OnPageGetForVisuals,
-                               weak_ptr_factory_.GetWeakPtr(), id,
+                               weak_ptr_factory_.GetWeakPtr(), id, options,
                                std::move(visuals_callback)));
 }
 
@@ -267,6 +268,7 @@
 
 void DownloadUIAdapter::OnPageGetForVisuals(
     const ContentId& id,
+    GetVisualsOptions options,
     VisualsCallback visuals_callback,
     const std::vector<OfflinePageItem>& pages) {
   if (pages.empty()) {
@@ -292,16 +294,17 @@
   }
 
   model_->GetVisualsByOfflineId(
-      page->offline_id,
-      base::BindOnce(&DownloadUIAdapter::OnVisualsLoaded,
-                     weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
+      page->offline_id, base::BindOnce(&DownloadUIAdapter::OnVisualsLoaded,
+                                       weak_ptr_factory_.GetWeakPtr(), options,
+                                       std::move(callback)));
 }
 
 void DownloadUIAdapter::OnVisualsLoaded(
+    GetVisualsOptions options,
     VisualResultCallback callback,
     std::unique_ptr<OfflinePageVisuals> visuals) {
   DCHECK(thumbnail_decoder_);
-  if (!visuals || visuals->thumbnail.empty()) {
+  if (!options.get_icon || !visuals || visuals->thumbnail.empty()) {
     // PostTask not required, GetThumbnailByOfflineId does it for us.
     std::move(callback).Run(nullptr);
     return;
diff --git a/components/offline_pages/core/downloads/download_ui_adapter.h b/components/offline_pages/core/downloads/download_ui_adapter.h
index 3fc7ff1..65b937f5 100644
--- a/components/offline_pages/core/downloads/download_ui_adapter.h
+++ b/components/offline_pages/core/downloads/download_ui_adapter.h
@@ -100,6 +100,7 @@
   void GetAllItems(
       OfflineContentProvider::MultipleItemCallback callback) override;
   void GetVisualsForItem(const ContentId& id,
+                         GetVisualsOptions options,
                          VisualsCallback callback) override;
   void GetShareInfoForItem(const ContentId& id,
                            ShareCallback share_callback) override;
@@ -144,13 +145,15 @@
       OfflineContentProvider::MultipleItemCallback callback,
       std::unique_ptr<OfflineContentProvider::OfflineItemList> offline_items,
       const MultipleOfflinePageItemResult& pages);
-  void OnVisualsLoaded(VisualResultCallback callback,
+  void OnVisualsLoaded(GetVisualsOptions options,
+                       VisualResultCallback callback,
                        std::unique_ptr<OfflinePageVisuals> visuals);
   void OnRequestsLoaded(
       OfflineContentProvider::MultipleItemCallback callback,
       std::unique_ptr<OfflineContentProvider::OfflineItemList> offline_items,
       std::vector<std::unique_ptr<SavePageRequest>> requests);
   void OnPageGetForVisuals(const ContentId& id,
+                           GetVisualsOptions options,
                            VisualsCallback visuals_callback,
                            const std::vector<OfflinePageItem>& pages);
   void OnPageGetForGetItem(const ContentId& id,
diff --git a/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc b/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc
index faf763700..6bd8fe1 100644
--- a/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc
+++ b/components/offline_pages/core/downloads/download_ui_adapter_unittest.cc
@@ -37,6 +37,8 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/gfx/image/image_unittest_util.h"
 
+using GetVisualsOptions =
+    offline_items_collection::OfflineContentProvider::GetVisualsOptions;
 using offline_items_collection::OfflineItemState;
 
 namespace offline_pages {
@@ -603,7 +605,8 @@
       });
 
   base::HistogramTester histogram_tester;
-  adapter->GetVisualsForItem(kTestContentId1, callback);
+  adapter->GetVisualsForItem(kTestContentId1, GetVisualsOptions::IconOnly(),
+                             callback);
   PumpLoop();
 
   histogram_tester.ExpectUniqueSample(
@@ -627,7 +630,8 @@
       });
   base::HistogramTester histogram_tester;
 
-  adapter->GetVisualsForItem(kContentID, callback);
+  adapter->GetVisualsForItem(kContentID, GetVisualsOptions::IconOnly(),
+                             callback);
   PumpLoop();
 
   histogram_tester.ExpectTotalCount(
@@ -651,7 +655,8 @@
   adapter->GetAllItems(base::DoNothing());
   base::HistogramTester histogram_tester;
 
-  adapter->GetVisualsForItem(kTestContentId1, callback);
+  adapter->GetVisualsForItem(kTestContentId1, GetVisualsOptions::IconOnly(),
+                             callback);
   PumpLoop();
 
   histogram_tester.ExpectUniqueSample(
@@ -679,7 +684,8 @@
       });
   base::HistogramTester histogram_tester;
 
-  adapter->GetVisualsForItem(kTestContentId1, callback);
+  adapter->GetVisualsForItem(kTestContentId1, GetVisualsOptions::IconOnly(),
+                             callback);
   PumpLoop();
 
   histogram_tester.ExpectUniqueSample(
diff --git a/components/offline_pages/core/downloads/offline_item_conversions.cc b/components/offline_pages/core/downloads/offline_item_conversions.cc
index 7223f834..20da8401 100644
--- a/components/offline_pages/core/downloads/offline_item_conversions.cc
+++ b/components/offline_pages/core/downloads/offline_item_conversions.cc
@@ -64,6 +64,8 @@
   item.is_suggested = is_suggested;
   item.is_openable = true;
   item.externally_removed = page.file_missing_time != base::Time();
+  item.description = page.snippet;
+  item.attribution = page.attribution;
 
   return item;
 }
diff --git a/components/password_manager/core/browser/new_password_form_manager.cc b/components/password_manager/core/browser/new_password_form_manager.cc
index ae8b77f..0434334 100644
--- a/components/password_manager/core/browser/new_password_form_manager.cc
+++ b/components/password_manager/core/browser/new_password_form_manager.cc
@@ -246,6 +246,12 @@
   DCHECK_EQ(FormFetcher::State::NOT_WAITING, form_fetcher_->GetState());
   DCHECK(!client_->IsIncognito());
 
+  for (auto blacklisted_iterator = blacklisted_matches_.begin();
+       blacklisted_iterator != blacklisted_matches_.end();) {
+    form_saver_->Remove(**blacklisted_iterator);
+    blacklisted_iterator = blacklisted_matches_.erase(blacklisted_iterator);
+  }
+
   // TODO(https://crbug.com/831123): Implement indicator event metrics.
   if (password_overridden_ &&
       pending_credentials_.type == PasswordForm::TYPE_GENERATED &&
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc
index 3331be9..4275812 100644
--- a/components/password_manager/core/browser/password_form_manager.cc
+++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -278,6 +278,12 @@
   DCHECK_EQ(FormFetcher::State::NOT_WAITING, form_fetcher_->GetState());
   DCHECK(!client_->IsIncognito());
 
+  for (auto blacklisted_iterator = blacklisted_matches_.begin();
+       blacklisted_iterator != blacklisted_matches_.end();) {
+    form_saver_->Remove(**blacklisted_iterator);
+    blacklisted_iterator = blacklisted_matches_.erase(blacklisted_iterator);
+  }
+
   metrics_util::LogPasswordAcceptedSaveUpdateSubmissionIndicatorEvent(
       submitted_form_->submission_event);
   metrics_recorder_->SetSubmissionIndicatorEvent(
diff --git a/components/policy/resources/policy_templates_ca.xtb b/components/policy/resources/policy_templates_ca.xtb
index f317150f..791043a 100644
--- a/components/policy/resources/policy_templates_ca.xtb
+++ b/components/policy/resources/policy_templates_ca.xtb
@@ -1657,7 +1657,7 @@
      Si aquesta política no es defineix, es podran veure tots els comptes de Google del dispositiu a <ph name="PRODUCT_NAME" />.</translation>
 <translation id="4363057787588706121">Permet combinar llistes de polítiques de fonts diferents</translation>
 <translation id="436581050240847513">Informe de les interfícies de xarxa del dispositiu</translation>
-<translation id="4372704773119750918">No permetis que l'usuari empresarial formi part dels perfils múltiples (com a usuari principal o secundari)</translation>
+<translation id="4372704773119750918">No permetis que l'usuari d'empresa formi part dels perfils múltiples (com a usuari principal o secundari)</translation>
 <translation id="4377599627073874279">Permet que tots els llocs mostrin totes les imatges</translation>
 <translation id="437791893267799639">La política no està definida; no permetis la migració de dades i ARC</translation>
 <translation id="4389073105055031853">Permet que els usuaris gestionin tots els certificats</translation>
@@ -1811,7 +1811,7 @@
 <translation id="4802905909524200151">Configura el comportament de l'actualització del microprogramari de <ph name="TPM_FIRMWARE_UPDATE_TPM" /></translation>
 <translation id="4804828344300125154">Reinicia sempre el dispositiu quan l'usuari tanqui la sessió.</translation>
 <translation id="4807950475297505572">Els usuaris utilitzats fa més temps s'eliminen fins que hi ha prou espai lliure.</translation>
-<translation id="4816674326202173458">Permet que un usuari empresarial sigui principal i secundari (comportament predeterminat per a usuaris no gestionats)</translation>
+<translation id="4816674326202173458">Permet que un usuari d'empresa sigui principal i secundari (comportament predeterminat per a usuaris no gestionats)</translation>
 <translation id="4826326557828204741">Acció que s'ha d'emprendre quan s'està inactiu mentre s'utilitza la bateria</translation>
 <translation id="4832852360828533362">Informes d'usuaris i de dispositius</translation>
 <translation id="4834526953114077364">Els usuaris utilitzats fa més temps i que no s'hagin utilitzat per iniciar la sessió en els últims tres mesos s'eliminen fins que hi hagi prou espai lliure.</translation>
@@ -3402,7 +3402,7 @@
       Aquesta política està limitada a 1.000 entrades; les entrades següents s'ignoraran.
 
       Si no es defineix aquesta política, no es faran excepcions a la llista negra de la política "URLBlacklist".</translation>
-<translation id="8176035528522326671">Permet que un usuari empresarial només sigui un usuari multiperfil principal (comportament predeterminat per a usuaris gestionats per l'empresa)</translation>
+<translation id="8176035528522326671">Permet que un usuari d'empresa només sigui un usuari multiperfil principal (comportament predeterminat per a usuaris gestionats per l'empresa)</translation>
 <translation id="8214600119442850823">Configura el gestor de contrasenyes.</translation>
 <translation id="8244171102276095471">Activa els sistemes de xifratge RC4 de TLS</translation>
 <translation id="8244525275280476362">Retard màxim en l'obtenció després de la invalidació d'una política</translation>
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index d9d2345..561f97ec 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -51,6 +51,13 @@
 <translation id="1049138910114524876">Establece la configuración regional que se fuerza a aplicar en la pantalla de inicio de sesión de <ph name="PRODUCT_OS_NAME" />.
 
       Si se asigna un valor a esta política, la pantalla de inicio de sesión se mostrará siempre en la configuración regional proporcionada por el primer valor de esta política (esta se define como lista para que sea compatible con versiones posteriores). Si no se le asigna ningún valor o se le asigna una lista vacía, la pantalla de inicio de sesión se mostrará en la configuración regional de la sesión del último usuario. Si el valor que se le asigna no es una configuración regional válida, la pantalla de inicio de sesión se mostrará en una configuración regional establecida antes (actualmente: en-US).</translation>
+<translation id="1052499923181221200">Esta política no tiene ningún efecto a menos que se le asigne el valor "True" a SamlInSessionPasswordChangeEnabled.
+      Si se asigna el valor "True" a SamlInSessionPasswordChangeEnabled y se asigna el valor 14 a esta política, por ejemplo, se enviará una notificación a los usuarios de SAML 14 días antes de que su contraseña caduque en una fecha determinada.
+      Los usuarios de SAML podrán realizar inmediatamente un cambio de contraseña con la sesión iniciada y actualizarla antes de que caduque.
+      Estas notificaciones solo se mostrarán si el proveedor de identidades de SAML envía la información sobre la caducidad de la contraseña al dispositivo durante el flujo de inicio de sesión de SAML.
+      Si se asigna el valor cero a esta política, no se enviará una notificación a los usuarios con antelación. Solo recibirán la notificación cuando la contraseña haya caducado.
+
+      Si se asigna un valor a esta política, el usuario no podrá cambiarlo ni anularlo.</translation>
 <translation id="1062011392452772310">Habilitar confirmación remota para el dispositivo</translation>
 <translation id="1062407476771304334">Sustituir</translation>
 <translation id="1079801999187584280">No permitir el uso de herramientas para desarrolladores</translation>
@@ -210,6 +217,7 @@
       Si se habilita esta política, el Asistente de Google podrá acceder al contexto de la pantalla.
       Si no se habilita, el Asistente de Google no podrá acceder al contexto de la pantalla.
       Si no se define, cada usuario decide si permite que el Asistente de Google acceda al contexto</translation>
+<translation id="1376119291123231789">Habilita el modo avanzado de carga de la batería</translation>
 <translation id="1383493480903114193">Esta política fuerza que el código de red se ejecute en el proceso del navegador.
 
       Está inhabilitada de forma predeterminada, pero, si se habilita, deja a los usuarios desprotegidos frente a problemas de seguridad cuando el proceso de red se pone en zona de pruebas.
@@ -306,6 +314,18 @@
 <translation id="1477934438414550161">TLS 1.2</translation>
 <translation id="1502843533062797703">Habilitar el bloqueo de inserción de software de terceros</translation>
 <translation id="1504431521196476721">Confirmación remota</translation>
+<translation id="1507382822467487898">
+          Configura qué dirección MAC (control de acceso al medio) se usará cuando se conecte una base al dispositivo.
+
+          Al conectar una base a algunos modelos de dispositivo, se utilizará la dirección MAC designada del dispositivo para identificar el dispositivo en Ethernet de forma predeterminada. Esta política permite que el administrador pueda cambiar la fuente de la dirección MAC cuando esté conectado a una base.
+
+          Si se selecciona "DeviceDockMacAddress" o no se asigna ningún valor a esta política, se usará la dirección MAC designada de la base.
+
+          Si se selecciona "DeviceNicMacAddress", se usará la dirección NIC (controlador de interfaz de red) MAC del dispositivo.
+
+          Si se selecciona "DockNicMacAddress", se usará la dirección NIC MAC de la base.
+
+          El usuario no puede cambiar esta opción.</translation>
 <translation id="1507957856411744193">Si se le asigna el valor "True" a esta política, <ph name="PRODUCT_NAME" /> se conectará a dispositivos de transmisión de todas las direcciones IP, no solo a los de las direcciones privadas de RFC1918 y RFC4193.
 
           Si se le asigna el valor "False", <ph name="PRODUCT_NAME" /> solo se conectará a los dispositivos de transmisión de las direcciones privadas de RFC1918 y RFC4193.
@@ -743,6 +763,17 @@
 <translation id="2303795211377219696">Habilitar la función Autocompletar para tarjetas de crédito</translation>
 <translation id="2309390639296060546">Configuración de ubicación geográfica predeterminada</translation>
 <translation id="2327252517317514801">Definir los dominios autorizados para acceder a G Suite</translation>
+<translation id="2356878440219553005">Especifica la política de gestión del modo de carga de la batería.
+
+          Controla dinámicamente la carga de la batería para minimizar el desgaste de la batería por estrés y para extender su duración.
+
+          Si se ha seleccionado el modo personalizado de carga de la batería, se debe especificar un valor para DeviceBatteryChargeCustomStartCharging y DeviceBatteryChargeCustomStopCharging.
+
+          Si se configura esta política, se aplicará el modo de carga de la batería si el dispositivo lo admite.
+
+          Si no se le asigna ningún valor y el dispositivo admite esta política, se aplicará el modo estándar de carga de la batería y el usuario no podrá cambiarlo.
+
+          Nota: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> anula esta política si se especifica la anterior.</translation>
 <translation id="237494535617297575">Permite establecer una lista de patrones de URL que especifiquen sitios que puedan mostrar notificaciones.
 
           Si no se establece esta política, se usará para todos los sitios el valor general predeterminado que se indique en la política DefaultNotificationsSetting (si se ha establecido) o el valor personalizado que haya definido el usuario (en caso contrario).</translation>
@@ -780,6 +811,7 @@
 
       Si se utiliza el valor False, no se podrá omitir el inicio de sesión automático sin tiempo de espera (si se ha configurado).</translation>
 <translation id="2454228136871844693">Optimizar para una mejor estabilidad.</translation>
+<translation id="2463034609187171371">Habilita los conjuntos de cifrado DHE en TLS</translation>
 <translation id="2463365186486772703">Configuración regional de la aplicación</translation>
 <translation id="2466131534462628618">La autenticación del portal cautivo ignora el proxy</translation>
 <translation id="2482676533225429905">Mensajes nativos</translation>
@@ -964,6 +996,7 @@
 <translation id="2769952903507981510">Configurar el nombre de dominio obligatorio para hosts de acceso remoto</translation>
 <translation id="2787173078141616821">Proporcionar información sobre el estado de Android</translation>
 <translation id="2799297758492717491">Permitir reproducción automática de contenido multimedia en una lista blanca de patrones de URL</translation>
+<translation id="2801155097555584385">Define un porcentaje personalizado de inicio de carga de la batería</translation>
 <translation id="2801230735743888564">Permite que los usuarios jueguen al juego del huevo de pascua de dinosaurio sin conexión.
 
       Si se asigna el valor False a esta política, los usuarios no podrán jugar al juego del huevo de pascua de dinosaurio sin conexión. Si se le asigna el valor True, los usuarios podrán jugar al juego del dinosaurio. Si no se establece esta política, los usuarios no podrán jugar a este juego en el dispositivo Chrome OS registrado, aunque podrán hacerlo en otras circunstancias.</translation>
@@ -1037,6 +1070,7 @@
       Si inhabilitas esta opción o no se establece ningún valor, la vista previa de impresión mostrará la última impresora utilizada como impresora de destino predeterminada.
 
       Si habilitas esta opción, la vista previa de impresión mostrará la impresora predeterminada del sistema operativo como impresora de destino predeterminada.</translation>
+<translation id="285627849510728211">Define la configuración diaria del modo avanzado de carga de la batería</translation>
 <translation id="2856674246949497058">Vuelve a instalar la versión de destino si la versión del SO es más reciente que la de destino. Realiza un Powerwash durante el proceso.</translation>
 <translation id="2872961005593481000">Apagar</translation>
 <translation id="2873651257716068683">Anula el tamaño de impresión de página predeterminado. Si el tamaño de la página no está disponible, se ignora la política.</translation>
@@ -1168,6 +1202,19 @@
 <translation id="3072045631333522102">Protector de pantalla a utilizar en la pantalla de inicio de sesión del modo de venta</translation>
 <translation id="3072847235228302527">Establecer las Condiciones de Servicio para una cuenta de dispositivo local</translation>
 <translation id="3077183141551274418">Habilita o inhabilita los ciclos de vida de las pestañas</translation>
+<translation id="3079417254871857650">Especifica la acción que debe llevarse a cabo si el directorio principal del usuario se ha creado con el sistema de cifrado eCryptfs.
+
+      Si se asigna el valor "DisallowArc" a esta política, se inhabilitarán las aplicaciones Android para el usuario y no se realizará ninguna migración del sistema de cifrado eCryptfs al sistema de cifrado ext4. Las aplicaciones Android podrán seguir ejecutándose si el directorio principal ya tiene el cifrado ext4.
+
+      Si se asigna el valor "Migrate" a esta política, los directorios principales cifrados con eCryptfs se migrarán automáticamente al sistema de cifrado ext4 al iniciar sesión sin solicitar el consentimiento del usuario.
+
+      Si se le asigna el valor "Wipe", los directorios principales cifrados con eCryptfs se eliminarán al iniciar sesión y se crearán nuevos directorios principales con el sistema de cifrado ext4. Advertencia: Se eliminarán los datos locales del usuario.
+
+      Si se asigna el valor "MinimalMigrate" a esta política, los directorios principales cifrados con eCryptfs se eliminarán al iniciar sesión y se crearán nuevos directorios principales con el sistema de cifrado ext4. Sin embargo, se intentarán conservar los tokens de inicio de sesión para que el usuario no tenga que volver a iniciar sesión. Advertencia: Se eliminarán los datos locales del usuario.
+
+      Si se asigna un valor a esta política que ya no es compatible ("AskUser" o "AskForEcryptfsArcUsers"), se tratará como si se hubiera asignado el valor "Migrate".
+
+      Esta política no se aplica a los usuarios de kiosco. Si no se asigna ningún valor a esta política, el dispositivo se comportará como si se hubiera asignado el valor "DisallowArc".</translation>
 <translation id="3086995894968271156">Configura Cast Receiver en <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3088796212846734853">Permite establecer una lista de patrones de URL para especificar los sitios web que pueden mostrar imágenes.
 
@@ -1176,6 +1223,7 @@
 
 
           Ten en cuenta que esta política se había habilitado de forma incorrecta en Android anteriormente, pero esta función nunca ha sido totalmente compatible con Android.</translation>
+<translation id="3091832372132789233">Carga la batería de los dispositivos que están conectados principalmente a una fuente de alimentación externa.</translation>
 <translation id="3096595567015595053">Lista de complementos habilitados</translation>
 <translation id="3101501961102569744">Seleccionar la forma de especificar la configuración del servidor proxy</translation>
 <translation id="3101709781009526431">Fecha y hora</translation>
@@ -1201,6 +1249,7 @@
           Si se inhabilita esta opción, <ph name="PRODUCT_NAME" /> solo utilizará hosts de mensajes nativos instalados en el nivel de usuario.
 
           Si no se configura esta opción, <ph name="PRODUCT_NAME" /> permitirá el uso de hosts de mensajes nativos.</translation>
+<translation id="3177802893484440532">Requiere comprobaciones de OCSP/CRL online para los anclajes de veracidad locales</translation>
 <translation id="3185009703220253572">desde la versión <ph name="SINCE_VERSION" /></translation>
 <translation id="3187220842205194486">Las aplicaciones para Android no pueden acceder a las claves corporativas. Esta política no les afecta.</translation>
 <translation id="3205825995289802549">Maximizar la primera ventana del navegador en la primera ejecución</translation>
@@ -1214,6 +1263,7 @@
 <translation id="3220624000494482595">Si la aplicación de kiosco es una aplicación para Android, no tendrá control sobre la versión de <ph name="PRODUCT_OS_NAME" />, incluso si se asigna el valor <ph name="TRUE" /> a esta política.</translation>
 <translation id="3236046242843493070">Patrones de URL desde los que se puede instalar secuencias de comandos de usuario, aplicaciones y extensiones</translation>
 <translation id="3240609035816615922">Política de acceso a la configuración de impresoras.</translation>
+<translation id="3240655340884151271">Dirección NIC MAC integrada en la base</translation>
 <translation id="3243309373265599239">Permite especificar el tiempo transcurrido hasta la atenuación de la pantalla (sin que el usuario realice ninguna acción) cuando el dispositivo está conectado a la red.
 
           Cuando esta política se establece en un valor superior a cero, especifica el tiempo en que el usuario debe permanecer inactivo antes de que <ph name="PRODUCT_OS_NAME" /> atenúe la pantalla.
@@ -1235,6 +1285,12 @@
       Si esta opción se habilita o no se configura, los usuarios podrán habilitar el proxy de Google Cloud Print si realizan el proceso de autenticación con sus cuentas de Google.
 
       Si se inhabilita esta opción, los usuarios no podrán habilitar el proxy y el ordenador no podrá compartir las impresoras conectadas con <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3312206664202507568">Habilita una página en chrome://password-change que permite a los usuarios de SAML cambiar sus contraseñas de SAML mientras tienen la sesión iniciada. De esta manera, se asegura que la contraseña de SAML y la contraseña de bloqueo de pantalla del dispositivo estén sincronizadas.
+
+      Esta política también habilita las notificaciones que avisan a los usuarios de SAML de que sus contraseñas de SAML está a punto de caducar y que pueden realizar inmediatamente un cambio de contraseña con la sesión iniciada.
+      Estas notificaciones solo se mostrarán si el proveedor de identidades de SAML envía la información sobre la caducidad de la contraseña al dispositivo durante el flujo de inicio de sesión de SAML.
+
+      Si se asigna un valor a esta política, el usuario no podrá cambiarlo ni anularlo.</translation>
 <translation id="3322771899429619102">Te permite establecer una lista de patrones de URL para especificar los sitios web que pueden utilizar la generación de claves. Si un patrón de URL está en KeygenBlockedForUrls, se anularán estas excepciones.
 
        Si no se establece esta política, se utilizará el valor general predeterminado de la política DefaultKeygenSetting (si está configurada) para todos los sitios web. De lo contrario, se utilizará la configuración personalizada que haya definido el usuario.</translation>
@@ -1320,6 +1376,7 @@
 
           Si esta política se establece en false o no se establece, los retrasos de administración de energía y el límite de duración de sesión se ejecutarán inmediatamente al iniciar la sesión.</translation>
 <translation id="3478024346823118645">Borrar los datos del usuario al cerrar sesión</translation>
+<translation id="3480961938508521469">Carga totalmente la batería a velocidad estándar.</translation>
 <translation id="348495353354674884">Habilitar teclado virtual</translation>
 <translation id="3487623755010328395">Si se habilita la política, <ph name="PRODUCT_NAME" /> intentará registrarse y aplicar la política relativa a la nube asociada a todos los perfiles.
 
@@ -1366,6 +1423,8 @@
 <translation id="3547954654003013442">Configuración de proxy</translation>
 <translation id="355118380775352753">Sitios web que se abren en el navegador alternativo</translation>
 <translation id="3554984410014457319">Permite que el Asistente de Google escuche la frase de activación</translation>
+<translation id="356579196325389849">Los usuarios pueden configurar el canal de lanzamiento de Chrome​OS</translation>
+<translation id="3575011234198230041">Autenticación HTTP</translation>
 <translation id="3577251398714997599">Configuración de anuncios de sitios web con anuncios invasivos</translation>
 <translation id="357917253161699596">Permitir que los usuarios gestionen certificados de usuario</translation>
 <translation id="3583230441447348508">Define una lista de sistemas de archivos compartidos en red preconfigurados.
@@ -1396,6 +1455,7 @@
 
         El registro automático de políticas de permisos de nube utiliza esta política en el escritorio y se puede configurar mediante el registro o el GPO en Windows, mediante plist en Mac y mediante el archivo de políticas JSON en Linux.</translation>
 <translation id="3660562134618097814">Transferir las cookies del proveedor de identidad SAML durante el inicio de sesión</translation>
+<translation id="3668151900457104753">Desinstala las extensiones incluidas en la lista negra</translation>
 <translation id="3701121231485832347">Controla la configuración específica de los dispositivos con <ph name="PRODUCT_OS_NAME" /> gestionados con <ph name="MS_AD_NAME" />.</translation>
 <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (el campo de una línea está obsoleto y desaparecerá en el futuro; a partir de ahora, debes utilizar el campo de varias líneas que aparece más abajo).</translation>
 <translation id="3709266154059827597">Configurar lista negra de instalación de extensiones</translation>
@@ -1477,6 +1537,16 @@
 Si no se establece esta política, el teclado en pantalla estará inhabilitado inicialmente, pero el usuario podrá habilitarlo en cualquier momento.</translation>
 <translation id="382476126209906314">Configurar el prefijo TalkGadget para hosts de acceso remoto</translation>
 <translation id="3824972131618513497">Controla los ajustes relacionados con el reinicio y la gestión de la batería.</translation>
+<translation id="3826475866868158882">Se han habilitado los servicios de ubicación de Google</translation>
+<translation id="3831054243924627613">Esta política controla el estado inicial de la copia de seguridad y restauración de Android.
+
+      Si esta política no se configura o se le asigna el valor <ph name="BR_DISABLED" />, la copia de seguridad y restauración de Android está inhabilitada inicialmente.
+
+      Si se le asigna el valor <ph name="BR_ENABLED" />, la copia de seguridad y restauración de Android está habilitada inicialmente.
+
+      Si se le asigna el valor <ph name="BR_UNDER_USER_CONTROL" />, se pregunta al usuario si quiere usar la opción de Android para crear una copia de seguridad y restaurar los datos. Si el usuario habilita esta opción, los datos de aplicaciones Android se suben a los servidores de copia de seguridad de Android y se restauran cuando se vuelven a instalar aplicaciones compatibles.
+
+      Ten en cuenta que esta política controla el estado de la copia de seguridad y restauración de Android solo durante la configuración inicial. El usuario podrá abrir los ajustes de Android más adelante y activar o desactivar la copia de seguridad y restauración de Android.</translation>
 <translation id="3831376478177535007">Si se habilita esta opción, <ph name="PRODUCT_NAME" /> permitirá que se confíe en los certificados emitidos por operaciones de la infraestructura de clave pública antigua de Symantec Corporation si se validan correctamente y se vinculan con un certificado de CA reconocido.
 
       Ten en cuenta que esta política depende de que el sistema operativo siga reconociendo los certificados de la infraestructura antigua de Symantec. Si una actualización del sistema operativo cambia la forma en que este gestiona los certificados, esta política dejará de aplicarse. Además, el objetivo de esta política es ofrecer a las empresas una solución temporal que les proporcione más tiempo para dejar de usar los certificados antiguos de Symantec. Esta política se retirará sobre el 1 de enero del 2019.
@@ -1560,6 +1630,15 @@
 
           Si se utiliza el valor false o no se establece la política, los usuarios podrán transferir archivos a Google Drive.</translation>
 <translation id="3915395663995367577">URL de un archivo .pac de proxy</translation>
+<translation id="3920892052017026701">Establece un porcentaje personalizado de inicio de carga de la batería
+
+          La batería empezará a cargarse cuando alcance el valor personalizado de inicio de carga.
+
+          El valor de DeviceBatteryChargeCustomStartCharging debe ser inferior al de DeviceBatteryChargeCustomStopCharging.
+
+          Esta política solo se usará si se asigna un valor personalizado a DeviceBatteryChargeMode.
+
+          Si no se configura esta política o no se le asigna ningún valor, se aplicará el modo estándar de carga de la batería.</translation>
 <translation id="3925377537407648234">Definir la resolución de pantalla y el factor de escala</translation>
 <translation id="3939893074578116847">Envía paquetes de red al servidor de gestión para supervisar el estado online y permitir que el servidor detecte si el dispositivo está sin conexión.
 
@@ -1689,6 +1768,7 @@
 <translation id="4150201353443180367">Pantalla</translation>
 <translation id="4157003184375321727">Informar de la versión del firmware y del sistema operativo</translation>
 <translation id="4157594634940419685">Permitir el acceso a impresoras CUPS nativas</translation>
+<translation id="4160962198980004898">Fuente de la dirección MAC del dispositivo cuando esté conectado a una base</translation>
 <translation id="4163705126749612234">Permite configurar los nombres de dominio de cliente obligatorios que se aplicarán a los clientes de acceso remoto e impide que los usuarios los modifiquen.
 
           Si se habilita esta opción, solo los clientes de uno de los dominios especificados pueden conectarse al host.
@@ -1768,6 +1848,7 @@
       Ten en cuenta que el hecho de que la política incluya el ID de una aplicación no significa necesariamente que el usuario pueda habilitarla como aplicación para tomar notas en la pantalla de bloqueo. Por ejemplo, en Chrome 61, la plataforma también restringe el conjunto de aplicaciones disponibles.
 
       Si la política no se configura, esta no restringirá el conjunto de aplicaciones que el usuario puede habilitar en la pantalla de bloqueo.</translation>
+<translation id="4313767483634435271">Dirección MAC designada de la base</translation>
 <translation id="4322842393287974810">Permite que la aplicación de kiosco sin retardo con inicio automático controle la versión de <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="4325690621216251241">Añadir un botón para cerrar sesión en la bandeja del sistema</translation>
 <translation id="4332177773549877617">Registrar eventos de descargas de aplicaciones para Android</translation>
@@ -1799,6 +1880,7 @@
 <translation id="4360826270668210664">Si se asigna un valor a esta política, el host de acceso remoto necesitará la autenticación de los clientes para obtener un token de autenticación de esta URL y poder conectarse. Debe utilizarse junto con RemoteAccessHostTokenValidationUrl.
 
           Actualmente, esta función está inhabilitada en el servidor.</translation>
+<translation id="4363057787588706121">Permite combinar listas de políticas de fuentes distintas</translation>
 <translation id="436581050240847513">Permite informar de interfaces de red del dispositivo</translation>
 <translation id="4372704773119750918">No permitir que el usuario de empresa forme parte de la función de varios perfiles (usuario principal o secundario)</translation>
 <translation id="4377599627073874279">Permitir que todos los sitios muestren todas las imágenes</translation>
@@ -1972,6 +2054,7 @@
 <translation id="4826326557828204741">Acción a emprender si se alcanza el retraso de inactividad mientras el dispositivo está usando la batería</translation>
 <translation id="4832852360828533362">Informes de usuarios y dispositivos</translation>
 <translation id="4834526953114077364">Eliminar usuarios utilizados hace más tiempo que no hayan iniciado sesión en los tres últimos meses hasta que haya suficiente espacio libre</translation>
+<translation id="4835622243021053389">Habilita la autenticación NTLMv2.</translation>
 <translation id="4858735034935305895">Permitir modo de pantalla completa</translation>
 <translation id="4861767323695239729">Configurar los métodos de introducción admitidos en una sesión de usuario</translation>
 <translation id="487460824085252184">Migrar automáticamente sin solicitar el consentimiento de los usuarios.</translation>
@@ -2094,6 +2177,11 @@
 
       A diferencia de <ph name="URL_LIST_POLICY_NAME" />, las reglas se aplican en ambas direcciones. De esta forma, si el complemento de Internet Explorer está presente y habilitado, también controla si <ph name="IE_PRODUCT_NAME" /> debe abrir las URL en <ph name="PRODUCT_NAME" />.</translation>
 <translation id="5124368997194894978">Habilitar el inicio con CA (corriente alterna)</translation>
+<translation id="5131211790949066746">Permite combinar las políticas de listas de instalación de extensiones <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> y <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />.
+
+      Si habilitas esta opción, los valores de la política de la plataforma del equipo, la política de la nube del equipo y la política de la plataforma del usuario se combinan en una única lista que se usa en conjunto en lugar de usar únicamente los valores de la fuente que tenga mayor prioridad.
+
+      Si inhabilitas esta opción o no le asignas ningún valor, solo se usarán las entradas de lista de la fuente que tenga mayor prioridad. Las demás fuentes se mostrarán como conflictos, pero se ignorarán.</translation>
 <translation id="5141670636904227950">Establecer el tipo de lupa predeterminada habilitada en la pantalla de inicio de sesión</translation>
 <translation id="5142301680741828703">Mostrar siempre los patrones de URL indicados a continuación en <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Te permite especificar los parámetros adicionales que se utilizan cuando <ph name="PRODUCT_FRAME_NAME" /> inicia <ph name="PRODUCT_NAME" />.
@@ -2217,6 +2305,7 @@
 
       Si esta política no se configura o si se le asigna una cadena vacía o un intervalo de puertos no válido, WebRTC podrá utilizar cualquier puerto UDP local disponible.</translation>
 <translation id="5290940294294002042">Especificar una lista de complementos que los usuarios puedan habilitar o inhabilitar</translation>
+<translation id="5306186200045823863">Confiar en la infraestructura de PKI antigua de Symantec Corporation</translation>
 <translation id="5307432759655324440">Disponibilidad del modo de incógnito</translation>
 <translation id="5318185076587284965">Habilita el uso de servidores de retransmisión por parte del host de acceso remoto</translation>
 <translation id="5323128137188992869">Permite enviar contenido al dispositivo con <ph name="PRODUCT_NAME" />.
@@ -2318,6 +2407,7 @@
       Si las reglas se contradicen, <ph name="PRODUCT_NAME" /> usa la más específica.</translation>
 <translation id="5475361623548884387">Habilitar impresión</translation>
 <translation id="547601067149622666">No permitir anuncios en sitios web con anuncios invasivos</translation>
+<translation id="5483065054530244863">Permite certificados SHA-1 firmados emitidos por anclajes de veracidad locales</translation>
 <translation id="5483777239978559943">Esta política está obsoleta. Utiliza la política <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> para controlar la disponibilidad del complemento Adobe Flash y la política <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> para controlar si el visor de PDF integrado se debe utilizar para abrir archivos PDF.
 
       Especifica una lista de complementos que el usuario puede habilitar o inhabilitar en <ph name="PRODUCT_NAME" />.
@@ -2432,6 +2522,17 @@
           Si habilitas esta opción o si no asignas un valor a esta política, los usuarios podrán ver sus contraseñas sin cifrar en el administrador de contraseñas.</translation>
 <translation id="5620392548325769024">Habilitar la opción para que se muestre la página de bienvenida al abrir el navegador por primera vez después de actualizar el SO</translation>
 <translation id="5630352020869108293">Restaurar la última sesión</translation>
+<translation id="5643906875497889108">Controla qué tipos de aplicaciones y extensiones pueden instalarse y limita el acceso en tiempo de ejecución.
+
+          Esta opción añade a la lista blanca los tipos de extensiones y aplicaciones que pueden instalarse en <ph name="PRODUCT_NAME" /> y con qué hosts pueden interactuar. El valor es una lista de cadenas. Cada cadena debe ser de uno de los tipos siguientes: "extension", "theme", "user_script", "hosted_app", "legacy_packaged_app" o "platform_app". Consulta la documentación de las extensiones de <ph name="PRODUCT_NAME" /> para obtener más información sobre estos tipos.
+
+          Ten en cuenta que esta política también afecta a las extensiones y aplicaciones que se deban instalar de forma forzada mediante ExtensionInstallForcelist.
+
+          Si se configura esta opción, no se instalarán las extensiones ni las aplicaciones que sean de un tipo que no esté incluido en la lista.
+
+          Si no se configura esta opción, no se implementará ninguna restricción en los tipos aceptables de extensiones y aplicaciones.
+
+          Antes de la versión 75, no se admite separar los ID de las extensiones con comas y se omitirá. El resto de la política seguirá siendo aplicable.</translation>
 <translation id="5645779841392247734">Permitir cookies en estos sitios</translation>
 <translation id="5689430183304951538">Tamaño predeterminado de impresión de página</translation>
 <translation id="5693469654327063861">Permitir la migración de datos</translation>
@@ -2471,6 +2572,7 @@
 <translation id="5765780083710877561">Descripción:</translation>
 <translation id="5770738360657678870">Canal de desarrolladores (puede ser inestable)</translation>
 <translation id="5774856474228476867">URL de búsqueda del proveedor de búsquedas predeterminadas</translation>
+<translation id="5775235485119094648">Carga la batería mientras está dentro de un rango determinado.</translation>
 <translation id="5776485039795852974">Preguntar siempre que un sitio quiera mostrar notificaciones de escritorio</translation>
 <translation id="5781412041848781654">Especifica la biblioteca GSSAPI que se debe utilizar para la autenticación HTTP. Puedes definir simplemente el nombre de una biblioteca o una ruta completa.
 
@@ -2538,6 +2640,7 @@
 <translation id="5893553533827140852">Si esta opción está habilitada, las solicitudes de autenticación gnubby se representarán a través de una conexión de host remota.
 
           Si esta opción está inhabilitada o no está configurada, no se representarán solicitudes de autenticación gnubby.</translation>
+<translation id="5897913798715600338">Carga la batería usando la tecnología de carga rápida.</translation>
 <translation id="5898486742390981550">Si varios usuarios han iniciado sesión, solo podrá utilizar las aplicaciones para Android el usuario principal.</translation>
 <translation id="5900196529149231477">
       Esta política se aplica a la pantalla de inicio de sesión. También puedes consultar la política <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> que se aplica a la sesión del usuario. Te recomendamos que asignes el mismo valor a ambas políticas. Si los valores no coinciden, es posible que se produzca un retraso al acceder a una sesión de usuario mientras se aplica el valor especificado por la política del usuario.
@@ -2546,12 +2649,14 @@
       Si no se configura la política, se usará la configuración predeterminada de la plataforma de aislamiento de sitios web en la pantalla de inicio.
       </translation>
 <translation id="5901427587865226597">Solo impresión por las dos caras</translation>
+<translation id="5905473632148429217">Habilita las comprobaciones de OCSP/CRL online</translation>
 <translation id="5906199912611534122">Permite habilitar o inhabilitar la limitación de ancho de banda.
       Se aplica a todos los usuarios y todas las interfaces del dispositivo. Una vez que se establezca la limitación,
       esta se mantendrá hasta que se cambia la política para inhabilitarla.
 
       Si se asigna el valor false, no se habilitará la limitación.
       Si se le asigna el valor true, se establecerá una limitación en el sistema para alcanzar una determinada velocidad de subida y descarga (en Kbps).</translation>
+<translation id="591088232153082363">Carga de batería inteligente basada en el patrón de uso de batería.</translation>
 <translation id="5921713479449475707">Permitir descargas de actualizaciones automáticas a través de HTTP</translation>
 <translation id="5921888683953999946">Establece el estado predeterminado de la función de accesibilidad del cursor grande en la pantalla de inicio de sesión.
 
@@ -2573,6 +2678,7 @@
 <translation id="5950205771952201658">Debido a que las comprobaciones de revocaciones online "soft-fail" no proporcionan una seguridad efectiva, están inhabilitadas de forma predeterminada en la versión 19 y en las versiones posteriores de <ph name="PRODUCT_NAME" />. Si esta política se establece en true, se restaurará el comportamiento anterior y se realizarán comprobaciones de OCSP y CRL online.
 
       Si no se establece la política o se establece en false, <ph name="PRODUCT_NAME" /> no realizará comprobaciones de revocaciones online en <ph name="PRODUCT_NAME" /> 19 ni en versiones posteriores.</translation>
+<translation id="5961137303188584693">Dirección NIC MAC integrada en el dispositivo</translation>
 <translation id="5966615072639944554">Extensiones con permiso para utilizar la API de confirmación remota</translation>
 <translation id="5983708779415553259">Comportamiento predeterminado de sitios no incluidos en un paquete de contenido</translation>
 <translation id="5997543603646547632">Utilizar reloj de formato de 24 horas de forma predeterminada</translation>
@@ -2663,6 +2769,17 @@
 <translation id="6111936128861357925">Permitir el juego del huevo de pascua de dinosaurio</translation>
 <translation id="6114416803310251055">obsoleto</translation>
 <translation id="6133088669883929098">Permitir que todos los sitios web utilicen la generación de claves</translation>
+<translation id="6136537398661737682">Esta política controla el estado inicial de los servicios de ubicación de Google.
+
+      Si no se configura esta política o se le asigna el valor <ph name="GLS_DISABLED" />, los servicios de ubicación de Google están inhabilitados inicialmente.
+
+      Si se le asigna el valor <ph name="GLS_ENABLED" />, los servicios de ubicación de Google están habilitados inicialmente.
+
+      Si se le asigna el valor <ph name="GLS_UNDER_USER_CONTROL" />, se pregunta al usuario si quiere usar los servicios de ubicación de Google. De esta forma, se permite que las aplicaciones Android usen estos servicios para consultar la ubicación del dispositivo y también se habilita el envío de datos de ubicación anónimos a Google.
+
+      Ten en cuenta que esta política controla el estado de los servicios de ubicación de Google solo durante la configuración inicial. El usuario podrá abrir los ajustes de Android más adelante y activar o desactivar los servicios de ubicación de Google.
+
+      Ten en cuenta que si a la política <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> se le asigna el valor <ph name="BLOCK_GEOLOCATION_SETTING" />, se ignorará esta política y los servicios de ubicación de Google están siempre inhabilitados.</translation>
 <translation id="6141402445226505817">Utilizar siempre la detección de zona horaria común</translation>
 <translation id="6145799962557135888">Permite establecer una lista de patrones de URL para especificar los sitios que no pueden ejecutar JavaScript.
 
@@ -2738,9 +2855,17 @@
       Si se inhabilita, no se importarán los datos autocompletados.
 
       Si no se configura, es posible que se solicite al usuario que importe los datos o que la importación se realice automáticamente.</translation>
+<translation id="6221175752766085998">Admite certificados emitidos por los anclajes de veracidad locales que no tienen la extensión subjectAlternativeName</translation>
 <translation id="6224304369267200483">Las URL y los dominios han permitido automáticamente la confirmación directa de la llave de seguridad</translation>
 <translation id="6233173491898450179">Establecer directorio de descargas</translation>
 <translation id="6244210204546589761">URL que se deben abrir al inicio</translation>
+<translation id="6255387031094435995">Permite combinar las políticas seleccionadas si proceden de fuentes distintas, con los mismos permisos y el mismo nivel.
+
+        Si una política está en la lista, en caso de que se produzca un conflicto entre dos fuentes que tengan los mismos permisos y el mismo nivel, los valores se combinarán en una nueva lista de políticas.
+
+        Si una política está en la lista, en caso de que se produzca un conflicto entre dos fuentes que tengan permisos o niveles distintos, se aplicará la política que tenga mayor prioridad.
+
+        Si una política no está en la lista, en caso de que se produzca algún conflicto entre las fuentes, los permisos o el nivel, se aplicará la política que tenga mayor prioridad.</translation>
 <translation id="6258193603492867656">Permite especificar si el SPN de Kerberos generado debe incluir un puerto no estándar.
 
           Si habilitas esta opción e introduces un puerto no estándar (un puerto que no sea ni el 80 ni el 443), este se incluirá en el SPN de Kerberos generado.
@@ -2942,6 +3067,7 @@
 <translation id="6757438632136860443">Permite configurar una lista de patrones de URL que especifican los sitios web que pueden ejecutar el complemento <ph name="FLASH_PLUGIN_NAME" />.
 
           Si esta política no se configura, se usará para todos los sitios web el valor general predeterminado que se indique en la política "DefaultPluginsSetting" (si se ha configurado) o las preferencias personales del usuario (en caso contrario).</translation>
+<translation id="6757613329154374267">Copia de seguridad y restauración habilitada</translation>
 <translation id="6762235610019366960">Permite controlar la presentación de contenido promocional y educativo que ocupe toda la pestaña en <ph name="PRODUCT_NAME" />.
 
       Si se habilita (si se le asigna el valor "True"), <ph name="PRODUCT_NAME" /> podrá mostrar a los usuarios contenido que ocupe toda la pestaña para proporcionarles información del producto.
@@ -2964,6 +3090,7 @@
       La cadena puede incluir las variables ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR} y ${MACHINE_NAME}, que se sustituirían por valores del dispositivo antes de que se utilice como nombre de host. El valor que resulte de la sustitución debe ser un nombre de host válido (de acuerdo con la sección 3.1 de la RFC 1035).
 
       Si no se asigna ningún valor a esta política o el valor que resulta después de la sustitución no es un nombre de host válido, no se establecerá ningún nombre de host en la solicitud DHCP. </translation>
+<translation id="6833988859168635883">Inicio, Página principal y página Nueva pestaña</translation>
 <translation id="6835883744948188639">Mostrar un mensaje periódico al usuario indicando que se recomienda reiniciar el navegador</translation>
 <translation id="6837480141980366278">Permite controlar si el cliente DNS integrado se utiliza en <ph name="PRODUCT_NAME" />.
 
@@ -3075,6 +3202,17 @@
 
       Cuando la pantalla esté a punto de atenuarse, el modelo de atenuación inteligente evaluará si esta acción debe aplazarse. Si esto ocurre, este modelo alargará el tiempo que debe pasar hasta que la pantalla se atenúe. En este caso, los retrasos por inactividad, para apagar la pantalla o para bloquearla se ajustan para que mantengan las mismas distancias con la atenuación de pantalla que se configuraron al principio.
       Si a esta política se le asigna el valor "True" o no se le asigna ningún valor, el modelo de atenuación inteligente se habilitará y podrá alargar el tiempo que debe pasar hasta que la pantalla se atenúe. Si se le asigna el valor "False", este modelo no afectará a la atenuación de la pantalla.</translation>
+<translation id="6967394885063085697">Habilita la política de gestión del modo avanzado de carga de la batería.
+
+          El modo avanzado de carga de la batería permite que el usuario maximice el estado de la batería. Cuando el sistema esté en modo de carga avanzado, usará un algoritmo de carga estándar y otras técnicas fuera del horario laboral para maximizar el estado de la batería. En horas de trabajo, se usará la carga exprés. La carga exprés permite que la batería se cargue rápidamente; por tanto, la batería tardará menos tiempo en cargarse completamente. Para cada día, el periodo de tiempo en el que el sistema se usa de manera más frecuente se especifica mediante la hora de inicio y la duración.
+
+          Si se asigna el valor "True" a esta política y DeviceAdvancedBatteryChargeModeDayConfig está configurada, el modo avanzado de carga de la batería siempre estará habilitado si el dispositivo lo admite.
+
+          Si se le asigna el valor "False", el modo avanzado de carga de la batería siempre estará inhabilitado.
+
+          Si se le asigna un valor a esta política, los usuarios no podrán cambiarla ni anularla.
+
+          Si no se le asigna ningún valor, el modo avanzado de carga de la batería está inhabilitado y el usuario no podrá habilitarlo.</translation>
 <translation id="6972540544240464302">Selecciona la configuración del programador de tareas</translation>
 <translation id="6979158407327259162">Google Drive</translation>
 <translation id="6994082778848658360">Especifica cómo se puede utilizar el hardware del elemento seguro integrado para proporcionar una autenticación de dos factores si es compatible con esta función. El botón de encendido del ordenador se utiliza para detectar la presencia física del usuario.
@@ -3152,6 +3290,17 @@
       Independientemente de que habilites o inhabilites esta opción, los usuarios no podrán modificarla ni anularla.
 
       Si no se establece esta política, los usuarios podrán decidir si quieren que sea necesaria una contraseña para volver a activar el dispositivo o no.</translation>
+<translation id="7107148737865880402">Habilita la política de gestión de potencia compartida por USB.
+
+          Algunos dispositivos tienen un puerto USB específico marcado con un icono de rayo o de batería, que puede usarse para cargar dispositivos (por ejemplo, un teléfono móvil) usando la batería del sistema. Esta política afecta al comportamiento de carga de este puerto cuando el sistema está en modo de suspensión o apagado. Esta política no afecta a los otros puertos USB ni al comportamiento de carga mientras el sistema está activo.
+
+          Cuando esté activo, el puerto USB siempre suministrará energía.
+
+          Cuando esté en modo de suspensión, si a esta política se le asigna el valor "True", se suministrará energía al puerto USB cuando el dispositivo esté conectado al cargador de pared o el nivel de la batería está por encima del 50 %. En caso contrario, no se suministrará energía.
+
+          Cuando esté apagado, si a esta política se le asigna el valor "True", se suministrará energía al puerto USB cuando el dispositivo esté conectado al cargador de pared. En caso contrario, no se suministrará energía.
+
+          Si no se asigna ningún valor a esta política, se habilitará la política y el usuario no podrá inhabilitarla.</translation>
 <translation id="7115494316187648452">Determina si un proceso de <ph name="PRODUCT_NAME" /> comienza en el inicio de sesión del sistema operativo y sigue ejecutándose cuando se cierra la última ventana del navegador, lo que permite que las aplicaciones en segundo plano y la sesión de navegación actual continúen activas, incluidas las cookies de sesión. El proceso en segundo plano muestra un icono en la bandeja del sistema y se puede cerrar desde ahí en cualquier momento.
 
       Si se asigna el valor true a esta política, se habilitará el modo de segundo plano y el usuario no podrá controlarlo desde la configuración del navegador.
@@ -3201,6 +3350,7 @@
           Si se le asigna el valor "True" a esta política o no se le asigna ningún valor, los wake locks de pantalla serán válidos para la gestión de energía, a no ser que se haya asignado el valor "False" a AllowWakeLocks.
 
           Si se le asigna el valor "False" a esta política, se disminuirá el nivel de las solicitudes de wake locks de pantalla y se convertirán en solicitudes de wake locks del sistema.</translation>
+<translation id="7177857088692019405">Desbloqueo rápido</translation>
 <translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="718956142899066210">Tipos de conexión permitidos para realizar actualizaciones</translation>
 <translation id="7194407337890404814">Nombre del proveedor de búsquedas predeterminadas</translation>
@@ -3265,6 +3415,7 @@
 <translation id="7273823081800296768">Si esta opción está habilita o no configurada, los usuarios podrán sincronizar los clientes y los hosts en el momento de la conexión, lo que elimina la necesidad de introducir siempre un PIN.
 
           Si no se habilita esta opción, esta función no estará disponible.</translation>
+<translation id="7274077256421167535">Habilita la potencia compartida por USB</translation>
 <translation id="7275334191706090484">Marcadores administrados</translation>
 <translation id="7291084543582732020">Si habilitas esta opción, los usuarios podrán utilizar Smart Lock siempre que se cumplan los requisitos establecidos para la función.
 
@@ -3404,6 +3555,15 @@
       Si se establece 0 como valor de esta política, se utilizará el tamaño de caché predeterminado, pero el usuario no podrá modificarlo.
 
       Si no se define esta política, se utilizará el tamaño predeterminado y el usuario podrá modificarlo mediante el indicador "--disk-cache-size".</translation>
+<translation id="759389052790680884">Establece un porcentaje personalizado de parada de carga para la batería.
+
+          La batería deja de cargarse cuando alcanza el valor personalizado de parada de carga.
+
+          El valor de DeviceBatteryChargeCustomStartCharging debe ser inferior al de DeviceBatteryChargeCustomStopCharging.
+
+          Esta política solo se usará si se asigna un valor personalizado a DeviceBatteryChargeMode.
+
+          Si no se configura esta política o no se le asigna ningún valor, se aplicará el modo estándar de carga de la batería.</translation>
 <translation id="759957074386651883">Configuración de Navegación Segura</translation>
 <translation id="7604169113182304895">Las aplicaciones para Android pueden aceptar esta lista voluntariamente. No se les puede forzar a que lo hagan.</translation>
 <translation id="7612157962821894603">Opciones que se deben aplicar al iniciar <ph name="PRODUCT_NAME" /> en todo el sistema</translation>
@@ -3482,6 +3642,15 @@
 <translation id="7712109699186360774">Preguntar siempre que un sitio quiera acceder a mi cámara o a mi micrófono</translation>
 <translation id="7713608076604149344">Restricciones de descarga</translation>
 <translation id="7715711044277116530">Porcentaje que permite ajustar el retraso de inactividad de la pantalla en el modo de presentación</translation>
+<translation id="7716781462866245042">Define la configuración diaria del modo avanzado de carga de la batería.
+
+          Esta política solo se utilizará si se le asigna el valor "True" a la política DeviceAdvancedBatteryChargeModeEnabled.
+
+          Si no se configura esta política o no se le asigna ningún valor, el modo avanzado de carga de la batería siempre estará inhabilitado.
+
+          Nota: El valor de <ph name="CHARGE_START_TIME_FIELD_NAME" /> debe ser inferior al de <ph name="CHARGE_END_TIME_FIELD_NAME" />.
+
+          Nota: Los valores permitidos para el campo <ph name="MINUTE_FIELD_NAME" /> en <ph name="CHARGE_START_TIME_FIELD_NAME" /> y <ph name="CHARGE_END_TIME_FIELD_NAME" /> son 0, 15, 30 y 45.</translation>
 <translation id="7717938661004793600">Permite configurar funciones de accesibilidad de <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7724994675283793633">Esta política habilita HTTP/0.9 en puertos diferentes a 80 en el caso de HTTP y 443 para HTTPS.
 
@@ -3555,6 +3724,7 @@
       Permite determinar el ID de la extensión que se debe utilizar como salvapantallas en la pantalla de inicio de sesión. La extensión debe formar parte del paquete AppPack configurado para ese dominio a través de la política DeviceAppPack.</translation>
 <translation id="7882857838942884046">Inhabilitar Google Sync provocará que Android Backup and Restore no funcione correctamente.</translation>
 <translation id="7882890448959833986">Eliminar la advertencia de SO no admitido</translation>
+<translation id="7895553628261067384">Acceso remoto</translation>
 <translation id="7902255855035461275">Los patrones de esta lista se compararán con el origen de seguridad de la URL solicitante. Si se encuentra alguna coincidencia, se concederá acceso a dispositivos de captura de vídeo sin solicitarlo.
 
 NOTA: Hasta la versión 45, esta política solo se admitía en modo kiosco.</translation>
@@ -3566,6 +3736,11 @@
 <translation id="7937491150792971922">Combina políticas de lista de instalación de extensiones de varias fuentes</translation>
 <translation id="7937766917976512374">Permitir o denegar captura de vídeo</translation>
 <translation id="7941975817681987555">No predecir las acciones de red en ninguna conexión de red</translation>
+<translation id="7952007677054834789">Permite configurar las páginas que se cargan al abrir el navegador, la página principal predeterminada y la página Nueva pestaña predeterminada en <ph name="PRODUCT_NAME" /> e impide que los usuarios las cambien.
+
+      Para bloquear completamente la configuración de la página de inicio del usuario, es necesario definirla como la página Nueva pestaña o definirla como URL y especificar una URL de página de inicio. Si no se especifica la URL de la página de inicio, el usuario podrá definir la página Nueva pestaña como página de inicio especificando "chrome://newtab".
+
+      Si no se selecciona la opción "Abrir una lista de URLs" en la política "Acción al iniciar", se ignorará la política "URLs que se deben abrir al inicio".</translation>
 <translation id="7952958573604504839">Esta política está obsoleta en M48 y cambia a <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />; se ha eliminado de M54.
 
       Permite habilitar la predicción de red en <ph name="PRODUCT_NAME" /> e impide que los usuarios cambien esta configuración.
@@ -3709,6 +3884,7 @@
 <translation id="8176035528522326671">Permitir que el usuario de empresa sea solo un usuario principal de varios perfiles (comportamiento predeterminado para usuarios administrados por empresas)</translation>
 <translation id="8214600119442850823">Permite configurar el Administrador de Contraseñas.</translation>
 <translation id="8217516105848565518">Esta política está obsoleta. Sustitúyela por la política RemoteAccessHostDomainList.</translation>
+<translation id="8244171102276095471">Habilita los conjuntos de cifrado de RC4 en TLS</translation>
 <translation id="8244525275280476362">Retraso de recuperación máximo después de validar una política</translation>
 <translation id="8256688113167012935">Permite controlar el nombre de la cuenta que <ph name="PRODUCT_OS_NAME" /> muestra en la pantalla de inicio de sesión para la cuenta local del dispositivo correspondiente.
 
@@ -3749,6 +3925,7 @@
 <translation id="8312129124898414409">Permite establecer si los sitios web tienen permiso para utilizar la generación de claves. El uso de la generación de claves se puede permitir o rechazar en todos los sitios web.
 
           Si no se establece esta política, se utilizará BlockKeygen y el usuario podrá modificarla.</translation>
+<translation id="8320149248919453401">Modo de carga de la batería</translation>
 <translation id="8329984337216493753">Esta política solo se encuentra activa en el modo de venta.
 
       Si se especifica DeviceIdleLogoutTimeout, esta política definirá la duración del cuadro de advertencia con un cuenta atrás que se mostrará al usuario antes de que se cierre la sesión.
@@ -3902,6 +4079,7 @@
       Si no se asigna ningún valor, se usará el periodo predeterminado de 345.600.000 milisegundos (cuatro días) para los dispositivos <ph name="PRODUCT_OS_NAME" /> y de 604.800.000 milisegundos (una semana) para <ph name="PRODUCT_NAME" />.</translation>
 <translation id="8685024486845674965">La advertencia de protección de contraseña se activa al reutilizar la contraseña</translation>
 <translation id="8693243869659262736">Utilizar cliente DNS integrado</translation>
+<translation id="8698286761337647563">Número de días de antelación para notificar a los usuarios de SAML que su contraseña está a punto de caducar</translation>
 <translation id="8703488928438047864">Informar sobre el estado de la placa</translation>
 <translation id="8703872185032220081">Define la configuración diaria de Peak Shift.
 
@@ -3954,6 +4132,7 @@
       Si se inhabilita esta opción o no se define, el servicio de protección de contraseñas enviará a los usuarios a la página https://myaccounts.google.com para que cambien su contraseña.
       Esta política solo está disponible en instancias de Windows que estén vinculadas a un dominio de <ph name="MS_AD_NAME" /> y en instancias de Windows 10 Pro o Enterprise que se hayan registrado para gestionar dispositivos.</translation>
 <translation id="8798099450830957504">Predeterminado</translation>
+<translation id="8800453707696044281">Define un porcentaje personalizado de la parada de carga de la batería</translation>
 <translation id="8801680448782904838">Informar al usuario de que es necesario o recomendable reiniciar el navegador o el dispositivo</translation>
 <translation id="8818173863808665831">Informa de la ubicación geográfica del dispositivo.
 
@@ -4080,6 +4259,11 @@
       Esta política solo afecta a los usuarios autenticados a través de SAML.
 
       El valor de la política se debe especificar en segundos.</translation>
+<translation id="9018338365267278833">Esta política eliminará las extensiones que aparecen en la <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> o las extensiones que aparecen en <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> cuyo modo de instalación esté bloqueado y eliminará definitivamente los datos locales del usuario.  Consulta la política de privacidad de las extensiones o la política de retención de datos para entender qué puede pasar con los datos de los usuarios que no se hayan almacenado localmente.
+
+      Si se habilita esta política, las extensiones incluidas en las listas mencionadas anteriormente (si ya están instaladas en el equipo) se eliminarán del equipo completamente (incluidos los datos locales del usuario).
+
+      Si se inhabilita esta política, las extensiones incluidas en las listas mencionadas anteriormente (si ya están instaladas en el equipo y están incluidas en la lista negra <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />) se inhabilitarán en el equipo pero no se desinstalarán.</translation>
 <translation id="9027787254195333560">Esta política permite configurar la imagen del avatar que representa al usuario en la pantalla de inicio de sesión. La política se establece especificando la URL desde la que <ph name="PRODUCT_OS_NAME" /> puede descargar la imagen del avatar y un hash criptográfico que se utiliza para verificar la integridad de la descarga. La imagen debe tener formato JPEG y un tamaño no superior a 512 KB. Se debe poder acceder a la URL sin autenticación.
 
       La imagen del avatar se descarga y se almacena en caché. Se volverá a descargar si se cambian la URL o el hash.
diff --git a/components/policy/resources/policy_templates_fil.xtb b/components/policy/resources/policy_templates_fil.xtb
index 68fc528..31383eab 100644
--- a/components/policy/resources/policy_templates_fil.xtb
+++ b/components/policy/resources/policy_templates_fil.xtb
@@ -54,6 +54,13 @@
 <translation id="1049138910114524876">Kino-configure ang lokal na ipinapatupad sa screen sa pag-sign in ng <ph name="PRODUCT_OS_NAME" />.
 
       Kung nakatakda ang patakarang ito, palaging ipapakita ang screen sa pag-sign in sa lokal na ibinigay ng unang value ng patakarang ito (tinukoy ang patakaran bilang listahan para sa forward compatibility).  Kung hindi nakatakda ang patakarang ito o nakatakda sa isang walang lamang listahan, ipapakita ang screen sa pag-sign in sa lokal ng huling session ng user.  Kung nakatakda ang patakarang ito sa value na isang hindi wastong lokal, ipapakita ang screen sa pag-sign in sa isang fallback na lokal (kasalukuyang en-US).</translation>
+<translation id="1052499923181221200">Walang epekto ang patakarang ito maliban kung ang SamlInSessionPasswordChangeEnabled ay true.
+      Kung true ang naturang patakaran, at nakatakda ang patakarang ito sa (halimbawa) 14, ang ibig sabihin ay aabisuhan ang mga user ng SAML nang 14 na araw na mas maaga na mag-e-expire na ang kanilang password sa isang partikular na petsa.
+      Pagkatapos ay maaayos nila ito kaagad sa pamamagitan ng pagbabago ng password habang nasa session at pag-update ng kanilang password bago ito mag-expire.
+      Pero ipapakita lang ang mga notification na ito kung ang impormasyon tungkol sa pag-expire ng password ay ipinadala sa device ng identity provider ng SAML habang nasa flow ng pag-log in ng SAML.
+      Kapag itinakda ang patakarang ito sa zero, ang ibig sabihin ay hindi aabisuhan ang mga user nang mas maaga - aabisuhan lang sila kapag nag-expire na ang password.
+
+      Kung nakatakda ang patakarang ito, hindi ito mababago o mao-override ng user.</translation>
 <translation id="1062011392452772310">I-enable ang malayuang pagpapatotoo para sa device</translation>
 <translation id="1062407476771304334">Palitan</translation>
 <translation id="1079801999187584280">Huwag payagan ang paggamit ng Mga Tool ng Developer</translation>
@@ -214,6 +221,7 @@
       Kung naka-enable ang patakaran, papayagan ang Google Assistant na i-access ang konteksto ng screen.
       Kung naka-disable ang patakaran, hindi papayagan ang Google Assistant na i-access ang konteksto ng screen.
       Kung hindi nakatakda, makakapagdesisyon ang mga user kung papayagan ba ang Google Assistant na i-access ang konteksto ng screen o hindi</translation>
+<translation id="1376119291123231789">I-enable ang advanced na battery charge mode</translation>
 <translation id="1383493480903114193">Sapilitang pinapagana ng patakarang ito ang networking code sa proseso ng browser.
 
       Naka-disable bilang default ang patakarang ito, at kung ii-enable, maaaring makaranas ang mga user ng mga isyu sa seguridad kapag na-sandbox ang proseso ng networking.
@@ -314,6 +322,18 @@
 <translation id="1477934438414550161">TLS 1.2</translation>
 <translation id="1502843533062797703">I-enable ang pag-block sa pagpasok ng third party software</translation>
 <translation id="1504431521196476721">Malayuang Pagpapatunay</translation>
+<translation id="1507382822467487898">
+          Kino-configure kung aling MAC (media access control) address ang gagamitin kapag nakakonekta ang dock sa device.
+
+          Kapag nakakonekta ang dock sa ilang modelo ng device, ginagamit ang nakatalagang MAC address ng dock ng device para matukoy ang device sa Ethernet bilang default. Nagbibigay-daan ang patakarang ito sa administrator na baguhin ang pinagmulan ng MAC address habang naka-dock.
+
+          Kung pinili ang 'DeviceDockMacAddress' o hinayaang hindi nakatakda ang patakaran, gagamitin ang nakatalagang MAC address ng dock ng device.
+
+          Kung pinili ang 'DeviceNicMacAddress,' ang NIC (network interface controller) MAC address ng device ang gagamitin.
+
+          Kung pinili ang 'DockNicMacAddress,' gagamitin ang NIC MAC address ng dock.
+
+          Hindi mababago ng user ang setting na ito.</translation>
 <translation id="1507957856411744193">Kung nakatakda ang patakarang ito sa true, kokonekta ang <ph name="PRODUCT_NAME" /> sa mga Cast device sa lahat ng IP address, hindi lang sa mga pribadong address ng RFC1918/RFC4193.
 
           Kung nakatakda ang patakarang ito sa false, kokonekta ang <ph name="PRODUCT_NAME" /> sa mga Cast device sa mga pribadong address ng RFC1918/RFC4193 lang.
@@ -750,6 +770,17 @@
 <translation id="2303795211377219696">I-enable ang AutoFill para sa mga credit card</translation>
 <translation id="2309390639296060546">Default na setting ng geolocation</translation>
 <translation id="2327252517317514801">Tumutukoy sa mga domain na pinapayagang i-access ang G Suite</translation>
+<translation id="2356878440219553005">Tumutukoy sa patakaran sa pamamahala ng power ng battery charge mode.
+
+          Dynamic na kontrolin ang pag-charge ng baterya para maiwasan ang pagkasira ng baterya dahil sa pagka-stress ng baterya at mapahaba ang tagal ng baterya.
+
+          Kung pinili ang custom na battery charge mode, dapat tukuyin ang DeviceBatteryChargeCustomStartCharging at DeviceBatteryChargeCustomStopCharging.
+
+          Kung nakatakda ang patakarang ito, ilalapat ang battery charge mode kung sinusuportahan sa device.
+
+          Kung hinayaang hindi nakatakda ang patakarang ito at sinusuportahan ang patakaran sa device, ilalapat ang karaniwang battery charge mode at hindi mababago ng user.
+
+          Tandaan: Kung tinukoy ang <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" />, io-override nito ang patakarang ito.</translation>
 <translation id="237494535617297575">Binibigyang-daan kang magtakda ng isang listahan ng mga pattern ng url na tumutukoy ng mga site na pinapayagang magpakita ng mga notification.
 
           Kung hinayaang hindi nakatakda ang patakarang ito gagamitin ang global na default na halaga para sa lahat ng site mula sa patakarang 'DefaultNotificationsSetting' kung hindi ito nakatakda, o kung hindi man ay sa personal na configuration ng user.</translation>
@@ -787,6 +818,7 @@
 
       Kung nakatakda sa False ang patakarang ito, hindi maba-bypass ang walang pagkaantalang awtomatikong pag-log in (kung naka-configure).</translation>
 <translation id="2454228136871844693">I-optimize para sa stability.</translation>
+<translation id="2463034609187171371">I-enable ang mga DHE cipher suite sa TLS</translation>
 <translation id="2463365186486772703">Lokal ng application</translation>
 <translation id="2466131534462628618">Binabalewala ng pagpapatotoo ng captive portal ang proxy</translation>
 <translation id="2482676533225429905">Native na Pagmemensahe</translation>
@@ -968,6 +1000,7 @@
 <translation id="2769952903507981510">I-configure ang kinakailangang domain name para sa mga host ng malayuang pag-access</translation>
 <translation id="2787173078141616821">Ulat ng impormasyon tungkol sa status ng Android</translation>
 <translation id="2799297758492717491">Payagan ang pag-autoplay ng media sa isang whitelist ng mga pattern ng URL</translation>
+<translation id="2801155097555584385">Itakda ang custom na pagsisimula ng pag-charge ng baterya sa porsyento</translation>
 <translation id="2801230735743888564">Nagbibigay-daan sa mga user na makapaglaro ng dinosaur easter egg game kapag offline ang device.
 
       Kung itatakda sa False ang patakarang ito, kapag naka-offline ang device, hindi makakapaglaro ng dinosaur easter egg game ang mga user. Kung itatakda naman sa True ang setting na ito, makakapaglaro ng dinosaur game ang mga user. Kung hindi itatakda ang patakarang ito, hindi makakapaglaro ng dinosaur easter egg game ang mga user na naka-enroll sa Chrome OS, ngunit sa ibang mga pagkakataon, maaari itong malaro ng mga user.</translation>
@@ -1041,6 +1074,7 @@
       Kung idi-disable mo ang setting na ito o hindi ka magtatakda ng value, gagamitin ng Preview ng Pag-print ang pinakahuling ginamit na printer bilang default na pagpipilian.
 
       Kung ie-enable mo ang setting na ito, gagamitin ng Preview sa Pag-print ang default na printer ng OS system bilang default na pagpipilian.</translation>
+<translation id="285627849510728211">Itakda ang advanced na battery charge mode day config</translation>
 <translation id="2856674246949497058">Mag-roll back at manatili sa target na bersyon kung mas bago ang bersyon ng OS kaysa sa target. Magsagawa ng powerwash habang nasa proseso.</translation>
 <translation id="2872961005593481000">Shut down</translation>
 <translation id="2873651257716068683">Ino-override ang default na laki ng page ng pag-print. Kung hindi available ang laki ng page, binabalewala ang patakarang ito.</translation>
@@ -1175,12 +1209,26 @@
 <translation id="3072045631333522102">Screen saver na gagamitin sa screen sa pag-sign-in sa mode ng retail</translation>
 <translation id="3072847235228302527">Itakda ang Mga Tuntunin ng Serbisyo para sa isang account na lokal sa device</translation>
 <translation id="3077183141551274418">Ine-enable o dini-disable ang mga lifecycle ng tab</translation>
+<translation id="3079417254871857650">Tinutukoy ang pagkilos na dapat gawin kapag binuo ang home directory ng user nang may encryptfs na pag-encrypt.
+
+      Kung itatakda mo ang patakarang ito sa 'DisallowArc,' madi-disable ang mga Android app para sa user at walang isasagawang paglilipat mula sa ecryptfs papunta sa ext4 na pag-encrypt. Hindi pipigilang tumakbo ang mga Android app kapag naka-encrypt na ang home directory gamit ang ext4.
+
+      Kung itatakda mo ang patakarang ito sa 'Migrate,' awtomatikong mama-migrate sa ext4 na pag-encrypt ang mga home directory na naka-encrypt gamit ang ecryptfs sa pag-sign in nang hindi humihingi ng pahintulot sa user.
+
+      Kung itatakda mo ang patakarang ito sa 'Wipe,' made-delete ang mga home directory na naka-encrypt gamit ang ecryptfs sa pag-sign in at gagawa na lang ng mga bagong home directory na naka-ecrypt gamit ang ext4. Babala: Aalisin nito ang lokal na data ng user.
+
+      Kung itatakda mo ang patakarang ito sa 'MinimalMigrate,' made-delete ang mga home directory na naka-encrypt gamit ang ecryptfs sa pag-sign in at gagawa na lang ng mga bagong home directory na naka-ecrypt gamit ang ext4. Gayunpaman, susubukang panatilhin ang mga token sa pag-log in para hindi na kailanganin ng user na muling mag-sign in. Babala: Aalisin nito ang lokal na data ng user.
+
+      Kung itatakda mo ang patakarang ito sa opsyong hindi na sinusuportahan ('AskUser' o 'AskForEcryptfsArcUsers'), ituturing na lang na para bang pinili mo ang 'Migrate.'
+
+      Hindi nalalapat ang patakarang ito sa mga kiosk user. Kung hahayaang hindi nakatakda ang patakarang ito, kikilos ang device na para bang pinili ang 'DisallowArc.'</translation>
 <translation id="3086995894968271156">I-configure ang Cast Receiver sa <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3088796212846734853">Binibigyang-daan kang magtakda ng listahan ng mga pattern ng url na tumutukoy ng mga site na pinapayagang magpakita ng mga larawan.
 
           Kung hahayaang hindi nakatakda ang patakarang ito, gagamitin ang pangkalahatang default na value para sa lahat ng site mula sa patakarang 'DefaultImagesSetting' kung itatakda ito, o kung hindi, sa personal na pag-configure ng user.
 
           Tandaang na-enable dati ang patakarang ito sa Android nang hindi sinasadya, ngunit hindi kailanman ganap na sinuportahan ang functionality na ito sa Android.</translation>
+<translation id="3091832372132789233">Nagcha-charge ng baterya para sa mga device na pangunahing nakakonekta sa external na pinagmumulan ng power.</translation>
 <translation id="3096595567015595053">Listahan ng mga pinaganang plugin</translation>
 <translation id="3101501961102569744">Pumili kung paano tukuyin ang mga setting ng proxy server</translation>
 <translation id="3101709781009526431">Petsa at oras</translation>
@@ -1206,6 +1254,7 @@
           Kung idi-disable ang setting na ito, gagamitin lang ng <ph name="PRODUCT_NAME" /> ang mga host ng Native na Pagmemensahe na naka-install sa antas ng system.
 
           Kung hahayaang hindi nakatakda ang setting na ito, mabibigyang-daan ng <ph name="PRODUCT_NAME" /> ang paggamit sa mga host ng Native na Pagmemensahe sa antas ng user.</translation>
+<translation id="3177802893484440532">Humingi ng mga online na pagsusuri sa OCSP/CRL para sa mga lokal na pinagkakatiwalaang anchor</translation>
 <translation id="3185009703220253572">mula pa noong bersyon <ph name="SINCE_VERSION" /></translation>
 <translation id="3187220842205194486">Hindi maaaring kumuha ng access ang mga Android app sa mga pangkorporasyong key. Walang epekto ang mga ito sa patakarang ito.</translation>
 <translation id="3205825995289802549">I-maximize ang unang window ng browser sa unang pagtakbo</translation>
@@ -1219,6 +1268,7 @@
 <translation id="3220624000494482595">Kung ang kiosk app ay isang Android app, wala itong kontrol sa bersyon ng <ph name="PRODUCT_OS_NAME" />, kahit na nakatakda ang patakarang ito sa <ph name="TRUE" />.</translation>
 <translation id="3236046242843493070">Mga pattern ng URL na bibigyang-daan ang mga manggagaling na pag-install ng extension, app, at script ng user</translation>
 <translation id="3240609035816615922">Patakaran sa pag-access ng configuration ng printer</translation>
+<translation id="3240655340884151271">Built-in na NIC MAC address ng dock</translation>
 <translation id="3243309373265599239">Tinutukoy ang tagal ng oras na walang input ng user na kapag lumipas ay idi-dim ang screen kapag tumatakbo habang nakasaksak sa kuryente.
 
           Kapag nakatakda ang patakarang ito sa halagang mas malaki kaysa sa zero, tinutukoy nito ang tagal ng oras na dapat manatiling idle ang user bago i-dim ng <ph name="PRODUCT_OS_NAME" /> ang screen.
@@ -1240,6 +1290,12 @@
       Kung pinagana o hindi naka-configure ang setting na ito, mapapagana ng mga user ang proxy ng cloud print proxy sa pamamagitan ng pagpapatotoo sa kanilang Google Account.
 
       Kung hindi pinapagana ang setting na ito, hindi mapapagana ng mga user ang proxy, at hindi papayagan ang machine na ibahagi ang mga printer nito sa <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3312206664202507568">Nag-e-enable ng page sa chrome://password-change na nagbibigay-daan sa mga user ng SAML na baguhin ang kanilang mga password sa SAML habang nasa session, na tumitiyak na ang password sa SAML at ang password ng lockscreen ng device ay nananatilingnaka-sync.
+
+      Ine-enable din ng patakarang ito ang mga notification na nagbababala sa mga user ng SAML kung malapit nang mag-expire ang kanilang mga password sa SAML para maayos nila ito kaagad sa pamamagitan ng pagbabago ng password habang nasa session.
+      Pero ipapakita lang ang mga notification na ito kung ang impormasyon tungkol sa pag-expire ng password ay ipinadala sa device ng identity provider ng SAML habang nasa flow ng pag-log in ng SAML.
+
+      Kung nakatakda ang patakarang ito, hindi ito mababago o mao-override ng user.</translation>
 <translation id="3322771899429619102">Binibigyang-daan ka na magtakda ng isang listahan ng mga pattern ng URL na tumutukoy sa mga site na pinapayagang gumamit ng pagbuo ng key. Kung ang isang pattern ng URL ay nasa 'KeygenBlockedForUrls,' ino-override nito ang mga pagbubukod na ito.
 
           Kung hinayaang hindi nakatakda ang patakarang ito, gagamitin ang default na pandaigdigang value para sa lahat ng site mula sa patakaran na 'DefaultKeygenSetting' kung nakatakda ito, o kung hindi naman ay sa personal na configuration ng user.</translation>
@@ -1325,6 +1381,7 @@
 
           Kung nakatakda ang patakarang ito sa False o iniwang hindi nakatakda, agad na tatakbo ang mga pagkaantala sa pamamahala sa power at ang limitasyon sa haba ng session sa pagsisimula ng session.</translation>
 <translation id="3478024346823118645">I-wipe ang data ng user sa pag-sign-out</translation>
+<translation id="3480961938508521469">Ganap na i-charge ang baterya sa karaniwang rate</translation>
 <translation id="348495353354674884">Paganahin ang virtual keyboard</translation>
 <translation id="3487623755010328395">
         Kung itatakda ang patakarang ito, susubukan ng <ph name="PRODUCT_NAME" /> na irehistro ang sarili nito at ilapat ang nauugnay na patakaran ng cloud para sa lahat ng profile.
@@ -1371,6 +1428,8 @@
 <translation id="3547954654003013442">Mga setting ng proxy</translation>
 <translation id="355118380775352753">Mga website na bubuksan sa alternatibong browser</translation>
 <translation id="3554984410014457319">Payagan ang Google Assistant na makinig sa parirala para sa pag-activate gamit ang boses</translation>
+<translation id="356579196325389849">Puwedeng i-configure ng mga user ang channel ng release ng Chrome OS</translation>
+<translation id="3575011234198230041">Pag-authenticate ng HTTP</translation>
 <translation id="3577251398714997599">Setting ng mga ad para sa mga site na may mga nakakasagabal na ad</translation>
 <translation id="357917253161699596">Payagan ang mga user na pamahalaan ang mga certificate ng user</translation>
 <translation id="3583230441447348508">Tumutukoy ng listahan ng mga naka-preconfigure na file share sa network.
@@ -1401,6 +1460,7 @@
 
         Ginagamit ang patakarang ito ng pag-enroll sa patakaran ng cloud ng saklaw ng machine sa desktop at maaari itong itakda ng Registry o GPO sa Windows, plist sa Mac, at JSON na file ng patakaran sa Linux.</translation>
 <translation id="3660562134618097814">Ilipat ang cookies ng SAML IdP sa pag-log in</translation>
+<translation id="3668151900457104753">I-uninstall ang mga naka-blacklist na extension</translation>
 <translation id="3701121231485832347">Nagkokontrol ng mga setting na partikular sa mga <ph name="PRODUCT_OS_NAME" /> device na pinapamahalaan ng <ph name="MS_AD_NAME" />.</translation>
 <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Hindi na ginagamit ang field na isang linya at aalisin ito sa hinaharap. Pakisimulang gamitin ang textbox na maraming linya sa ibaba.)</translation>
 <translation id="3709266154059827597">I-configure ang blacklist ng pag-install ng extension</translation>
@@ -1482,6 +1542,16 @@
           Kung iniwang hindi nakatakda ang patakarang ito, paunang idi-disable ang on-screen na keyboard ngunit maaaring i-enable ng user anumang oras.</translation>
 <translation id="382476126209906314">I-configure ang prefix ng TalkGadget para sa mga host ng malayuang pag-access</translation>
 <translation id="3824972131618513497">Nagkokontrol sa mga setting na nauugnay sa pamamahala ng power at pag-reboot.</translation>
+<translation id="3826475866868158882">Na-enable ang mga serbisyo ng lokasyon ng Google</translation>
+<translation id="3831054243924627613">Kinokontrol ng patakarang ito ang unang status ng pag-back up at pag-restore sa Android.
+
+      Kapag hindi naka-configure o naitakda ang patakarang ito sa <ph name="BR_DISABLED" />, idi-disable muna ang pag-back up at pag-restore sa Android.
+
+      Kapag naitakda ang patakarang ito sa <ph name="BR_ENABLED" />, idi-disable muna ang pag-back up at pag-restore sa Android.
+
+      Kapag naitakda ang patakarang ito sa <ph name="BR_UNDER_USER_CONTROL" />, hihilinging pumili ang user kung gagamitin ang pag-back up at pag-restore sa Android. Kung ie-enable ng user ang pag-back up at pag-restore, ia-upload ang data ng Android app sa mga server ng pag-back up sa Android at ire-restore mula sa mga ito kapag muling na-install ang app para sa mga tugmang app.
+
+      Tandaang kinokontrol ng patakarang ito ang status ng pag-back up at pag-restore ng Android habang isinasagawa lang ang unang pag-set up. Puwedeng buksan ng user ang mga setting ng Android pagkatapos at i-on/i-off ang pag-back up at pag-restore sa Android.</translation>
 <translation id="3831376478177535007">Kapag naka-enable ang setting na ito, papayagan ng <ph name="PRODUCT_NAME" /> ang mga certificate na ibinigay ng mga pagpapatakbo ng Legacy PKI ng Symantec Corporation na pagkatiwalaan kung matagumpay itong ma-validate at maiugnay sa isang kinikilalang CA certificate.
 
       Tandaan na ang patakarang ito ay nakadepende sa operating system na kumikilala pa rin sa mga certificate mula sa legacy na imprastraktura ng Symantec. Kung babaguhin ng update sa OS ang pangangasiwa sa mga naturang certificate, mawawalan na ng bisa ang patakarang ito. Bukod pa rito, nilalayon ng patakarang ito na maging isang pansamantalang solusyon upang mabigyan ang mga kumpanya ng higit pang oras upang makalipat mula sa mga legacy na certificate ng Symantec. Aalisin ang patakarang ito sa Enero 1, 2019 o malapit sa petsang ito.
@@ -1565,6 +1635,15 @@
 
           Kung hindi nakatakda o nakatakda sa False, makakapaglipat ang mga user ng mga file sa Google Drive.</translation>
 <translation id="3915395663995367577">URL sa proxy na .pac file</translation>
+<translation id="3920892052017026701">Itakda ang custiom na pagsisimula ng pag-charge ng baterya sa porsyento.
+
+          Magsisimulang mag-charge ang baterya kapag bumaba ito sa custom na value ng pagsisimula ng pag-charge ng baterya.
+
+          Ang DeviceBatteryChargeCustomStartCharging ay kailangang mas mababa sa DeviceBatteryChargeCustomStopCharging.
+
+          Ginagamit lang ang patakarang ito kung nakatakda sa custom ang DeviceBatteryChargeMode.
+
+          Kung hindi naka-configure o hinayaang hindi naitakda ang patakarang ito, ilalapat ang karaniwang battery charge mode.</translation>
 <translation id="3925377537407648234">Itakda ang resolution at scale factor ng display</translation>
 <translation id="3939893074578116847">Magpadala ng mga network packet sa server sa pamamahala upang masubaybayan ang online status, upang mabigyang-daan ang
       server na tukuyin kung offline ang device.
@@ -1695,6 +1774,7 @@
 <translation id="4150201353443180367">Display</translation>
 <translation id="4157003184375321727">I-ulat ang bersyon ng OS at firmware.</translation>
 <translation id="4157594634940419685">Payagan ang pag-access sa mga native na CUPS printer</translation>
+<translation id="4160962198980004898">Pinagmulan ng MAC address ng device kapag naka-dock</translation>
 <translation id="4163705126749612234">Kino-configure ang mga kinakailangang domain name sa client na ipapatupad sa mga client na may remote na access at pinipigilan ang mga user na baguhin ito.
 
           Kung ie-enable ang setting na ito, tanging ang mga client lang mula sa isa sa mga nakasaad na domain ang puwedeng kumonekta sa host.
@@ -1772,6 +1852,7 @@
       Tandaan na ang patakarang naglalaman ng app ID ay hindi nangangahulugang mae-enable ng user ang app bilang app sa paggawa ng tala sa lock screen - halimbawa, sa Chrome 61, may karagdagang paghihigpit ayon sa platform ang hanay ng mga available na app.
 
       Kung hindi nakatakda ang patakaran, walang ipapatupad na paghihigpit ang patakaran para sa hanay ng mga app na maaaring i-enable ng user sa lock screen.</translation>
+<translation id="4313767483634435271">Nakatalagang MAC address ng dock ng device</translation>
 <translation id="4322842393287974810">Payagan ang awtomatikong inilunsad na walang pagkaantalang kiosk app na kontrolin ang bersyon ng <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="4325690621216251241">Magdagdag ng button sa pag-logout sa tray ng system</translation>
 <translation id="4332177773549877617">Mga log event para sa mga pag-install ng Android app</translation>
@@ -1803,6 +1884,7 @@
 <translation id="4360826270668210664">Kung itatakda ang patakarang ito, hihilingin ng host na may remote na access sa mga client na magpapa-authenticate na magkaroon ng token ng pag-authenticate mula sa URL na ito para makakonekta. Dapat gamitin kasabay ng RemoteAccessHostTokenValidationUrl.
 
           Kasalukuyang naka-disable ang feature na ito sa server-side.</translation>
+<translation id="4363057787588706121">Payagang i-merge ang mga patakaran sa listahan mula sa iba't ibang pinagmulan</translation>
 <translation id="436581050240847513">I-ulat ang mga interface ng network ng device</translation>
 <translation id="4372704773119750918">Hindi pinapayagan ang enterprise user na maging bahagi ng multiprofile (pangunahin o pangalawa)</translation>
 <translation id="4377599627073874279">Payagan ang lahat ng mga site na ipakita ang lahat ng mga larawan</translation>
@@ -1976,6 +2058,7 @@
 <translation id="4826326557828204741">Pagkilos na gagawin kapag naabot na ang pagkaantala ng idle habang tumatakbo gamit ang power ng baterya</translation>
 <translation id="4832852360828533362">Pag-uulat ng user at device</translation>
 <translation id="4834526953114077364">Inaalis ang mga user na pinakahindi nagagamit kamakailan na hindi nag-log in sa loob ng nakalipas na 3 buwan hangga't magkaroon ng sapat na libreng espasyo</translation>
+<translation id="4835622243021053389">I-enable ang pag-authenticate ng NTLMv2.</translation>
 <translation id="4858735034935305895">Pinapayagan ang mode na fullscreen</translation>
 <translation id="4861767323695239729">I-configure ang mga pinapayagang pamamaraan ng pag-input sa isang session ng user</translation>
 <translation id="487460824085252184">Awtomatikong nagma-migrate, hindi humihingi ng pahintulot mula sa user.</translation>
@@ -2098,6 +2181,11 @@
 
       Hindi gaya ng <ph name="URL_LIST_POLICY_NAME" />, nalalapat sa magkabilang direksyon ang mga panuntunan. Ibig sabihin, kapag mayroon ng Internet Explorer add-in at naka-enable ito, kinokontrol din nito kung dapat buksan ng <ph name="IE_PRODUCT_NAME" /> ang mga URL na ito sa <ph name="PRODUCT_NAME" />.</translation>
 <translation id="5124368997194894978">I-enable ang boot on AC (alternating current)</translation>
+<translation id="5131211790949066746">Ine-enable ang pag-merge ng extension ng mga patakaran sa listahan ng pag-install ng extension na <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" />, at <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />.
+
+      Kung ie-enable mo ang setting na ito, ime-merge sa isang listahan ang mga value mula sa patakaran sa machine platform, machine cloud, at user platform, at gagamitin bilang isa sa halip na gamitin lang ang mga value mula sa iisang pinagmulan na may pinakamataas na priyoridad.
+
+      Kung idi-disable mo ang setting na ito o hahayaang hindi nakatakda, kukunin ang mga entry ng listahan mula sa pinagmulan na may pinakamataas na priyoridad lang at ipapakita ang lahat ng iba pang pinagmulan bilang problema pero hindi babalewalain.</translation>
 <translation id="5141670636904227950">Itakda ang default na uri ng magnifier ng screen na naka-enable sa screen sa pag-login</translation>
 <translation id="5142301680741828703">Palaging i-render ang mga sumusunod na pattern ng URL sa <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Binibigyang-daan kang tukuyin ang mga karagdagang parameter na ginagamit kapag nilunsad ng <ph name="PRODUCT_FRAME_NAME" /> ang <ph name="PRODUCT_NAME" />.
@@ -2217,6 +2305,7 @@
 
       Kung hindi nakatakda ang patakaran, o kung nakatakda ito sa walang lamang string o di-wastong hanay ng port, pinapayagan ang WebRTC na gamitin ang anumang available na lokal na UDP port.</translation>
 <translation id="5290940294294002042">Tumukoy ng listahan ng mga plugin na maaaring paganahin o hindi paganahin ng user</translation>
+<translation id="5306186200045823863">I-enable ang pagtitiwala sa Legacy PKI Infrastructure ng Symantec Corporation</translation>
 <translation id="5307432759655324440">Availability ng mode na incognito</translation>
 <translation id="5318185076587284965">I-enable ang paggamit ng mga relay server ng host ng malayuang pag-access</translation>
 <translation id="5323128137188992869">Binibigyang-daan ang content na ma-cast sa device gamit ang <ph name="PRODUCT_NAME" />.
@@ -2318,6 +2407,7 @@
       Kung nagsasalungat ang mga panuntunan, gagamitin ng <ph name="PRODUCT_NAME" /> ang pinakapartikular na panuntunan.</translation>
 <translation id="5475361623548884387">Paganahin ang pag-print</translation>
 <translation id="547601067149622666">Huwag payagan ang mga ad sa mga site na may mga nakakasagabal na ad</translation>
+<translation id="5483065054530244863">Payagan ang mga SHA-1 signed certificate na ibinigay ng mga lokal na pinagkakatiwalaang anchor</translation>
 <translation id="5483777239978559943">Hindi na ginagamit ang patakarang ito. Pakigamit ang <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> para kontrolin ang avalability ng Flash plugin at <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> para kontrolin kung dapat bang gamitin ang pinagsamang PDF viewer para sa pagbubukas ng mga PDF file.
 
       Nagsasaad ng listahan ng mga plugin na puwedeng i-enable o i-disable ng user sa <ph name="PRODUCT_NAME" />.
@@ -2435,6 +2525,17 @@
           Kung ie-enable o hindi mo itatakda ang patakarang ito, puwedeng tingnan ng mga user ang kanilang mga password sa malinaw na text sa password manager.</translation>
 <translation id="5620392548325769024">I-enable ang pagpapakita ng welcome page sa unang paglulunsad ng browser kasunod ng pag-upgrade ng OS</translation>
 <translation id="5630352020869108293">Ipanumbalik ang huling session</translation>
+<translation id="5643906875497889108">Kinokontrol kung aling uri ng app/extension ang pinapayagang ma-install at naglilimita ng access sa runtime.
+
+          Wina-whitelist ng setting na ito ang mga pinapayagang uri ng extension/mga app na puwedeng ma-install sa <ph name="PRODUCT_NAME" /> at kung sa aling host maaaring makipag-ugnayan ang mga ito. Ang value ay listahan ng mga string, na isa sa mga sumusunod dapat ang bawat isa: "extension", "theme", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". Tingnan ang dokumentasyon ng mga extension ng <ph name="PRODUCT_NAME" /> para sa higit pang impormasyon tungkol sa mga uring ito.
+
+          Tandaang naaapektuhan din ng patakarang ito na saplitinang ma-install ang mga extension at app sa pamamagitan ng ExtensionInstallForcelist.
+
+          Kung naka-configure ang setting na ito, hindi ii-install ang mga extension/app na may uring wala sa listahan.
+
+          Kung hinayaang hindi naka-configure ang setting na ito, walang ipinapatupad na paghihigpit sa mga katanggap-tanggap na uri ng extension/app.
+
+          Bago ang bersyon 75, ang paggamit ng maraming extension ID na painaghihiwalay ng kuwit ay hindi sinusuportahan at lalaktawan. Patuloy na malalapat ang iba pang bahagi ng patakaran.</translation>
 <translation id="5645779841392247734">Payagan ang cookies sa mga site na ito</translation>
 <translation id="5689430183304951538">Default na laki ng page ng pag-print</translation>
 <translation id="5693469654327063861">Payagan ang paglipat ng data</translation>
@@ -2474,6 +2575,7 @@
 <translation id="5765780083710877561">Paglalarawan:</translation>
 <translation id="5770738360657678870">Dev channel (maaaring hindi stable)</translation>
 <translation id="5774856474228476867">URL sa paghahanap ng default na provider ng paghahanap</translation>
+<translation id="5775235485119094648">I-charge ang baterya habang ito ay nasa nakapirming sakop.</translation>
 <translation id="5776485039795852974">Magtanong sa tuwing gustong ipakita ng site ang mga notification sa desktop</translation>
 <translation id="5781412041848781654">Tinutukoy kung aling library ng GSSAPI ang gagamitin para sa pagpapatotoo ng HTTP. Maaari kang magtakda ng pangalan ng library lang, o ng buong path.
 
@@ -2541,6 +2643,7 @@
 <translation id="5893553533827140852">Kung naka-enable ang setting na ito, ipo-proxy ang mga kahilingan sa pagpapatunay ng gnubby sa isang malayuang koneksyon sa host.
 
           Kung naka-disable o hindi naka-configure ang setting na ito, hindi ipo-proxy ang mga kahilingan sa pagpapatunay ng gnubby.</translation>
+<translation id="5897913798715600338">I-charge ang baterya gamit ang teknolohiyang mabilis na pag-charge.</translation>
 <translation id="5898486742390981550">Kapag maraming user ang naka-log in, ang pangunahing user lang ang maaaring gumamit ng mga Android app.</translation>
 <translation id="5900196529149231477">
       Nalalapat ang patakarang ito sa screen ng pag-sign in. Pakitingnan din ang patakarang <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> na nalalapat sa session ng user. Inirerekomendang itakda ang parehong patakatan sa iisang value. Kung hindi magtutugma ang mga value, maaaring magkaroon ng pagkaantala kapag pumapasok sa session ng user habang inilalapat ang value na tinukoy ng patakaran ng user.
@@ -2549,12 +2652,14 @@
       Kung hindi iko-configure ang patakaran, gagamitin ang mga default na setting ng pag-isolate ng site ng platform para sa screen ng pag-sign in.
       </translation>
 <translation id="5901427587865226597">Duplex na pag-print lang</translation>
+<translation id="5905473632148429217">I-enable ang mga online na pagsusuri sa OCSP/CRL</translation>
 <translation id="5906199912611534122">Pinapayagan ang pag-enable o pag-disable ng pag-throttle ng network.
       Naaangkop ito sa lahat ng user, at sa lahat ng interface sa device. Kapag naitakda na,
       magpapatuloy ang pag-throttle hanggang sa mabago ang patakaran upang i-disable na ito.
 
       Kung nakatakda sa false, walang pag-throttle.
       Kung nakatakda sa true, naka-throttle ang system upang makamit ang mga partikular na rate ng pag-upload at pag-download (sa kbits/s).</translation>
+<translation id="591088232153082363">Adaptive na pag-charge ng baterya batay sa pattern ng paggamit ng baterya.</translation>
 <translation id="5921713479449475707">Pinapayagan ang mga pag-download ng autoupdate sa pamamagitan ng HTTP</translation>
 <translation id="5921888683953999946">Itakda ang default na katayuan ng pagiging naa-access ng malaking cursor sa screen sa pag-login.
 
@@ -2576,6 +2681,7 @@
 <translation id="5950205771952201658">Dahil sa hindi nagbibigay ang mga soft-fail, online na pagsusuri sa pagbawi ng anumang benepisyo ng kaligtasan, dini-disable ang mga ito bilang default sa bersyon 19 ng <ph name="PRODUCT_NAME" /> at mas bago. Sa pamamagitan ng pagtatakda sa patakarang ito sa true, naibabalik ang nakaraang gawi at maisasagawa ang mga online na pagsusuri sa OCSP/CRL.
 
       Kung hindi nakatakda ang patakaran, o kung nakatakda sa false, ang <ph name="PRODUCT_NAME" /> ay hindi magsasagawa ng mga online na pagsusuri sa pagbawi sa <ph name="PRODUCT_NAME" /> 19 at mas bago.</translation>
+<translation id="5961137303188584693">Built-in na NIC MAC address ng device</translation>
 <translation id="5966615072639944554">Mga extension na pinapayagang gamitin ang API ng malayuang pagpapatotoo</translation>
 <translation id="5983708779415553259">Default na pagkilos para sa mga site na wala sa anumang pack ng nilalaman</translation>
 <translation id="5997543603646547632">Gamitin ang 24 na oras na orasan bilang default</translation>
@@ -2666,6 +2772,17 @@
 <translation id="6111936128861357925">Pahintulutan ang Dinosaur Easter Egg Game</translation>
 <translation id="6114416803310251055">hindi na ginagamit</translation>
 <translation id="6133088669883929098">Payagan ang lahat ng site na gumamit ng pagbuo ng key</translation>
+<translation id="6136537398661737682">Kinokontrol ng patakarang ito ang unang status ng mga serbisyo ng lokasyon ng Google.
+
+      Kapag hindi naka-configure o naitakda ang patakarang ito sa <ph name="GLS_DISABLED" />, idi-disable muna ang mga serbisyo ng lokasyon ng Google.
+
+      Kapag naitakda ang patakarang ito sa <ph name="GLS_ENABLED" />, idi-disable muna ang mga serbisyo ng lokasyon ng Google.
+
+      Kapag naitakda ang patakarang ito sa <ph name="GLS_UNDER_USER_CONTROL" />, hihilinging pumili ang user kung gagamitin ang mga serbisyo ng lokasyon ng Google. Papayagan nito ang mga Android app na gamitin ang mga serbisyo para i-query ang lokasyon ng device, at ie-enable ang pagsusumite ng anonymous na data ng lokasyon sa Google.
+
+      Tandaang kinokontrol ng patakarang ito ang status ng mga serbisyo ng lokasyon ng Google habang isinasagawa lang ang unang pag-set up. Puwedeng buksan ng user ang mga setting ng Android pagkatapos at i-on/i-off ang mga serbisyo ng lokasyon ng Google.
+
+      Tandaang binabalewala ang patakarang ito at palaging naka-disable ang mga serbisyo ng lokasyon ng Google kapag naitakda ang patakarang <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> sa <ph name="BLOCK_GEOLOCATION_SETTING" />.</translation>
 <translation id="6141402445226505817">Palaging gumamit ng hindi detalyadong pag-detect ng timezone</translation>
 <translation id="6145799962557135888">Binibigyang-daan kang magtakda ng isang listahan ng mga pattern ng url na tumutukoy ng mga site na pinapayagang magpatakbo ng JavaScript.
 
@@ -2741,9 +2858,17 @@
       Kung naka-disable, hindi ii-import ang data ng form ng autofill.
 
       Kung hindi ito nakatakda, maaaring hilingin sa user na mag-import o maaaring awtomatikong mangyari ang pag-import.</translation>
+<translation id="6221175752766085998">Payagan ang mga certificate na naisyu ng mga lokal na pinagkakatiwalaang anchor nang walang subjectAlternativeName na extension</translation>
 <translation id="6224304369267200483">Mga URL/domain na awtomatikong pinahintulutan ng direktang pagpapatunay ng Security Key</translation>
 <translation id="6233173491898450179">Itakda ang direktoryo sa pag-download</translation>
 <translation id="6244210204546589761">Mga bubuksang URL sa startup</translation>
+<translation id="6255387031094435995">Pinapayagan ang mga napiling patakaran na mag-merge kapag nanggaling sila sa iba't ibang pinagmulan, nang may parehong saklaw at antas.
+
+        Kung nasa listahan ang isang patakaran, at kung sakaling may salungatan sa pagitan ng dalawang pinagmulan, basta't may parehong saklaw at antas ang mga ito, ime-merge ang mga value sa isang bagong listahan ng patakaran.
+
+        Kung nasa listahan ang isang patakaran, at kung sakaling may salungatan sa pagitan ng dalawang pinagmulan pero magkaiba rin ang saklaw at/o antas, ilalapat ang patakarang may pinakamataas na priyoridad.
+
+        Kung nasa listahan ang isang patakaran, at kung sakaling may anumang salungatan sa pagitan ng mga pinagmulan, saklaw, at/o antas, ilalapat ang patakarang may pinakamataas na priyoridad.</translation>
 <translation id="6258193603492867656">Tinutukoy kung ang nabuong Kerberos SPN ay dapat na magsama ng port na hindi karaniwan.
 
           Kung pinagana mo ang setting na ito, at ang port na hindi karaniwan (ibig sabihin, isang port bukod sa 80 o 443) ay inilagay, isasama ito sa nabuong Kerberos SPN.
@@ -2945,6 +3070,7 @@
 <translation id="6757438632136860443">Nagbibigay-daan sa iyo na magtakda ng isang listahan ng mga pattern ng url na tumutukoy sa mga site na pinapahintulutang magpatakbo sa plugin na <ph name="FLASH_PLUGIN_NAME" />.
 
           Kung hahayaang hindi nakatakda ang patakarang ito, ang pangkalahatang default na value ang gagamitin para sa lahat ng site na magmumula sa patakarang 'DefaultPluginsSetting' kung nakatakda ito, o kung hindi, sa personal na configuration ng user.</translation>
+<translation id="6757613329154374267">Naka-enable ang pag-back up at pag-restore</translation>
 <translation id="6762235610019366960">Pinapayagan kang kontrolin ang presentasyon ng full-tab na pampromosyon at/o pang-edukasyong content sa <ph name="PRODUCT_NAME" />.
 
       Kung hindi naka-configure o naka-enable (nakatakda sa true), maaaring ipakita ng <ph name="PRODUCT_NAME" /> ang full-tab na content sa mga user para magbigay ng impormasyon ng produkto.
@@ -2967,6 +3093,7 @@
       Ang string ay maaaring magkaroon ng mga variable na ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR}, ${MACHINE_NAME} na papalitan ng mga value sa device bago gamitin bilang hostname. Ang resultang kapalit ay dapat valid na hostname (alinsunod sa RFC 1035, seksyon 3.1).
 
       Kung hindi itatakda ang patakarang ito, o hindi valid na hostname ang value pagkatapos ng pagpapalit, walang itatakdang hostname sa kahilingan ng DHCP. </translation>
+<translation id="6833988859168635883">Startup, Home page at page ng Bagong Tab</translation>
 <translation id="6835883744948188639">Magpakita sa user ng umuulit na prompt na nagsasaad na inirerekomenda ang muling paglulunsad</translation>
 <translation id="6837480141980366278">Nagkokontrol kung gagamitin ang built-in na DNS client sa <ph name="PRODUCT_NAME" />.
 
@@ -3080,6 +3207,17 @@
 
       Kapag malapit nang ma-dim ang screen, sinusuri ng smart dim model kung dapat bang ipagpaliban ang pag-dim ng screen. Kung ipapagpaliban ng smart dim model ang pag-dim ng screen, papatagalin din nito ang oras bago ma-dim ang screen. Sa ganitong sitwasyon, maisasaayos ang pag-off ng screen, lock ng screen, at ang mga pagkaantala ng idle para mapanatili ang parehong mga pagitan mula sa pagkaantala ng pag-dim ng screen gaya ng orihinal na na-configure.
       Kung itatakda ang patakarang ito sa True o hahayaang hindi nakatakda, mae-enable ang smart dim model at papayagang patagalin ang oras bago ma-dim ang screen. Kung itatakda ang patakarang ito sa False, hindi maaapektuhan ng smart dim model ang pag-dim ng screen.</translation>
+<translation id="6967394885063085697">I-enable ang patakaran sa pamamahala ng advanced na battery charge mode.
+
+          Nagbibigay-daan ang Advanced na Battery Charging Mode sa user na masulit ang charge ng baterya. Sa Advanced na Charging Mode, gagamit ang system ng karaniwang algorithm sa pag-charge at iba pang diskarte habang hindi oras ng trabaho para masulit ang charge ng baterya. Habang oras ng trabaho, gumagamit ng mabilis na pag-charge. Nagbibigay-daan ang mabilis na pag-charge na ito na ma-charge ang baterya nang mas mabilis; samakatuwid, mas mabilis na napupuno ang charge ng baterya. Para sa bawat araw, ang oras kung kailan pinakaginagamit ang system ay tutukuyin bilang ang oras ng pagsisimula at ang tagal.
+
+          Kung nakatakda ang patakarang ito sa true, at nakatakda ang DeviceAdvancedBatteryChargeModeDayConfig, naka-enable ang advanced na battery charge mode sa lahat ng oras kung sinusuportahan sa device.
+
+          Kung nakatakda ang patakarang ito sa false, naka-disable ang advanced na battery charge mode sa lahat ng oras.
+
+          Kung itatakda mo ang patakarang ito, hindi ito mababago o mao-override ng mga user.
+
+          Kung hahayaang hindi nakatakda ang patakarang ito, naka-disable ang advanced na battery charge mode at hindi mae-enable ng user.</translation>
 <translation id="6972540544240464302">Pumili ng configuration ng scheduler ng gawain</translation>
 <translation id="6979158407327259162">Google Drive</translation>
 <translation id="6994082778848658360">Tinutukoy kung paano magagamit ang kasamang hardware ng secure na elemento upang magbigay ng pangalawang factor ng pag-authenticate kung tugma ito sa feature na ito. Ginagamit ang power button ng machine upang tukuyin ang aktwal na presensya ng user.
@@ -3157,6 +3295,17 @@
       Kung ie-enable o idi-disable mo ang setting na ito, hindi ito mababago o mao-override ng mga user.
 
       Kung hindi nakatakda ang patakaran, makakapili ang user kung gusto niyang mahingan ng password upang i-unlock ang device o hindi.</translation>
+<translation id="7107148737865880402">I-enable ang patakaran sa pamamahala ng pagbabahagi ng power ng USB.
+
+          Ang ilang partikular na device ay may partikular na port ng USB na may marka ng icon na kidlat o baterya na magagamit para mag-charge ng mga device gaya ng mobile phone gamit ang baterya ng system. Naaapektuhan ng patakarang ito ang gawi sa pag-charge ng port na ito habang nasa sleep at shut down mode ang system. Hindi naaapektuhan ng patakarang ito ang iba pang port ng USB at ang gawi sa pag-charge habang aktibo ang system.
+
+          Kapag aktibo, magbibigay ng power ang port ng USB sa lahat ng oras.
+
+          Kapag naka-sleep, kung nakatakda ang patakarang ito sa true, magbibigay ng power sa port ng USB kapag nakasaksak ang device sa wall charger o kung &gt; 50% ang antas ng baterya. Kung hindi, walang ibibigay na power.
+
+          Kapag naka-shut down, kung nakatakda ang patakarang ito sa true, magbibigay ng power sa port ng USB kapag nakasaksak ang device sa wall charger. Kung hindi, walang ibibigay na power.
+
+          Kung hahayaang hindi nakatakda ang patakarang ito, naka-enable ang patakaran at hindi madi-disable ng user.</translation>
 <translation id="7115494316187648452">Tinutukoy kung sinimulan ang isang proseso ng <ph name="PRODUCT_NAME" /> sa pag-login ng OS at patuloy na tumatakbo kapag isinara ang huling window ng browser, na nagbibigay-daan sa mga app sa background at sa kasalukuyang session sa pagba-browse na manatiling aktibo, kabilang ang anumang cookies ng session. Nagpapakita ang proseso sa background ng icon sa system tray at maaaring maisara kailanman mula roon.
 
       Kung nakatakda sa True ang patakarang ito, naka-enable ang background mode at hindi makokontrol ng user sa mga setting ng browser.
@@ -3207,6 +3356,7 @@
           Kung nakatakda sa true o hahayaang hindi nakatakda ang patakarang ito, gagamitin ang mga wake lock ng screen para sa pamamahala ng power, maliban na lang kung nakatakda sa false ang AllowWakeLocks.
 
           Kung nakatakda sa false ang patakarang ito, ide-demote ang mga kahilingan sa wake lock ng screen sa mga kahilingan sa wake lock ng system.</translation>
+<translation id="7177857088692019405">Mabilisang pag-unlock</translation>
 <translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="718956142899066210">Mga uri ng koneksyon na pinapayagan para sa mga update</translation>
 <translation id="7194407337890404814">Pangalan ng default na provider ng paghahanap</translation>
@@ -3271,6 +3421,7 @@
 <translation id="7273823081800296768">Kung naka-enable o hindi na-configure ang setting na ito, maaaring mag-opt ang mga user na ipares ang mga client at host sa oras ng koneksyon, na inaalis ang pangangailangang maglagay ng PIN sa bawat pagkakataon.
 
           Kung naka-disable ang setting na ito, hindi magiging available ang tampok na ito.</translation>
+<translation id="7274077256421167535">I-enable ang pagbabahagi ng power ng USB</translation>
 <translation id="7275334191706090484">Mga Pinamamahalaang Bookmark</translation>
 <translation id="7291084543582732020">Kung ie-enable mo ang setting na ito, papayagan ang mga user na gamitin ang Smart Lock kung matutugunan ang mga kinakailangan para sa feature.
 
@@ -3410,6 +3561,15 @@
       Kung ang value ng patakarang ito ay 0, gagamitin ang default na laki ng cache ngunit hindi ito mababago ng user.
 
       Kung hindi nakatakda ang patakarang ito, gagamitin ang default na laki at ma-o-override ito ng user gamit ang --disk-cache-size flag.</translation>
+<translation id="759389052790680884">Itakda ang custom na paghinto ng pag-charge ng baterya sa porsyento.
+
+          Hihinto ang pag-charge ng baterya kapag naabot nito ang custom na value ng paghinto ng pag-charge ng baterya.
+
+          Ang DeviceBatteryChargeCustomStartCharging ay kailangang mas mababa sa DeviceBatteryChargeCustomStopCharging.
+
+          Ginagamit lang ang patakarang ito kung nakatakda sa custom ang DeviceBatteryChargeMode.
+
+          Kung hindi naka-configure o hinayaang hindi naitakda ang patakarang ito, ilalapat ang karaniwang battery charge mode.</translation>
 <translation id="759957074386651883">Mga setting ng Ligtas na Pag-browse</translation>
 <translation id="7604169113182304895">Maaaring boluntaryong piliin ng mga Android app na kilalanin ang listahang ito. Hindi mo mapipilit ang mga ito na kilalanin iyon.</translation>
 <translation id="7612157962821894603">Mga flag sa buong system na ilalapat sa pag-start up ng <ph name="PRODUCT_NAME" /></translation>
@@ -3489,6 +3649,15 @@
 <translation id="7712109699186360774">Tanungin ako sa tuwing may site na nais i-access ang camera at/o mikropono</translation>
 <translation id="7713608076604149344">Mga paghihigpit sa pag-download</translation>
 <translation id="7715711044277116530">Porsyento ng pag-scale sa pag-aantala ng pagdilim ng screen sa presentation mode</translation>
+<translation id="7716781462866245042">Itakda ang advanced na battery charge mode day config.
+
+          Ginagamit lang ang patakarang ito kung nakatakda sa true ang DeviceAdvancedBatteryChargeModeEnabled.
+
+          Kung hindi naka-configure o hinayaang hindi nakatakda ang patakarang ito, naka-disable ang advanced na battery charge mode sa lahat ng oras.
+
+          Tandaan: Ang <ph name="CHARGE_START_TIME_FIELD_NAME" /> ay dapat mas mababa sa <ph name="CHARGE_END_TIME_FIELD_NAME" />.
+
+          Tandaan: ang mga pinapayagang value para sa field na <ph name="MINUTE_FIELD_NAME" /> sa <ph name="CHARGE_START_TIME_FIELD_NAME" /> at <ph name="CHARGE_END_TIME_FIELD_NAME" /> ay 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600">I-configure ang mga tampok sa accessibility ng <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7724994675283793633">Ini-enable ng patakarang ito ang HTTP/0.9 sa mga port maliban sa 80 para sa HTTP at 443 para sa HTTPS.
 
@@ -3562,6 +3731,7 @@
       Tinutukoy ang id ng extension na gagamitin bilang isang screen saver sa screen sa pag-sign-in. Ang extension ay dapat na bahagi ng AppPack na naka-configure para sa domain na ito sa pamamagitan ng patakarang AppPacks.</translation>
 <translation id="7882857838942884046">Kapag na-disable ang Google Sync, hindi gagana nang maayos ang Pag-back up at Pag-restore sa Android.</translation>
 <translation id="7882890448959833986">Pigilan ang babala ng hindi sinusuportahang OS</translation>
+<translation id="7895553628261067384">Malayuang pag-access</translation>
 <translation id="7902255855035461275">Itutugma ang mga pattern sa listahang ito sa security
       origin ng humihiling na URL.  Kung makakakita ng katugma, magbibigay ng access sa mga device na nagka-capture ng video
       nang walang prompt.
@@ -3575,6 +3745,11 @@
 <translation id="7937491150792971922">I-merge ang mga patakaran sa listahan ng pag-install ng extension mula sa maraming pinagmulan</translation>
 <translation id="7937766917976512374">Payagan o tanggihan ang pagkuha ng video</translation>
 <translation id="7941975817681987555">Huwag hulaan ang mga pagkilos sa network sa anumang koneksyon sa network</translation>
+<translation id="7952007677054834789">Kino-configure ang mga page na ilo-load sa startup, sa default na home page at sa default na page ng bagong tab sa <ph name="PRODUCT_NAME" /> at pinipigilan ang mga user na baguhin ang mga ito.
+
+      Ang mga setting ng home page ng user ay ganap lang na naka-lock down kung pinili mo ang home page para maging page ng bagong tab, o itinakda mo ito para maging URL at tumukoy ng URL ng home page. Kung hindi mo tutukuyin ang URL ng home page, maitatakda pa rin ng user ang home page sa page ng bagong tab sa pamamagitan ng pagtukoy sa 'chrome://newtab.'
+
+      Babalewalain ang patakarang 'Mga bubuksang URL sa startup' maliban kung pipiliin mo ang 'Buksan ang isang listahan ng mga URL' sa 'Pagkilos sa startup.'</translation>
 <translation id="7952958573604504839">Hindi na ginagamit ang patakarang ito sa M48 at pinalitan na ng <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />, at inalis sa M54.
 
       Ine-enable ang paghula ng network sa <ph name="PRODUCT_NAME" /> at pinipigilan ang mga user na palitan ang setting na ito.
@@ -3718,6 +3893,7 @@
 <translation id="8176035528522326671">Payagan ang user ng enterprise na maging pangunahing multiprofile na user lang (Default na pag-uugali para sa mga user na pinamamahalaan ng enterprise)</translation>
 <translation id="8214600119442850823">Kino-configure ang password manager.</translation>
 <translation id="8217516105848565518">Hindi na ginagamit ang patakarang ito. Pakigamit na lang ang RemoteAccessHostDomainList.</translation>
+<translation id="8244171102276095471">I-enable ang mga RC4 cipher suite sa TLS</translation>
 <translation id="8244525275280476362">Maximum na pagkaantala ng pagkuha pagkatapos matukoy na di-wasto ang patakaran</translation>
 <translation id="8256688113167012935">Kinokontrol ang pangalan ng account na <ph name="PRODUCT_OS_NAME" /> na nakikita sa screen sa pag-login para sa katumbas na account na lokal sa device.
 
@@ -3758,6 +3934,7 @@
 <translation id="8312129124898414409">Binibigyang-daan ka na itakda kung pinapayagan ang mga website na gumamit ng pagbuo ng key. Ang paggamit ng pagbuo ng key ay maaaring pinapayagan para sa lahat ng website o tinatanggihan para sa lahat ng website.
 
           Kung hinayaang hindi nakatakda ang patakarang ito, gagamitin ang 'BlockKeygen' at magagawa itong baguhin ng isa pang user.</translation>
+<translation id="8320149248919453401">Battery charge mode</translation>
 <translation id="8329984337216493753">Sa mode ng retail lamang aktibo ang patakarang ito.
 
       Kapag nakatukoy ang DeviceIdleLogoutTimeout, tinutukoy ng patakarang ito ang tagal ng kahon ng babala gamit ang count down timer na ipinapakita sa user bago isagawa ang pag-logout.
@@ -3923,6 +4100,7 @@
       Kung hindi itatakda, ang default na yugto ng panahong 345600000 millisecond (apat na araw) ang gagamitin para sa mga <ph name="PRODUCT_OS_NAME" /> device at 604800000 millisecond (isang linggo) ang gagamitin para sa <ph name="PRODUCT_NAME" />.</translation>
 <translation id="8685024486845674965">Ang babala ng proteksyon sa password ay nati-trigger ng muling paggamit ng password</translation>
 <translation id="8693243869659262736">Gamitin ang built-in na DNS client</translation>
+<translation id="8698286761337647563">Ilang araw nang mas maaga bago abisuhan ang mga user ng SAML kapag malapit nang mag-expire ang kanilang password</translation>
 <translation id="8703488928438047864">Iulat ang status ng board</translation>
 <translation id="8703872185032220081">Itakda ang power peak shift day config.
 
@@ -3975,6 +4153,7 @@
       Kung naka-disable o hindi nakatakda ang setting na ito, dadalhin ng serbisyo ng proteksyon sa password sa https://myaccounts.google.com ang mga user para mapalitan nila ang kanbilang password.
       Available lang ang patakarang ito sa mga instance ng Windows na kasama sa domain ng<ph name="MS_AD_NAME" />. O kaya, sa mga instance ng Windows 10 Pro o Enterprise na naka-enroll para sa pamamahala sa device.</translation>
 <translation id="8798099450830957504">Default</translation>
+<translation id="8800453707696044281">Itakda ang custom na paghinto ng pag-charge ng baterya sa porsyento.</translation>
 <translation id="8801680448782904838">Abisuhan ang user na inirerekomenda o kinakailangang muling ilunsad ang browser o i-restart ang device</translation>
 <translation id="8818173863808665831">I-ulat ang heyograpikong lokasyon ng device.
 
@@ -4102,6 +4281,11 @@
       Naaapektuhan lang ng patakarang ito ang mga user na nag-authenticate gamit ang SAML.
 
       Dapat ay nakasaad ang value ng patakaran sa pamamagitan ng segundo.</translation>
+<translation id="9018338365267278833">Aalisin nito ang mga extension na lumalabas sa <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> o mga extension na lumalabas sa <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> na may installation mode na nakatakda sa naka-block at ipu-purge ang lokal na data ng user kasama nito.  Sumangguni sa patakaran sa privacy ng mga extension o patakaran sa pagpapanatili ng data para maunawaan kung ano ang puwedeng mangyari sa data ng user na hindi naka-store nang lokal.
+
+      Kapag nakatakda ang patakaran sa naka-enable, aalisin ang mga extension na nasa mga nabanggit na listahan (kung naka-install na sa machine) mula sa naturang machine nang buo (kasama ang lokal na data ng user).
+
+      Kapag nakatakda ang patakaran sa naka-disable o hinayaang hindi nakatakda, idi-disable ang mga extension na nasa mga nabanggit na listahan (kung naka-install na sa machine at nasa blacklist na <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />) sa machine at hindi ii-install.</translation>
 <translation id="9027787254195333560">Nagbibigay-daan sa iyo ang patakarang ito na i-configure ang larawan ng avatar na kumakatawan sa user sa screen sa pag-log in. Itinatakda ang patakaran sa pamamagitan ng pagtukoy sa URL kung saan mada-download ng <ph name="PRODUCT_OS_NAME" /> ang larawan ng avatar at isang cryptographic na hash na ginagamit para i-verify ang integridad ng download. Dapat ay nasa format na JPEG ang larawan, hindi dapat lumampas sa 512kB ang laki nito. Dapat ay accessible ang URL nang walang anumang pag-authenticate.
 
       Dina-download at kina-cache ang larawan ng avatar. Muli itong ida-download sa tuwing magbabago ang URL o ang hash.
diff --git a/components/policy/resources/policy_templates_hi.xtb b/components/policy/resources/policy_templates_hi.xtb
index ceec0c96..70cff35 100644
--- a/components/policy/resources/policy_templates_hi.xtb
+++ b/components/policy/resources/policy_templates_hi.xtb
@@ -380,7 +380,7 @@
       अगर आप यह नीति सेट करते हैं, तो इस्तेमाल करने वाले लोग न तो इसे बदल सकते हैं, न ही ओवरराइड कर सकते हैं.</translation>
 <translation id="1617235075406854669">ब्राउज़र और डाउनलोड इतिहास मिटाना चालू करें</translation>
 <translation id="163200210584085447">इस सूची के पैटर्न का मिलान अनुरोध करने वाले
-      यूआरएल के सुरक्षा मूल से किया जाएगा.  यदि मिलान हो जाता है, तो SAML लॉगिन पेजों
+      यूआरएल के सुरक्षा मूल से किया जाएगा.  अगर मिलान हो जाता है, तो SAML लॉगिन पेजों
       पर वीडियो कैप्चर डिवाइस का एक्सेस दे दिया जाएगा.  अगर कोई मिलान नहीं
       होता है, तो एक्सेस अपने आप मना कर दिया जाएगा.  वाइल्डकार्ड पैटर्न की 
       मंज़ूरी नहीं हैं.</translation>
@@ -446,7 +446,7 @@
 
       नीति को किसी ऐसे यूआरएल से जोड़ा जाना चाहिए जिससे <ph name="PRODUCT_OS_NAME" /> सेवा की शर्तें डाउनलोड कर सके. सेवा की शर्तें सामान्य लेख में होनी चाहिए जिसे एमआईएमई किस्म के लेख/सामान्य के रूप में दिया गया हो. किसी मार्कअप की अनुमति नहीं है.</translation>
 <translation id="1750315445671978749">सभी डाउनलोड ब्लॉक करें</translation>
-<translation id="1781356041596378058">यह नीति Android डेवलपर के लिए सेटिंग और टूल का एक्सेस भी नियंत्रित करती है. अगर आप इस नीति को सही पर सेट करते हैं, तो उपयोगकर्ता डेवलपर विकल्प का एक्सेस नियंत्रित नहीं कर सकते. यदि आप इस नीति को गलत पर सेट करते हैं या सेट किए बिना छोड़ देते हैं, तो उपयोगकर्ता Android सेटिंग ऐप्लिकेशन में बिल्ड संख्या पर सात बार टैप करके डेवलपर विकल्प एक्सेस कर सकते हैं.</translation>
+<translation id="1781356041596378058">यह नीति Android डेवलपर के लिए सेटिंग और टूल का एक्सेस भी नियंत्रित करती है. अगर आप इस नीति को सही पर सेट करते हैं, तो उपयोगकर्ता डेवलपर विकल्प का एक्सेस नियंत्रित नहीं कर सकते. अगर आप इस नीति को गलत पर सेट करते हैं या सेट किए बिना छोड़ देते हैं, तो उपयोगकर्ता Android सेटिंग ऐप्लिकेशन में बिल्ड संख्या पर सात बार टैप करके डेवलपर विकल्प एक्सेस कर सकते हैं.</translation>
 <translation id="1793346220873697538">पिन प्रिंट करने की सुविधा डिफ़ॉल्ट रूप से बंद करें</translation>
 <translation id="1797233582739332495">उपयोगकर्ता को बार-बार यह सूचित करने वाला संकेत दिखाएं कि फिर से लॉन्च करना ज़रूरी है</translation>
 <translation id="1798559516913615713">जीपीओ संग्रह जीवनकाल</translation>
@@ -553,7 +553,7 @@
 <translation id="1956493342242507974"><ph name="PRODUCT_OS_NAME" /> में प्रवेश स्क्रीन पर पावर प्रबंधन कॉन्फ़िगर करें.
 
       यह नीति लॉगिन स्क्रीन के दिखाई देने पर कुछ समय के लिए कोई भी उपयोगकर्ता गतिविधि नहीं होने पर आपको <ph name="PRODUCT_OS_NAME" /> के व्यवहार करने के तरीके को कॉन्फ़िगर करने देती है. नीति एक से ज़्यादा सेटिंग नियंत्रित करती है. उनके व्यक्तिगत सीमेंटिक और मान श्रेणियों के लिए, सत्र में पावर प्रबंधन को नियंत्रित करने वाली संबंधित नीतियां देखें. इन नीतियों के साथ भिन्नताएं निम्न हैं:
-      * निष्क्रिय या लिड बंद होने पर की जाने वाली कार्रवाई सत्र को समाप्त करने के लिए नहीं हो सकतीं.
+      * निष्क्रिय या लिड बंद होने पर की जाने वाली कार्रवाई सत्र को खत्म करने के लिए नहीं हो सकतीं.
       *  AC पावर पर चलते समय निष्क्रिय होने पर की जाने वाली डिफ़ॉल्ट कार्रवाई शट डाउन करना है.
 
       अगर कोई सेटिंग अनिर्दिष्ट छोड़ दी जाती है, तो डिफ़ॉल्ट मान का उपयोग किया जाता है.
@@ -573,7 +573,7 @@
 <translation id="1969808853498848952">हमेशा ऐसे प्लग इन चलाती है जिन्हें अनुमति की ज़रूरत होती है (समर्थन नहीं होना)</translation>
 <translation id="1988371335297483117"><ph name="PRODUCT_OS_NAME" /> पर अपने आप अपडेट पेलोड HTTPS के बजाय HTTP के ज़रिए डाउनलोड किए जा सकते हैं. इससे HTTP डाउनलोड का 'पारदर्शी HTTPS कैश' हो पाता है.
 
-      यदि यह नीति 'सही' पर सेट है, तो <ph name="PRODUCT_OS_NAME" /> HTTP के द्वारा स्वत: अपडेट डाउनलोड करने का प्रयास करेगा. यदि नीति को 'गलत' पर सेट है या सेट नहीं है, तो अपने आप अपडेट पेलोड को डाउनलोड करने के लिए HTTPS का इस्तेमाल किया जाएगा.</translation>
+      अगर यह नीति 'सही' पर सेट है, तो <ph name="PRODUCT_OS_NAME" /> HTTP के द्वाराअपने-आपअपडेट डाउनलोड करने का प्रयास करेगा. अगर नीति को 'गलत' पर सेट है या सेट नहीं है, तो अपने आप अपडेट पेलोड को डाउनलोड करने के लिए HTTPS का इस्तेमाल किया जाएगा.</translation>
 <translation id="199764499252435679"><ph name="PRODUCT_NAME" /> में घटक के अपडेट चालू करें</translation>
 <translation id="1997994951395619441">अगर आप यह सेटिंग चालू करते हैं, तो <ph name="PRODUCT_NAME" /> एक बुकमार्क बार दिखाएगा.
 
@@ -606,7 +606,7 @@
 
           संभावित मान 'basic', 'digest', 'ntlm' और 'negotiate' हैं. एकाधिक मानों को कॉमा की मदद से अलग करें.
 
-          यदि इस पॉलिसी को सेट नहीं किया जाता है, तो चारों योजनाओं का इस्तेमाल किया जाएगा.</translation>
+          अगर इस पॉलिसी को सेट नहीं किया जाता है, तो चारों योजनाओं का इस्तेमाल किया जाएगा.</translation>
 <translation id="2067011586099792101">सामग्री पैक से बाहर की साइटों का एक्‍सेस ब्लॉक करें</translation>
 <translation id="2073552873076775140"><ph name="PRODUCT_NAME" /> में साइन इन करने देती है</translation>
 <translation id="2077129598763517140">उपलब्ध होने पर 'हार्डवेयर से तेज़ी लाएं' सुविधा का उपयोग करें</translation>
@@ -709,7 +709,7 @@
 
       यह नीति सभी तरह के वीडियो इनपुट पर असर डालती है, न कि सिर्फ़ पहले से मौजूद कैमरे पर.</translation>
 <translation id="2201555246697292490">स्थानीय संदेश सेवा श्वेतसूची कॉन्फ़िगर करें</translation>
-<translation id="2204753382813641270">अलमारी का स्वत:-छिपाना नियंत्रित करना</translation>
+<translation id="2204753382813641270">अलमारी काअपने-आप-छिपाना नियंत्रित करना</translation>
 <translation id="2208976000652006649">POST का इस्तेमाल करने वाले खोज URL के पैरामीटर</translation>
 <translation id="2214880135980649323">जब इस नीति को चालू पर सेट किया जाता है, तो एंटरप्राइज़ नीति के ज़रिए इंस्टॉल किए गए एक्सटेंशन, 'एंटरप्राइज़ हार्डवेयर प्लैटफ़ॉर्म API (एपीआई)' का इस्तेमाल कर सकते हैं.
       जब इस नीति को बंद पर सेट किया जाता है या सेट नहीं किया जाता है, तो कोई एक्सटेंशन, 'एंटरप्राइज़ हार्डवेयर प्लैटफ़ॉर्म API (एपीआई)' का इस्तेमाल नहीं कर सकता है.
@@ -837,10 +837,10 @@
       अगर इस नीति को जोड़ा नहीं गया है, तो 'प्रमाणपत्र पारदर्शिता' नीति के अनुसार ज़ाहिर नहीं किए जाने पर उन सभी प्रमाणपत्रों को अविश्वसनीय के रूप में देखा जाएगा जिन्हें 'प्रमाणपत्र पारदर्शिता' के ज़रिए ज़ाहिर किया जाना ज़रूरी है.</translation>
 <translation id="2488010520405124654">ऑफ़लाइन होने पर नेटवर्क कॉन्फ़िगरेशन संकेत को चालूं करें.
 
-      यदि यह नीति सेट नहीं है या सही पर सेट की गई है और शून्य-देरी अपने आप लॉगिन के लिए डिवाइस-स्थानीय खाता कॉन्फ़िगर किया गया है तथा डिवाइस में इंटरनेट की एक्सेस नहीं है, तो <ph name="PRODUCT_OS_NAME" /> नेटवर्क कॉन्फ़िगरेशन संकेत दिखाएगा.
+      अगर यह नीति सेट नहीं है या सही पर सेट की गई है और शून्य-देरी अपने आप लॉगिन के लिए डिवाइस-स्थानीय खाता कॉन्फ़िगर किया गया है तथा डिवाइस में इंटरनेट की एक्सेस नहीं है, तो <ph name="PRODUCT_OS_NAME" /> नेटवर्क कॉन्फ़िगरेशन संकेत दिखाएगा.
 
-      यदि यह नीति गलत पर सेट है, तो नेटवर्क कॉन्फ़िगरेशन संकेत के बजाय एक गड़बड़ी का मैसेज दिखाई देगा.</translation>
-<translation id="2498238926436517902">अलमारी को हमेशा स्वत:-छिपाएं</translation>
+      अगर यह नीति गलत पर सेट है, तो नेटवर्क कॉन्फ़िगरेशन संकेत के बजाय एक गड़बड़ी का मैसेज दिखाई देगा.</translation>
+<translation id="2498238926436517902">अलमारी को हमेशाअपने-आप-छिपाएं</translation>
 <translation id="2514328368635166290">यह नीति 'डिफ़ॉल्‍ट खोज सेवा' का पसंदीदा आइकॉन यूआरएल तय करती है.
 
           यह नीति वैकल्पिक है. अगर यह सेट नहीं है तो, खोज सेवा के लिए कोई आइकॉन दिखाई नहीं होगा.
@@ -1657,7 +1657,7 @@
 
           अगर यह गलत पर सेट है या अगर सेट नहीं है तो, कोई प्रमाणपत्र जनरेट नहीं किया जाएगा और enterprise.platformKeys एक्सटेंशन API (एपीआई) पर कॉल नहीं किया जा सकेगा.</translation>
 <translation id="3965339130942650562">गतिविधि नहीं कर रहे उपयोगकर्ता को जब तक लॉग-आउट नहीं कर दिया जाता तब तक टाइमआउट</translation>
-<translation id="3973371701361892765">अलमारी को कभी भी स्वत:-न छिपाएं</translation>
+<translation id="3973371701361892765">अलमारी को कभी भीअपने-आप-न छिपाएं</translation>
 <translation id="3984028218719007910">यह तय करती है कि <ph name="PRODUCT_OS_NAME" /> लॉग आउट के बाद स्‍थानीय खाता डेटा रखे या नहीं. अगर यह सही पर सेट होती है तो, <ph name="PRODUCT_OS_NAME" /> कोई निरंतर खाता नहीं रखता और लॉग आउट के बाद उपयोगकर्ता सत्र से सभी डेटा हटा दिए जाएंगे. अगर यह नीति गलत पर सेट हो या कॉन्‍फ़िगर नहीं की गई हो तो, डिवाइस (सुरक्षित किया गया) स्‍थानीय उपयोगकर्ता डेटा रख सकता है.</translation>
 <translation id="398475542699441679">यह नीति तय करती है कि 'पुराने ब्राउज़र के लिए मदद' चालू की जाए या नहीं.
 
@@ -1669,9 +1669,9 @@
 <translation id="3997519162482760140">ऐसे यूआरएल, जिन्हें SAML लॉगिन पेजों पर वीडियो कैप्चर डिवाइस को एक्सेस करने की अनुमति होगी</translation>
 <translation id="4001275826058808087">एंटरप्राइज़ डिवाइस के आईटी व्यवस्थापक इस फ़्लैग का उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि उपयोगकर्ताओं को Chrome OS पंजीकरण के ज़रिए ऑफ़र रिडीम कराने की अनुमति दी जाए या नहीं.
 
-      यदि यह नीति सही पर सेट है या सेट किए बिना छोड़ दी जाती है, तो उपयोगकर्ता Chrome OS पंजीकरण के ज़रिए ऑफ़र रिडीम करा सकेंगे.
+      अगर यह नीति सही पर सेट है या सेट किए बिना छोड़ दी जाती है, तो उपयोगकर्ता Chrome OS पंजीकरण के ज़रिए ऑफ़र रिडीम करा सकेंगे.
 
-      यदि यह नीति गलत पर सेट है, तो उपयोगकर्ता ऑफ़र रिडीम नहीं करा सकेंगे.</translation>
+      अगर यह नीति गलत पर सेट है, तो उपयोगकर्ता ऑफ़र रिडीम नहीं करा सकेंगे.</translation>
 <translation id="4008507541867797979">अगर यह नीति 'सही' पर सेट होती है या कॉन्फ़िगर नहीं होती है, तो <ph name="PRODUCT_OS_NAME" /> लॉगिन स्क्रीन पर मौजूदा उपयोगकर्ता दिखाएगा और उनमें से एक को चुनने देगा.
 
       अगर यह नीति गलत पर सेट होती है, तो <ph name="PRODUCT_OS_NAME" /> लॉगिन स्क्रीन पर मौजूदा उपयोगकर्ता नहीं दिखाएगा. प्रबंधित सत्र के कॉन्फ़िगर नहीं हो जाने तक सामान्य साइन-इन स्क्रीन (जो उपयोगकर्ता के ईमेल और पासवर्ड या फ़ोन के लिए संकेत करती है) या बीच-बीच में विज्ञापन दिखाने वाली SAML स्क्रीन (अगर इसे <ph name="LOGIN_AUTHENTICATION_BEHAVIOR_POLICY_NAME" /> नीति के ज़रिए चालू किया गया हो) दिखाई जाएगी. जब 'प्रबंधित सत्र' कॉन्फ़िगर होता है, तो सिर्फ़ 'प्रबंधित सत्र' खाते ही दिखाए जाएंगे, जो इनमें से एक को चुनने देगा.
@@ -2346,9 +2346,9 @@
       यह नीति तभी लागू होती है अगर Android ऐप्लिकेशन सक्षम किए गए हों.</translation>
 <translation id="5395271912574071439">कनेक्शन के चलते रहने पर रिमोट (दूर के किसी) एक्सेस वाले होस्ट की करटेनिंग चालू करता है.
 
-          यदि यह सेटिंग चालू हो, तो फिर होस्ट के इनपुट और आउटपुट उपकरण बंद कर दिए जाते हैं, जबकि एक रिमोट (दूर का कोई) कनेक्शन चल रहा होता है.
+          अगर यह सेटिंग चालू हो, तो फिर होस्ट के इनपुट और आउटपुट उपकरण बंद कर दिए जाते हैं, जबकि एक रिमोट (दूर का कोई) कनेक्शन चल रहा होता है.
 
-          यदि यह सेटिंग बंद या सेट नहीं हो, तो फिर स्थानीय और रिमोट (दूर का कोई) दोनों उपयोगकर्ता होस्ट को शेयर करते समय उससे बातचीत कर सकते हैं.</translation>
+          अगर यह सेटिंग बंद या सेट नहीं हो, तो फिर स्थानीय और रिमोट (दूर का कोई) दोनों उपयोगकर्ता होस्ट को शेयर करते समय उससे बातचीत कर सकते हैं.</translation>
 <translation id="5396049152026347991">उपयोगकर्ता को वीपीएन कनेक्शन प्रबंधित करने की मंज़ूरी दें.
 
       अगर यह नीति गलत पर सेट की जाती है, तो <ph name="PRODUCT_NAME" /> के वे सभी उपयोगकर्ता इंटरफ़ेस जो उपयोगकर्ता को वीपीएन कनेक्शन डिसकनेक्ट करने देंगे या उनमें बदलाव करने देंगे, उन्हें बंद कर दिया जाता है.
@@ -2637,9 +2637,9 @@
 
           अगर जानकारी दी गई है, तो इसे शुरूआती भाग के आधार TalkGadget नाम में TalkGadget के लिए एक पूरा डोमेन नाम बनाने के लिए जोड़ा गया है. आधार TalkGadget डोमेन नाम '.talkgadget.google.com' है.
 
-          यदि यह सेटिंग चालू है, तो फिर TalkGadget पर पहुंचने के दौरान होस्ट डिफ़ॉल्ट डोमेन नाम के बजाय कस्टम डोमेन नाम का इस्तेमाल किया जाएगा.
+         अगर यह सेटिंग चालू है, तो फिर TalkGadget पर पहुंचने के दौरान होस्ट डिफ़ॉल्ट डोमेन नाम के बजाय कस्टम डोमेन नाम का इस्तेमाल किया जाएगा.
 
-          यदि यह सेटिंग बंद है या सेट नहीं है, तो फिर सभी उपयोगकर्ताओं के लिए डिफ़ॉल्ट TalkGadget डोमेन नाम ('chromoting-host.talkgadget.google.com') का इस्तेमाल किया जाएगा.
+          अगर यह सेटिंग बंद है या सेट नहीं है, तो फिर सभी उपयोगकर्ताओं के लिए डिफ़ॉल्ट TalkGadget डोमेन नाम ('chromoting-host.talkgadget.google.com') का इस्तेमाल किया जाएगा.
 
           रिमोट (दूर के) एक्सेस क्लाइंट इस नीति सेटिंग के ज़रिए प्रभावित नहीं हैं. TalkGadget पर पहुंचने के लिए वे हमेशा 'chromoting-client.talkgadget.google.com' का इस्तेमाल करेंगे.</translation>
 <translation id="5893553533827140852">अगर यह सेटिंग सक्षम है, तब gnubby प्रमाणन अनुरोध पूरे दूरस्थ होस्ट कनेक्शन पर प्रॉक्सी किया जाएगा.
@@ -3624,7 +3624,7 @@
           अगर यह नीति सेट न हो, तो सभी साइटों के लिए डिफ़ॉल्ट रेंडरर का इस्तेमाल किया जाता है. (<ph name="CHROME_FRAME_RENDERER_SETTINGS_POLICY_NAME" /> नीति का इस्तेमाल डिफ़ॉल्ट रेंडरर कॉन्फ़िगर करने के लिए किया जा सकता है.)</translation>
 <translation id="7694807474048279351">किसी <ph name="PRODUCT_OS_NAME" /> अपडेट के लागू होने के बाद एक ऑटोमैटिक रीबूट शेड्यूल करें.
 
-      जब इस नीति को सही पर सेट किया जाता है, तो किसी <ph name="PRODUCT_OS_NAME" /> अपडेट के लागू होने पर ऑटोमैटिक रीबूट शेड्यूल किया जाता है और अपडेट प्रोसेस को पूरा करने के लिए रीबूट का होना जरूरी है. रीबूट को तुरंत शेड्यूल किया जाता है लेकिन यदि उपयोगकर्ता अपनी डिवाइस का इस्तेमाल वर्तमान में कर रहा है, तो शेड्यूल में 24 घंटे तक के लिए रूकावट आ सकती है.
+      जब इस नीति को सही पर सेट किया जाता है, तो किसी <ph name="PRODUCT_OS_NAME" /> अपडेट के लागू होने पर ऑटोमैटिक रीबूट शेड्यूल किया जाता है और अपडेट प्रोसेस को पूरा करने के लिए रीबूट का होना जरूरी है. रीबूट को तुरंत शेड्यूल किया जाता है लेकिन अगर उपयोगकर्ता अपनी डिवाइस का इस्तेमाल वर्तमान में कर रहा है, तो शेड्यूल में 24 घंटे तक के लिए रूकावट आ सकती है.
 
       जब इस नीति को गलत पर सेट किया जाता है, तो <ph name="PRODUCT_OS_NAME" /> अपडेट लागू करने होने पर ऑटोमैटिक  रीबूट शेड्यूल नहीं किया जाता है. जब उपयोगकर्ता अगली बार डिवाइस को रीबूट करता है तो प्रोसेस पूरा हो जाता है 
 
@@ -3687,8 +3687,8 @@
 
       जब यह नीति सेट की गई हो, तब प्रमाणपत्र पारदर्शिता लागू करना बंद किए जाने के लिए, आगे बताई गई कोई एक शर्त पूरी होनी चाहिए:
       1. हैश, सर्वर प्रमाणपत्र की subjectPublicKeyInfo की सूची में मौजूद है.
-      2. हैश, प्रमाणपत्र श्रृंखला में किसी CA प्रमाणपत्र में दिखाई देने वाली subjectPublicKeyInfo की सूची में मौजूद है, वह CA प्रमाणपत्र X.509v3 nameConstraints एक्सटेंशन के ज़रिए सीमित होता है, permittedSubtrees में एक या उससे ज़्यादा directoryName nameConstraints मौजूद होते हैं और directoryName में organizationName खासियत होती है.
-      3. हैश, प्रमाणपत्र श्रृंखला में किसी CA प्रमाणपत्र में दिखाई देने वाली subjectPublicKeyInfo की सूची में मौजूद है, प्रमाणपत्र के विषय में CA प्रमाणपत्र में एक या उससे ज़्यादा organizationName खासियत होती हैं और सर्वर के प्रमाणपत्र में organizationName खासियत वाला ही नंबर उसी क्रम में मौजूद होता है और उसके मान बाइट-दर-बाइट समान होते हैं.
+      2. हैश, प्रमाणपत्र शृंखला में किसी CA प्रमाणपत्र में दिखाई देने वाली subjectPublicKeyInfo की सूची में मौजूद है, वह CA प्रमाणपत्र X.509v3 nameConstraints एक्सटेंशन के ज़रिए सीमित होता है, permittedSubtrees में एक या उससे ज़्यादा directoryName nameConstraints मौजूद होते हैं और directoryName में organizationName खासियत होती है.
+      3. हैश, प्रमाणपत्र शृंखला में किसी CA प्रमाणपत्र में दिखाई देने वाली subjectPublicKeyInfo की सूची में मौजूद है, प्रमाणपत्र के विषय में CA प्रमाणपत्र में एक या उससे ज़्यादा organizationName खासियत होती हैं और सर्वर के प्रमाणपत्र में organizationName खासियत वाला ही नंबर उसी क्रम में मौजूद होता है और उसके मान बाइट-दर-बाइट समान होते हैं.
 
       subjectPublicKeyInfo हैश को "/" वर्ण से जुड़े हुए हैश एल्गोरिद्म नाम के ज़रिए बताया जाता है और उस हैश एल्गोरिद्म का Base64 कोड में बदलने का तरीका बताए गए प्रमाणपत्र के DER कोड में बदले गए subjectPublicKeyInfo हैश पर लागू होता है. इस Base64 को कोड में बदलने के तरीके का फ़ॉर्मैट किसी SPKI फ़िंगरप्रिंट की तरह होता है, जैसा कि RFC 7469, सेक्शन 2.4 में बताया गया है. नहीं पहचाने गए हैश एल्गोरिद्म नज़रअंदाज़ कर दिए जाते हैं. फ़िलहाल सिर्फ़ "sha256" हैश एल्गोरिद्म ही काम करता है.
 
@@ -3696,9 +3696,9 @@
 <translation id="7818131573217430250">प्रवेश स्क्रीन पर उच्च कंट्रास्ट मोड की डिफ़ॉल्ट स्थिति सेट करें</translation>
 <translation id="7822837118545582721">जब यह नीति 'सही' पर सेट की जाती है, तो उपयोगकर्ता बाहरी स्टोरेज डिवाइस पर पर कुछ भी नहीं लिख सकते हैं.
 
-      यदि यह सेटिंग गलत पर सेट की जाती है या कॉन्फ़िगर नहीं की जाती है, तो फिर उपयोगकर्ता ऐसे बाहरी स्टोरेज डिवाइस पर फ़ाइलें बना सकते हैं और उनमें बदलाव कर सकते हैं, जो लिखने के लायक होते हैं.
+      अगर यह सेटिंग गलत पर सेट की जाती है या कॉन्फ़िगर नहीं की जाती है, तो फिर उपयोगकर्ता ऐसे बाहरी स्टोरेज डिवाइस पर फ़ाइलें बना सकते हैं और उनमें बदलाव कर सकते हैं, जो लिखने के लायक होते हैं.
 
-      ExternalStorageDisabled नीति को इस नीति पर प्राथमिकता मिलती है - यदि ExternalStorageDisabled को सही पर सेट किया जाता है, तो फिर बाहरी स्टोरेज का सारा एक्सेस बंद हो जाता है और ऐसा करने से इस नीति को अनदेखा कर दिया जाता है.
+      ExternalStorageDisabled नीति को इस नीति पर प्राथमिकता मिलती है - अगर ExternalStorageDisabled को सही पर सेट किया जाता है, तो फिर बाहरी स्टोरेज का सारा एक्सेस बंद हो जाता है और ऐसा करने से इस नीति को अनदेखा कर दिया जाता है.
 
       इस नीति की डायनामिक रीफ़्रेश M56 और उसके बाद के वर्शन में सहायता करती है.</translation>
 <translation id="7831595031698917016">नीति अमान्यकरण प्राप्त करने और डिवाइस प्रबंधन सेवा से नई नीति फ़ेच करने के बीच के अधिकतम विलंब को मिलीसेकंड में निर्दिष्ट करती है.
@@ -4069,9 +4069,9 @@
 <translation id="8631434304112909927"><ph name="UNTIL_VERSION" /> वर्शन तक</translation>
 <translation id="8649763579836720255">Chrome OS डिवाइस, Chrome OS CA द्वारा जारी किया गया प्रमाण-पत्र प्राप्त करने के लिए दूर से होने वाले पुष्टिकरण (सत्यापित एक्सेस) का उपयोग कर सकते हैं, जो इस बात पर ज़ोर देता है कि डिवाइस संरक्षित सामग्री चलाने के लायक है.  इस प्रोसेस में Chrome OS CA को हार्डवेयर की पुष्ट  जानकारी भेजना शामिल है, जो डिवाइस की खास रूप से पहचान करती है.
 
-यदि यह सेटिंग गलत है, तो डिवाइस सामग्री संरक्षण के लिए दूर से किए जाने वाले पुष्टिकरण का उपयोग नहीं करेगा और डिवाइस संरक्षित सामग्री नहीं चला सकता.
+अगर यह सेटिंग गलत है, तो डिवाइस सामग्री संरक्षण के लिए दूर से किए जाने वाले पुष्टिकरण का उपयोग नहीं करेगा और डिवाइस संरक्षित सामग्री नहीं चला सकता.
 
-यदि यह सेटिंग सही है, या यह सेट नहीं है, तो दूर से किए जाने वाले
+अगर यह सेटिंग सही है, या यह सेट नहीं है, तो दूर से किए जाने वाले
 सत्यापन का सामग्री संरक्षण के लिए उपयोग किया जा सकता है.</translation>
 <translation id="8650974590712548439">Windows क्लाइंट के लिए Windows रजिस्ट्री का स्थान:</translation>
 <translation id="8654286232573430130">एकीकृत प्रमाणीकरण के लिए श्वेत-सूचीबद्ध किए जाने वाले सर्वर निर्दिष्ट करती है. एकीकृत प्रमाणीकरण केवल तभी सक्षम किया जाता है जब <ph name="PRODUCT_NAME" /> को किसी प्रॉक्सी से या अनुमत सूची में शामिल किसी सर्वर से प्रमाणीकरण की चुनौती प्राप्त होती है.
diff --git a/components/policy/resources/policy_templates_ml.xtb b/components/policy/resources/policy_templates_ml.xtb
index 7cc2fc24..ef5b6fb 100644
--- a/components/policy/resources/policy_templates_ml.xtb
+++ b/components/policy/resources/policy_templates_ml.xtb
@@ -51,6 +51,13 @@
 <translation id="1049138910114524876"><ph name="PRODUCT_OS_NAME" /> സൈൻ ഇൻ സ്‌ക്രീനിൽ നൽകിയിട്ടുള്ള ഭാഷ കോൺഫിഗർ ചെയ്യുന്നു.
 
       ഈ നയം സജ്ജമാക്കിയിരിക്കുന്നെങ്കിൽ, ഈ നയത്തിന്റെ ആദ്യത്തെ മൂല്യം നൽകിയിട്ടുള്ള ഭാഷയിൽ എല്ലായ്‌പ്പോഴും സൈൻ ഇൻ സ്‌ക്രീൻ പ്രദർശിപ്പിക്കും (തുടർന്നുള്ള അനുയോജ്യതയ്‌ക്കായി നയത്തെ ഒരു ലിസ്‌റ്റായി നിർവ്വചിച്ചിരിക്കുന്നു).  ഈ നയം സജ്ജമാക്കാതിരിക്കുകയോ ശൂന്യമായ ലിസ്‌റ്റിലേക്ക് സജ്ജമാക്കുകയോ ആണെങ്കിൽ, അവസാന ഉപയോക്തൃ സെഷനിന്റെ ഭാഷയിൽ സൈൻ ഇൻ സ്‌ക്രീൻ പ്രദർശിപ്പിക്കും.  തെറ്റായ ഭാഷാ മൂല്യത്തിലേക്കാണ് ഈ നയം സജ്ജമാക്കിയിരിക്കുന്നതെങ്കിൽ, സൈൻ ഇൻ സ്‌ക്രീനിനെ ഒരു ഫാൾബാക്ക് ഭാഷയിൽ പ്രദർശിപ്പിക്കും (നിലവിൽ, en-US-ൽ).</translation>
+<translation id="1052499923181221200">SamlInSessionPasswordChangeEnabled ശരി അല്ലെങ്കിൽ ഈ നയം ബാധകമാകില്ല.
+      ആ നയം ശരിയും എന്നും (ഉദാഹരണത്തിന്) 14 ആയി സജ്ജീകരിക്കുകയും ചെയ്‌താൽ, SAML ഉപയോക്താക്കളുടെ പാസ്‌വേഡ് ഒരു നിശ്‌ചിത തീയതിയിൽ കാലഹരണപ്പെടാൻ പോകുകയാണെന്ന് 14 ദിവസം മുമ്പ് അവർക്ക് അറിയിപ്പ് ലഭിക്കുമെന്നാണ് ഇതിലൂടെ അർത്ഥമാക്കുന്നത്.
+      തുടർന്ന് ഒരു ഇൻ സെഷൻ പാസ്‌വേഡ് മാറ്റത്തിലൂടെയും പാസ്‌വേഡ് കാലഹരണപ്പെടുന്നതിന് മുമ്പ് അത് അപ്‌ഡേറ്റ് ചെയ്‌തും അവർക്ക് ഈ പ്രശ്‌നം ഉടൻ കൈകാര്യം ചെയ്യാനാകും.
+      എന്നാൽ SAML ലോഗിൻ ഫ്ലോയ്‌ക്കിടയിൽ SAML ഐഡന്റിറ്റി പ്രൊവൈഡർ പാസ്‌വേഡ് കാലഹരണപ്പെടൽ അറിയിപ്പ് ഉപകരണത്തിലേക്ക് അയച്ചിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ അറിയിപ്പുകൾ കാണിക്കൂ.
+      ഈ നയം ശൂന്യമെന്ന് സജ്ജീകരിക്കുന്നതിന് അർത്ഥം ഉപയോക്താക്കൾക്ക് മുൻകൂട്ടി അറിയിപ്പ് ലഭിക്കില്ല എന്നാണ് - പാസ്‌വേഡ് കാലഹരണപ്പെട്ട് കഴിഞ്ഞതിന് ശേഷമേ അവർക്ക് അറിയിപ്പ് ലഭിക്കുകയുള്ളൂ.
+
+      ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഉപയോക്താവിന് അത് മാറ്റാനോ റദ്ദാക്കാനോ കഴിയില്ല.</translation>
 <translation id="1062011392452772310">ഉപകരണത്തിനായി വിദൂര അറ്റസ്റ്റേഷൻ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="1062407476771304334">മാറ്റിസ്ഥാപിക്കുക</translation>
 <translation id="1079801999187584280">ഡെവലപ്പര്‍ ടൂളുകളുടെ ഉപയോഗം അനുവദിക്കാതിരിക്കുക</translation>
@@ -198,6 +205,7 @@
       നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, സ്‌ക്രീൻ സന്ദർഭം ആക്‌സസ് ചെയ്യാൻ Google അസിസ്‌റ്റൻ്റിനെ അനുവദിക്കും.
       നയം പ്രവർത്തനരഹിതമാണെങ്കിൽ, സ്‌ക്രീൻ സന്ദർഭം ആക്‌സസ് ചെയ്യാൻ Google അസിസ്‌റ്റൻ്റിനെ അനുവദിക്കില്ല.
       സജ്ജികരിച്ചിട്ടില്ലെങ്കിൽ, സ്‌ക്രീൻ സന്ദർഭം ആക്‌സസ് ചെയ്യാൻ Google അസിസ്‌റ്റൻ്റിനെ അനുവദിക്കണോ വേണ്ടയോ എന്ന് ഉപയോക്താക്കൾക്ക് തീരുമാനിക്കാം</translation>
+<translation id="1376119291123231789">വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="1383493480903114193">ബ്രൗസർ പ്രോസസ്സിൽ റൺ ചെയ്യാനുള്ള നെറ്റ്‌വർക്കിംഗ് കോഡ് ഈ നയം നിർബന്ധിതമായി ബാധകമാക്കുന്നു.
 
       ഡിഫോൾട്ടായി ഈ നയം പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു, എന്നാൽ അത് പ്രവർത്തനക്ഷമമാക്കുകയും, നെറ്റ്‌വർക്കിംഗ് പ്രോസസ്സ് sandboxed യാഥാർത്ഥ്യമാക്കുകയും ചെയ്‌താൽ, ഉപയോക്താക്കൾക്ക് സുരക്ഷാ പ്രശ്‌നം ഉണ്ടാക്കുന്നതിനിടയാക്കുന്നു.
@@ -293,6 +301,18 @@
 <translation id="1477934438414550161">TLS 1.2</translation>
 <translation id="1502843533062797703">മൂന്നാം കക്ഷി സോഫ്‌റ്റ്‌വെയർ ഇഞ്ചെക്ഷൻ ബ്ലോക്കിംഗ് പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="1504431521196476721">വിദൂര അറ്റസ്‌റ്റേഷൻ</translation>
+<translation id="1507382822467487898">
+          ഉപകരണത്തിലേക്ക് ഡോക്ക് കണക്‌റ്റ് ചെയ്‌തിരിക്കുമ്പോൾ ഏത് MAC (മീഡിയ ആക്‌സസ് നിയന്ത്രണം) വിലാസമാണ് ഉപയോഗിക്കുന്നതെന്ന് വ്യക്തമാക്കുന്നു.
+
+          ചില ഉപകരണ മോഡലുകളിലേക്ക് ഒരു ഡോക്ക് കണക്‌റ്റ് ചെയ്‌തിരിക്കുമ്പോൾ, ഇതർ‌നെറ്റിൽ ഡിഫോൾട്ടായി ഉപകരണത്തെ തിരിച്ചറിയാൻ ഉപകരണത്തിത്തിന്റെ നിയുക്ത ഡോക്ക് MAC വിലാസം ഉപയോഗിക്കുന്നു. ഡോക്ക് ചെയ്‌തിരിക്കുമ്പോൾ MAC വിലാസത്തിന്റെ ഉറവിടം മാറ്റാൻ ഈ നയം അഡ്‌മിനെ അനുവദിക്കുന്നു.
+
+          'DeviceDockMacAddress' തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിലോ നയം സജ്ജീകരിക്കാതെ വിട്ടാലോ ഉപകരണത്തിന്റെ നിയുക്ത ഡോക്ക് MAC വിലാസം ഉപയോഗിക്കും.
+
+          'DeviceNicMacAddress' തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ, ഉപകരണത്തിന്റെ NIC (നെറ്റ്‌വർക്ക് ഇന്റർഫേസ് കൺട്രോളർ) MAC വിലാസം ഉപയോഗിക്കും.
+
+          'DockNicMacAddress' തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ, ഡോക്കിന്റെ NIC MAC വിലാസം ഉപയോഗിക്കും.
+
+          ഈ ക്രമീകരണം ഉപയോക്താവിന് മാറ്റാനാവില്ല.</translation>
 <translation id="1507957856411744193">ഈ നയം 'ട്രൂ' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, RFC1918/RFC4193 സ്വകാര്യ വിലാസങ്ങളിലെ മാത്രമല്ല, എല്ലാ IP വിലാസങ്ങളിലെ Cast ഉപകരണങ്ങളിലേക്കും <ph name="PRODUCT_NAME" /> കണക്‌റ്റ് ചെയ്യും.
           ഈ നയം 'ഫാൾസ്' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, RFC1918/RFC4193 സ്വകാര്യ വിലാസങ്ങളിലെ Cast ഉപകരണങ്ങളിലേക്ക് മാത്രമായിരിക്കും <ph name="PRODUCT_NAME" /> കണ‌ക്റ്റ് ചെയ്യുക.
           ഈ നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, CastAllowAllIPs ഫീച്ചറുകൾ പ്രവർത്തനക്ഷമമല്ലാത്ത പക്ഷം, RFC1918/RFC4193 സ്വകാര്യ വിലാസങ്ങളിലെ Cast ഉപകരണങ്ങളിലേക്ക് മാത്രം <ph name="PRODUCT_NAME" /> കണക്‌റ്റ് ചെയ്യും.
@@ -728,6 +748,17 @@
 <translation id="2303795211377219696">ക്രെഡിറ്റ് കാർഡുകൾക്ക് സ്വമേധയാ പൂരിപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="2309390639296060546">സ്ഥിരസ്ഥിതി ജിയോലൊക്കേഷന്‍ ക്രമീകരണം</translation>
 <translation id="2327252517317514801">G Suite ആക്‌സസ് ചെയ്യാൻ അനുവദിക്കപ്പെട്ട ഡൊമെയ്‌നുകൾ നിർവ്വചിക്കുക</translation>
+<translation id="2356878440219553005">ബാറ്ററി ചാർജ് മോഡ് പവർ മാനേജ്‌മെന്റ് നയം വ്യക്തമാക്കുന്നു.
+
+          ബാറ്ററി ഉപയോഗത്തെ തുടർന്ന് പ്രവർത്തനക്ഷമത കുറയുന്നത് തടയാനും ബാറ്ററിയുടെ ആയുസ് വർദ്ധിപ്പിക്കാനും ബാറ്ററി ചാർജിംഗ് ചലനാത്മകമായി നിയന്ത്രിക്കുക.
+
+          ഇഷ്‌ടാനുസൃത ബാറ്ററി ചാർജ് മോഡ് തിരഞ്ഞെടുത്തിട്ടുണ്ടെങ്കിൽ, DeviceBatteryChargeCustomStartCharging, DeviceBatteryChargeCustomStopCharging എന്നിവ വ്യക്തമാക്കണം.
+
+          ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഉപകരണത്തിൽ പിന്തുണയ്‌ക്കുമെങ്കിൽ ബാറ്ററി ചാർജ് മോഡ് ബാധകമാകും.
+
+          ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയും നയം ഉപകരണത്തിൽ പിന്തുണയ്‌ക്കുകയും ചെയ്‌താൽ അടിസ്ഥാന ബാറ്ററി ചാർജ് മോഡ് ബാധകമാകും, ഉപയോക്താവിന് അത് മാറ്റാനുമാവില്ല.
+
+          ശ്രദ്ധിക്കുക: ആദ്യത്തേത് വ്യക്തമാക്കിയിട്ടുണ്ടെങ്കിൽ <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> ഈ നയത്തെ അസാധുവാക്കുന്നു.</translation>
 <translation id="237494535617297575">അറിയിപ്പുകൾ ദൃശ്യമാക്കാൻ അനുവദിച്ചിരിക്കുന്ന സൈറ്റുകളെ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ഒരു ലിസ്റ്റ് സജ്ജമാക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു.
 
           ഈ നയം ആഗോള സ്ഥിരസ്ഥിതി മൂല്യത്തെ സജ്ജീകരിക്കാത്ത നിലയിലാണെങ്കിൽ, അത് സജ്ജീകരിച്ച 'DefaultNotificationsSetting' നയത്തിലെയോ ഉപയോക്താവിന്റെ സ്വകാര്യ കോൺഫിഗറേഷനിൽ നിന്നുള്ളതോ ആയ എല്ലാ സൈറ്റുകളിലും ഉപയോഗിക്കുന്നതാണ്.</translation>
@@ -765,6 +796,7 @@
 
       ഈ നയം False എന്നതായി സജ്ജമാക്കിയാൽ, കാലതാമസമില്ലാത്ത യാന്ത്രിക ലോഗിൻ (കോൺഫിഗർ ചെയ്‌തിട്ടുണ്ടെങ്കിൽ) ഒഴിവാക്കാനാകില്ല.</translation>
 <translation id="2454228136871844693">സ്ഥിരതയ്ക്കായി ഒപ്‌റ്റിമൈസ് ചെയ്യുക.</translation>
+<translation id="2463034609187171371">TLS-ൽ DHE സൈഫർ സ്യൂട്ടുകൾ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="2463365186486772703">അപ്ലിക്കേഷന്‍  ഭാഷ</translation>
 <translation id="2466131534462628618">ക്യാപ്‌റ്റീവ് പോർട്ടൽ പ്രാമാണീകരണം പ്രോക്‌സിയെ അവഗണിക്കുന്നു</translation>
 <translation id="2482676533225429905">നേറ്റീവ് സന്ദേശമയയ്‌ക്കൽ</translation>
@@ -946,6 +978,7 @@
 <translation id="2769952903507981510">വിദൂര ആക്‌സസ് ഹോസ്റ്റിന് ആവശ്യമായുള്ള ഡൊമെയ്‌ൻ പേര് കോൺഫിഗർ ചെയ്യുക</translation>
 <translation id="2787173078141616821">Android-ന്റെ നിലയെ കുറിച്ചുള്ള വിവരം റിപ്പോർട്ടുചെയ്യുക</translation>
 <translation id="2799297758492717491">URL പാറ്റേണുകളുടെ ഒരു വൈറ്റ്‌ലിസ്റ്റിൽ, മീഡിയ സ്വമേധയാ പ്ലേ ചെയ്യൽ അനുവദിക്കുക</translation>
+<translation id="2801155097555584385">ബാറ്ററി ചാർജ് ഇഷ്‌ടാനുസൃത ചാർജിംഗ് ആരംഭിക്കൽ ശതമാനത്തിൽ സജ്ജീകരിക്കുക</translation>
 <translation id="2801230735743888564">ഉപകരണം ഓഫ്‌ലൈനായിരിക്കുമ്പോൾ ദിനോസർ ഈസ്‌റ്റർ എഗ്ഗ് ഗെയിം പ്ലേ ചെയ്യുന്നതിന് ഉപയോക്താക്കളെ അനുവദിക്കുക.
 
       നയം False ആയി സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഉപകരണം ഓഫ്‌ലൈനായിരിക്കുമ്പോൾ ദിനോസർ ഈസ്‌റ്റർ എഗ്ഗ് ഗെയിം പ്ലേ ചെയ്യുന്നതിന് ഉപയോക്താക്കൾക്ക് കഴിയില്ല. ക്രമീകരണം True ആയി സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിൽ, ദിനോസർ ഈസ്‌റ്റർ എഗ്ഗ് ഗെയിം പ്ലേ ചെയ്യുന്നതിന് ഉപയോക്താക്കളെ അനുവദിക്കുന്നതാണ്. ഈ നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ, എൻറോൾ ചെയ്‌തിട്ടുള്ള Chrome OS-ൽ ദിനോസർ ഈസ്‌റ്റർ എഗ്ഗ് ഗെയിം പ്ലേ ചെയ്യുന്നതിന് ഉപയോക്താക്കൾക്ക് അനുവാദമുണ്ടാകില്ല, പക്ഷേ മറ്റ് സാഹചര്യങ്ങളിൽ ഇത് പ്ലേ ചെയ്യാൻ അനുവാദമുണ്ടാകും.</translation>
@@ -1019,6 +1052,7 @@
       നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കുന്നുവെങ്കിലോ ഒരു മൂല്യം സജ്ജമാക്കുന്നില്ലെങ്കിലോ, ഡിഫോൾട്ട് ലക്ഷ്യസ്ഥാന തിരഞ്ഞെടുപ്പായി അച്ചടി പ്രിവ്യൂ ഉപയോഗിക്കുക ഏറ്റവും സമീപകാലത്ത് ഉപയോഗിച്ച പ്രിന്‍ററാണ്.
 
       നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുന്നുവെങ്കിൽ, ഡിഫോൾട്ട് ലക്ഷ്യസ്ഥാന തിരഞ്ഞെടുപ്പായി അച്ചടി പ്രിവ്യൂ ഉപയോഗിക്കുക OS സിസ്റ്റം ഡിഫോൾട്ട് പ്രിന്‍ററാണ്.</translation>
+<translation id="285627849510728211">വിപുലമായ ബാറ്ററി ചാർജ് മോഡ് ദിന കോൺഫിഗറേഷൻ സജ്ജീകരിക്കുക</translation>
 <translation id="2856674246949497058">OS പതിപ്പ് ടാർഗറ്റിനെക്കാൾ പുതിയതാണെങ്കിൽ ടാർഗറ്റ് പതിപ്പിലേക്ക് തിരികെ പോയി അതിൽ തുടരുക. പ്രോസസിന്റെ സമയത്ത് powerwash ചെയ്യുക.</translation>
 <translation id="2872961005593481000">അടയ്ക്കുക</translation>
 <translation id="2873651257716068683">ഡിഫോൾട്ട് പ്രിന്റിംഗ് പേജ് വലുപ്പം അസാധുവാക്കുന്നു. പേജ് വലുപ്പം ലഭ്യമല്ലെങ്കിൽ ഈ നയം അവഗണിക്കപ്പെടും.</translation>
@@ -1148,12 +1182,26 @@
 <translation id="3072045631333522102">സ്‌ക്രീൻ സേവർ റീട്ടെയ്ൽ മോഡിലെ സൈൻ-ഇൻ സ്‌ക്രീനിൽ ഉപയോഗിക്കും</translation>
 <translation id="3072847235228302527">ഒരു ഉപകരണ-പ്രാദേശിക അക്കൗണ്ടിനായി സേവന നിബന്ധനകൾ സജ്ജമാക്കുക</translation>
 <translation id="3077183141551274418">ടാബ് ലൈഫ്‌സൈക്കിളുകൾ പ്രവർത്തനക്ഷമമാക്കുന്നു അല്ലെങ്കിൽ പ്രവർത്തനരഹിതമാക്കുന്നു</translation>
+<translation id="3079417254871857650">ecryptfs എൻക്രിപ്‌ഷൻ ഉപയോഗിച്ച് ഉപയോക്താവിന്റെ ഹോം ഡയറക്‌റ്ററി സൃഷ്‌ടിക്കുമ്പോൾ സ്വീകരിക്കേണ്ട നടപടി വ്യക്തമാക്കുന്നു.
+
+      നിങ്ങൾ ഈ നയം 'DisallowArc' ആയി സജ്ജീകരിച്ചാൽ, ഉപയോക്താവിൻ്റെ Android ആപ്പുകൾ പ്രവർത്തനരഹിതമാവുകയും ecryptfs-ൽ നിന്ന് ext4 എൻക്രിപ്ഷനിലേക്കുള്ള ഒരു മൈഗ്രേഷനും നടക്കുകയുമില്ല. ഹോം ഡയറക്‌റ്ററി മുമ്പേ തന്നെ ext4-encrypted ആണെങ്കിൽ Android ആപ്പുകളുടെ പ്രവർത്തനം തടയില്ല.
+
+      നിങ്ങൾ ഈ നയം 'Migrate' ആയി സജ്ജീകരിച്ചാൽ, സൈൻ ഇൻ ചെയ്യുമ്പോൾ ഉപയോക്താവിൻ്റെ സമ്മതം ചോദിക്കാതെ തന്നെ ecryptfs-encrypted ഹോം ഡയറക്‌റ്ററികൾ സ്വയമേവ ext4 എൻക്രിപ്‌ഷനിലേക്ക് മൈഗ്രേറ്റ് ചെയ്യും.
+
+      നിങ്ങൾ ഈ നയം 'Wipe' ആയി സജ്ജീകരിച്ചാൽ, സൈൻ ഇൻ ചെയ്യുമ്പോൾ ecryptfs-encrypted ഹോം ഡയറക്‌റ്ററികൾ ഇല്ലാതാക്കപ്പെടുകയും പകരം പുതിയ ext4-encrypted ഡയറക്‌റ്ററികൾ സൃഷ്‌ടിക്കപ്പെടുകയും ചെയ്യും. മുന്നറിയിപ്പ്: ഇത് ഉപയോക്താവിൻ്റെ ലോക്കൽ ഡാറ്റ നീക്കം ചെയ്യും.
+
+      നിങ്ങൾ ഈ നയം 'MinimalMigrate' എന്നതിലേക്ക് സജ്ജീകരിച്ചാൽ, സൈൻ ഇൻ ചെയ്യുമ്പോൾ ecryptfs-encrypted ഹോം ഡയറക്‌റ്ററികൾ ഇല്ലാതാക്കപ്പെടുകയും പകരം പുതിയ ext4-encrypted ഡയറക്‌റ്ററികൾ സൃഷ്‌ടിക്കപ്പെടുകയും ചെയ്യും. എന്നിരുന്നാലും ലോഗിൻ ടോക്കണുകൾ സംരക്ഷിക്കുന്നതിനാൽ ഉപയോക്താവിന് വീണ്ടും സൈൻ ഇൻ ചെയ്യേണ്ടിവരില്ല. മുന്നറിയിപ്പ്: ഇത് ഉപയോക്താവിൻ്റെ ലോക്കൽ ഡാറ്റ നീക്കം ചെയ്യും.
+
+      നിങ്ങൾ ഈ നയം, പിന്തുണയ്‌ക്കാത്ത ഒരു ഓപ്‌ഷനിലേക്ക് ('AskUser' അല്ലെങ്കിൽ 'AskForEcryptfsArcUsers') സജ്ജീകരിച്ചാൽ, അതിന് പകരമായി 'Migrate' തിരഞ്ഞെടുത്തതായി പരിഗണിക്കും.
+
+      ഈ നയം കിയോസ്‌ക് ഉപയോക്താക്കൾക്ക് ബാധകമല്ല. ഈ നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ, 'DisallowArc' തിരഞ്ഞെടുത്തത് പോലെ ഉപകരണം പെരുമാറും.</translation>
 <translation id="3086995894968271156"><ph name="PRODUCT_NAME" /> എന്നതിൽ കാസ്‌റ്റ് റിസീവർ കോണ്‍ഫിഗര്‍ ചെയ്യുക.</translation>
 <translation id="3088796212846734853">ചിത്രങ്ങൾ പ്രദർശിപ്പിക്കാൻ അനുവദിച്ചിട്ടുള്ള സൈറ്റുകൾ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ഒരു ലിസ്‌റ്റ് സജ്ജീകരിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു.
 
           ഈ നയം സജ്ജീകരിക്കാതിരുന്നാൽ, 'DefaultImagesSetting' നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ അതിൽനിന്നോ, ഉപയോക്താവിന്റെ വ്യക്തിപരമായ കോൺഫിഗറേഷനിൽ നിന്നോ എല്ലാ സൈറ്റുകൾക്കും ആഗോള ഡിഫോൾട്ട് മൂല്യം ഉപയോഗിക്കും.
 
           ഈ നയം മുമ്പ് Android-ൽ തെറ്റായി പ്രവർത്തനക്ഷമമാക്കിയിരുന്നു എന്ന് ശ്രദ്ധിക്കുക, പക്ഷേ ഈ പ്രവർത്തനം ഒരിക്കലും Android-ൽ പൂർണ്ണമായി പിന്തുണച്ചിരുന്നില്ല.</translation>
+<translation id="3091832372132789233">പ്രാഥമികമായി ബാഹ്യ പവർ സ്രോതസ്സിലേക്ക് കണക്‌റ്റ് ചെയ്‌തിരിക്കുന്ന ഉപകരണങ്ങളുടെ ബാറ്ററി ചാർജ് ചെയ്യുക.</translation>
 <translation id="3096595567015595053">പ്രാപ്തമാക്കിയ പ്ലഗിനുകളുടെ ലിസ്റ്റ്</translation>
 <translation id="3101501961102569744">പ്രോക്സി സെര്‍വര്‍ ക്രമീകരണം എങ്ങനെ നിര്‍ദേശിക്കണമെന്ന് തെരഞ്ഞെടുക്കുക</translation>
 <translation id="3101709781009526431">തീയതിയും സമയവും</translation>
@@ -1179,6 +1227,7 @@
           ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കുകയാണെങ്കിൽ, സിസ്‌റ്റം നിലയിൽ ഇൻസ്‌റ്റാൾ ചെയ്‌തിരിക്കുന്ന പ്രാദേശിക സന്ദേശമയയ്‌ക്കൽ ഹോസ്‌റ്റുകളെ മാത്രമേ <ph name="PRODUCT_NAME" /> ഉപയോഗിക്കൂ.
 
           ഈ ക്രമീകരണം സജ്ജമാക്കുകയോ സജ്ജമാക്കാതെ വിടുകയോ ചെയ്യുകയാണെങ്കിൽ <ph name="PRODUCT_NAME" /> ഉപയോക്തൃനില  പ്രാദേശിക സന്ദേശമയയ്‌ക്കൽ ഹോസ്‌റ്റുകളുടെ ഉപയോഗം അനുവദിക്കുന്നു.</translation>
+<translation id="3177802893484440532">ലോക്കൽ ട്രസ്‌റ്റ് ആങ്കർമാർക്ക് OCSP/CRL പരിശോധനകൾ ആവശ്യമാണ്</translation>
 <translation id="3185009703220253572"><ph name="SINCE_VERSION" /> പതിപ്പിന്‌ ശേഷം</translation>
 <translation id="3187220842205194486">Android ആപ്‌സുകൾക്ക് കോർപ്പറേറ്റ് കീകളിൽ ആക്‌സസ് ലഭിക്കില്ല. അവയ്‌ക്ക് ഈ നയം ബാധകമല്ല.</translation>
 <translation id="3205825995289802549">ആദ്യ റണ്ണിൽ ആദ്യ ബ്രൗസർ വലുതാക്കുക</translation>
@@ -1192,6 +1241,7 @@
 <translation id="3220624000494482595">നയം <ph name="TRUE" /> എന്ന് സജ്ജമാക്കിയിരിക്കുകയാണെങ്കിൽ പോലും കിയോസ്‌ക് ആപ്പ് ഒരു Android ആപ്പാണെങ്കിൽ, ഇതിന് <ph name="PRODUCT_OS_NAME" /> പതിപ്പിൽ നിയന്ത്രണം ഉണ്ടായിരിക്കില്ല.</translation>
 <translation id="3236046242843493070">വിപുലീകരണം, അപ്ലിക്കേഷൻ, ഉപയോക്തൃ സ്‌ക്രിപ്റ്റ് ഇൻസ്റ്റാളുകൾ എന്നിവ അനുവദിക്കുന്നതിനുള്ള URL പാറ്റേണുകൾ</translation>
 <translation id="3240609035816615922">പ്രിന്‍റർ കോൺഫിഗറേഷൻ ആക്‌സസ് നയം.</translation>
+<translation id="3240655340884151271">ഡോക്കിന്റെ അന്തർ നിർമ്മിത NIC MAC വിലാസം</translation>
 <translation id="3243309373265599239">AC പവറിൽ പ്രവർത്തിക്കുമ്പോൽ സ്‌ക്രീൻ തെളിച്ചം കുറച്ചതിനുശേഷം, ഉപയോക്തൃ ഇൻപുട്ടില്ലാതെ സമയദൈർഘ്യം വ്യക്തമാക്കുന്നു.
 
           ഈ നയം പൂജ്യത്തേക്കാൾ കൂടിയ ഒരു മൂല്യമായി സജ്ജമാക്കുമ്പോൾ, അത് <ph name="PRODUCT_OS_NAME" /> സ്‌ക്രീൻ തെളിച്ചം കുറയ്‌ക്കുന്നതിന് മുമ്പ് ഉപയോക്താവ് നിഷ്‌ക്രിയമായി തുടരേണ്ട സമയ ദൈർഘ്യം വ്യക്തമാക്കുന്നു. 
@@ -1213,6 +1263,12 @@
       ഈ ക്രമീകരണം പ്രാപ്‌തമാക്കിയിട്ടുണ്ട് അല്ലെങ്കിൽ കോൺഫിഗർ ചെയ്‌തില്ലെങ്കിൽ, ഉപയോക്താക്കൾക്ക് അവരുടെ Google അക്കൗണ്ട് ഉപയോഗിച്ചുള്ള പ്രമാണീകരണം വഴി ക്ലൗഡ് പ്രിന്‍റ് പ്രാപ്‌തമാക്കാൻ കഴിയും.
 
       ഈ ക്രമീകരണം അപ്രാപ്‌തമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഉപയോക്താക്കൾക്ക് പ്രോക്‌സി പ്രാപ്‌തമാക്കാൻ കഴിയില്ല, മെഷീനുകൾ അവയുടെ പ്രിന്‍റുകളെ <ph name="CLOUD_PRINT_NAME" /> എന്നതിനോടൊപ്പം പങ്കിടുന്നതിന് അനുവദിക്കില്ല.</translation>
+<translation id="3312206664202507568">SAML പാസ്‌വേഡും ഉപകരണ ലോക്ക്‌സ്‌ക്രീൻ പാസ്‌വേഡും സമന്വയത്തിൽ ആണെന്ന് ഉറപ്പാക്കുന്ന, ഇൻ സെഷനിൽ SAML ഉപയോക്താക്കളെ അവരുടെ പാസ്‌വേഡ് മാറ്റാൻ അനുവദിക്കുന്ന ഒരു പേജ് chrome://password-change എന്നതിൽ പ്രവർത്തനക്ഷമമാക്കുന്നു.
+
+      SAML ഉപയോക്താക്കളുടെ SAML പാസ്‌വേഡ് കാലഹരണപ്പെടാൻ പോവുകയാണെങ്കിൽ അക്കാര്യം അവരെ അറിയിക്കുകയും ഉടൻ തന്നെ ഇൻ സെഷൻ പാസ്‌വേഡ് മാറ്റത്തിലൂടെ പ്രശ്‌നം കൈകാര്യം ചെയ്യാനും സഹായിക്കുന്ന അറിയിപ്പുകളെയും ഈ നയം പ്രവർത്തനക്ഷമമാക്കുന്നു.
+      എന്നാൽ SAML ലോഗിൻ ഫ്ലോയ്‌ക്കിടയിൽ SAML ഐഡന്റിറ്റി പ്രൊവൈഡർ പാസ്‌വേഡ് കാലഹരണപ്പെടൽ അറിയിപ്പ് ഉപകരണത്തിലേക്ക് അയച്ചിട്ടുണ്ടെങ്കിൽ മാത്രമേ ഈ അറിയിപ്പുകൾ കാണിക്കൂ.
+
+      ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഉപയോക്താവിന് അത് മാറ്റാനോ റദ്ദാക്കാനോ കഴിയില്ല.</translation>
 <translation id="3322771899429619102">കീ സൃഷ്‌ടിക്കലിന് ഉപയോഗിക്കാൻ അനുവദിക്കുന്ന സൈറ്റുകൾ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ഒരു ലിസ്‌റ്റ് സജ്ജമാക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. url പാറ്റേൺ 'KeygenBlockedForUrls'-ൽ ആണെങ്കിൽ, അത് ഈ ഒഴിവാക്കലുകളെ അസാധുവാക്കുന്നു.
 
           ഈ നയം സജ്ജമാക്കാത്ത നിലയിലാണെങ്കിൽ എല്ലാ സൈറ്റുകൾക്കുമുള്ള ഗ്ലോബൽ ഡിഫോൾട്ട് മൂല്യം, 'DefaultKeygenSetting' നയം സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നോ അല്ലെങ്കിൽ ഉപയോക്താവിന്റെ വ്യക്തിപരമായ കോൺഫിഗറേഷനിൽ നിന്നോ, ഉപയോഗിക്കുന്നതാണ്.</translation>
@@ -1298,6 +1354,7 @@
 
           ഈ നയം തെറ്റ് എന്ന് സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിലോ സജ്ജമാക്കാത്ത നിലയിലാണെങ്കിലോ, പവർ മാനേജ്‌മെന്‍റ് കാലതാമസങ്ങളും സെഷൻ ദൈർഘ്യ പരിധിയും സെഷൻ ആരംഭത്തിൽ തന്നെ ഉടനടി പ്രവർത്തിച്ചു തുടങ്ങുന്നു.</translation>
 <translation id="3478024346823118645">സൈൻ ഔട്ട് ചെയ്യുമ്പോൾ ഉപയോക്തൃ ഡാറ്റ മായ്‌ക്കുക</translation>
+<translation id="3480961938508521469">പൂർണ്ണമായി ചാർജ് ചെയ്‌ത ബാറ്ററി, അടിസ്ഥാന നിരക്കിൽ</translation>
 <translation id="348495353354674884">വെർച്വൽ കീബോർഡ് പ്രാപ്‌തമാക്കുക</translation>
 <translation id="3487623755010328395">
         ഈ നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, സ്വയം രജിസ്റ്റർ ചെയ്യാനും എല്ലാ പ്രൊഫൈലുകൾക്കുമായും ബന്ധപ്പെടുത്തിയിട്ടുള്ള ക്ലൗഡ് നയം ബാധകമാക്കാനും <ph name="PRODUCT_NAME" /> ശ്രമിക്കും.
@@ -1342,6 +1399,8 @@
 <translation id="3547954654003013442">പ്രോക്‌സി ക്രമീകരണം</translation>
 <translation id="355118380775352753">ഇതര ബ്രൗസറിൽ തുറക്കാനുള്ള വെബ്‌സൈറ്റുകൾ</translation>
 <translation id="3554984410014457319">Google അസിസ്‌റ്റൻ്റിനെ വോയ്‌സ് സജീവമാക്കൽ പദം കേൾക്കാൻ അനുവദിക്കുക</translation>
+<translation id="356579196325389849">ഉപയോക്താക്കൾ Chrome OS റിലീസ് ചാനൽ കോൺഫിഗർ ചെയ്യേണ്ടതായി വന്നേക്കാം</translation>
+<translation id="3575011234198230041">HTTP പരിശോധിച്ചുറപ്പിക്കൽ</translation>
 <translation id="3577251398714997599">തടസ്സമുണ്ടാക്കുന്ന പരസ്യങ്ങളുള്ള സൈറ്റുകൾക്കുള്ള പരസ്യ ക്രമീകരണം</translation>
 <translation id="357917253161699596">ഉപയോക്തൃ സർട്ടിഫിക്കറ്റുകൾ മാനേജ് ചെയ്യാൻ ഉപയോക്താക്കളെ അനുവദിക്കുക</translation>
 <translation id="3583230441447348508">മുമ്പേ കോൺഫിഗർ ചെയ്‌ത നെറ്റ്‌വർക്ക് ഫയൽ പങ്കിടലുകളുടെ ലിസ്‌റ്റ് വ്യക്തമാക്കുന്നു.
@@ -1373,6 +1432,7 @@
         ഡെസ്‌ക്‌ടോപ്പിലെ മെഷീൻ സ്‌കോപ്പ് ക്ലൗഡ്
 നയ എൻറോൾമെൻ്റ് ആണ് ഈ നയം ഉപയോഗിക്കുന്നത്, Windows-ൽ രജിസ്ട്രിയോ GPO-യോ വഴിയും Mac-ൽ പ്ലിസ്‌റ്റിലൂടെയും Linux-ൽ JSON നയ ഫയൽ വഴിയും ഇത് സജ്ജീകരിക്കാനാവും.</translation>
 <translation id="3660562134618097814">ലോഗിൻ സമയത്ത് SAML IdP കുക്കികൾ കൈമാറുക</translation>
+<translation id="3668151900457104753">ബ്ലാക്ക്‌ലിസ്‌റ്റ് ചെയ്‌ത വിപുലീകരണങ്ങൾ അൺഇൻസ്‌റ്റാൾ ചെയ്യുക</translation>
 <translation id="3701121231485832347"><ph name="PRODUCT_OS_NAME" /> മാനേജ് ചെയ്യുന്ന, <ph name="MS_AD_NAME" /> എന്നതിന് പ്രത്യേകമായ ക്രമീകരണം നിയന്ത്രിക്കുന്നു.</translation>
 <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (ഒറ്റ-ലൈൻ ഫീൽഡ് അവസാനിപ്പിച്ചിരിക്കുന്നു, ഭാവിയിൽ നീക്കം ചെയ്യപ്പെടും. താഴെയുള്ള ബഹു-ലൈൻ ടെക്‌സ്‌റ്റ് ബോക്‌സ് ഉപയോഗിച്ച് തുടങ്ങുക.)</translation>
 <translation id="3709266154059827597">വിപുലീകരണ ഇന്‍സ്റ്റലേഷന്‍റെ അനുമതിയില്ലാത്ത ലിസ്റ്റ് കോണ്‍ഫിഗര്‍ ചെയ്യുക</translation>
@@ -1454,6 +1514,16 @@
           ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയാണെങ്കിൽ, പ്രാരംഭത്തിൽ ഓൺ-സ്ക്രീൻ കീബോർഡ് പ്രവർത്തനരഹിതമാകുമെങ്കിലും ഉപയോക്താവിന് ഏതുസമയത്തും അത് പ്രവർത്തനക്ഷമമാക്കാനാകും.</translation>
 <translation id="382476126209906314">വിദൂര ആക്‌സസ് ഹോസ്റ്റുകൾക്കായി TalkGadget പ്രിഫിക്‌സ് കോൺഫിഗർ ചെയ്യുക</translation>
 <translation id="3824972131618513497">പവർ മാനേജ്‌മെൻ്റ്, റീബൂട്ട് ചെയ്യൽ എന്നിവയുമായി ബന്ധപ്പെട്ട ക്രമീകരണം നിയന്ത്രിക്കുന്നു.</translation>
+<translation id="3826475866868158882">Google ലൊക്കേഷൻ സേവനങ്ങൾ പ്രവർത്തനക്ഷമമാക്കി</translation>
+<translation id="3831054243924627613">Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കലിന്റെ പ്രാഥമിക നില ഈ നയം നിയന്ത്രിക്കുന്നു.
+
+      ഈ നയം കോൺഫിഗർ ചെയ്യാത്തപ്പോഴോ <ph name="BR_DISABLED" /> എന്നതിലേക്ക് സജ്ജീകരിച്ചിരിക്കുമ്പോഴോ, Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ പ്രാഥമികമായി പ്രവർത്തനരഹിതമായിരിക്കും.
+
+      ഈ നയം <ph name="BR_ENABLED" /> എന്നതിലേക്ക് സജ്ജീകരിക്കുമ്പോൾ, Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ പ്രാഥമികമായി പ്രവർത്തനക്ഷമമായിരിക്കും.
+
+      ഈ നയം <ph name="BR_UNDER_USER_CONTROL" /> എന്നതിലേക്ക് സജ്ജീകരിക്കുമ്പോൾ, Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ ഉപയോഗിക്കണോ എന്ന് തിരഞ്ഞെടുക്കാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടും. ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ ഉപയോക്താവ് പ്രവർത്തനക്ഷമമാക്കുകയാണെങ്കിൽ, Android ആപ്പ് ഡാറ്റ Android ബാക്കപ്പ് സെർവറുകളിലേക്ക് അപ്‌ലോഡ് ചെയ്യുകയും അനുയോജ്യമായ ആപ്പുകൾ വീണ്ടും ഇൻസ്‌റ്റാൾ ചെയ്യുന്നതനുസരിച്ച് അവയിൽ നിന്ന് പുനഃസ്ഥാപിക്കുകയും ചെയ്യുന്നു.
+
+      പ്രാഥമിക സജ്ജീകരണ സമയത്ത് മാത്രമേ ഈ നയം Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ നിലയെ നിയന്ത്രിക്കുകയുള്ളൂ എന്ന കാര്യം ശ്രദ്ധിക്കുക. അതിന് ശേഷം ഉപയോക്താവിന് Android ക്രമീകരണം ഓണാക്കാം, Android ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ ഓൺ/ഓഫ് ആക്കുകയും ചെയ്യാം.</translation>
 <translation id="3831376478177535007">ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമായിരിക്കുമ്പോൾ, അംഗീകൃത CA സർട്ടിഫിക്കറ്റ് സാധൂകരിക്കുകയും ബന്ധിപ്പിക്കുകയും ചെയ്യുകയാണെങ്കിൽ,  Symantec Corporation-ന്‍റെ Legacy PKI പ്രവർത്തനങ്ങൾ നൽകിയ സർട്ടിഫിക്കറ്റുകൾ <ph name="PRODUCT_NAME" /> അനുവദിക്കും
 
       ഈ നയം, Symantec-ന്‍റെ ലെഗസി ഇൻഫ്രാസ്‌‌ട്രക്‌ചറിൽ നിന്നുള്ള സർട്ടിഫിക്കറ്റുകൾ ഇപ്പോഴും അംഗീകരിക്കുന്ന ഓപ്പറേറ്റിംഗ് സിസ്റ്റത്തെ ആശ്രയിക്കുന്നു എന്നത് ശ്രദ്ധിക്കുക. ഒരു OS അപ്‌ഡേറ്റ്, ഇത്തരം സർട്ടിഫിക്കറ്റുകളുടെ OS ഹാൻഡിലിംഗ് മാറ്റുന്നെങ്കിൽ, ഈ നയത്തിന് പിന്നെ പ്രാബല്യമുണ്ടാകില്ല.  കൂടുതലായി, ലെഗസി Symantec സർട്ടിഫിക്കറ്റുകളിൽ നിന്നുള്ള പരിവർത്തനത്തിന്, എന്റർപ്രൈസുകൾക്ക് കൂടുതൽ സമയം നൽകാൻ ഉദ്ദേശിച്ചുള്ള ഒരു താൽക്കാലിക പരിഹാരമാർഗ്ഗം കൂടിയാണ് ഈ നയം. 2019 ജനുവരി 1-നോ അടുത്ത മറ്റൊരു ദിവസമോ ഈ നയം നീക്കം ചെയ്യപ്പെടും.
@@ -1537,6 +1607,15 @@
 
           സജ്ജമാക്കിയില്ലെങ്കിലോ തെറ്റ് എന്നായി സജ്ജമാക്കിയിട്ടുണ്ടെങ്കിലോ, ഉപയോക്താക്കൾക്ക് ഫയലുകൾ Google ഡ്രൈവിലേക്ക് കൈമാറാനാകും.</translation>
 <translation id="3915395663995367577">ഒരു പ്രോക്സി .pac ഫയലിലേക്കുള്ള URL</translation>
+<translation id="3920892052017026701">ബാറ്ററി ചാർജ് ഇഷ്‌ടാനുസൃത ചാർജിംഗ് ആരംഭിക്കൽ ശതമാനത്തിൽ സജ്ജീകരിക്കുക.
+
+          ബാറ്ററി ചാർജിന്റെ ഇഷ്‌ടാനുസൃത ചാർജിംഗ് ആരംഭിക്കൽ മൂല്യം കുറയുമ്പോൾ ബാറ്ററി ചാർജ് ചെയ്ത് തുടങ്ങും.
+
+          DeviceBatteryChargeCustomStopCharging എന്നതിനേക്കാൾ കുറവായിരിക്കണം DeviceBatteryChargeCustomStartCharging.
+
+          DeviceBatteryChargeMode ഇഷ്‌ടാനുസൃതമെന്ന് സജ്ജീകരിച്ചാൽ മാത്രമേ ഈ നയം ഉപയോഗിക്കൂ.
+
+          ഈ നയം കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിലോ സജ്ജീകരിക്കാതെ വിടുകയോ ചെയ്‌താൽ, അടിസ്ഥാന ബാറ്ററി ചാർജ് മോഡ് ബാധകമാകും.</translation>
 <translation id="3925377537407648234">ഡിസ്‌പ്ലേ റെസല്യൂഷനും സ്‌കെയിൽ ഘടകവും സജ്ജീകരിക്കുക</translation>
 <translation id="3939893074578116847">ഉപകരണം ഓഫ്‌ലൈനിലാണെങ്കിൽ അത് കണ്ടെത്താൻ സെർവറിനെ അനുവദിക്കുന്നതിന്,
       ഓൺലൈൻ നില നിരീക്ഷിക്കാൻ മാനേജ്‌മെന്‍റ് സെർവറിലേക്ക് നെറ്റ്‌വർക്ക് പാക്കറ്റുകൾ അയയ്‌ക്കുക.
@@ -1665,6 +1744,7 @@
 <translation id="4150201353443180367">ഡിസ്‌പ്ലേ</translation>
 <translation id="4157003184375321727">OS, ഫേംവെയർ പതിപ്പ് എന്നിവ റിപ്പോർട്ട് ചെയ്യുക</translation>
 <translation id="4157594634940419685">നേറ്റീവ് CUPS പ്രിന്‍ററുകളിലേക്ക് ആക്സസ് അനുവദിക്കുക</translation>
+<translation id="4160962198980004898">ഡോക്ക് ചെയ്‌തിരിക്കുമ്പോഴുള്ള ഉപകരണ MAC വിലാസ ഉറവിടം</translation>
 <translation id="4163705126749612234">വിദൂര ആക്‌സസ് ക്ലയന്‍റുകൾക്ക് ബാധകമാകുന്ന ആവശ്യമായ ക്ലയന്‍റ് ഡൊമെയ്‌ൻ പേര് കോൺഫിഗർ ചെയ്യുന്നതിനൊപ്പം, ഇത് മാറ്റുന്നതിൽ നിന്നും ഉപയോക്താക്കളെ തടയുകയും ചെയ്യുന്നു. 
 
           ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുകയാണെങ്കിൽ, നിർദ്ദിഷ്‌ട ഡൊമെയ്‌നിൽ നിന്നുള്ള ക്ലയന്‍റുകൾക്ക് മാത്രമേ ഹോസ്‌റ്റിലേക്ക് കണക്‌റ്റ് ചെയ്യാനാകൂ. 
@@ -1740,6 +1820,7 @@
       ഒരു ആപ്പ് ഐഡി അടങ്ങിയ നയം കൊണ്ട്, ലോക്ക് സ്‌ക്രീനിൽ ഒരു ആപ്പിനെ കുറിപ്പ്-എടുക്കൽ ആപ്പായി പ്രവർത്തനക്ഷമമാക്കാൻ ഉപയോക്താവിനു കഴിയുമെന്ന് അർത്ഥമാക്കുന്നില്ല എന്നത് ശ്രദ്ധിക്കുക - ഉദാഹരണത്തിന്, Chrome 61-ൽ, ലഭ്യമായ ആപ്പുകളുടെ ഗണത്തെ പ്ലാറ്റ്‌ഫോമിനാൽ കൂടുതൽ നിയന്ത്രിച്ചിരിക്കുന്നു.
 
       നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, നയം നടപ്പിലാക്കിയിട്ടുള്ള ലോക്ക് സ്‌ക്രീനിൽ ഉപയോക്താവിന് പ്രവർത്തനക്ഷമമാക്കാൻ കഴിയുന്ന ആപ്പ് ഗണവുമായി ബന്ധപ്പെട്ട് നിയന്ത്രണങ്ങളൊന്നും ഉണ്ടായിരിക്കുകയില്ല.</translation>
+<translation id="4313767483634435271">ഉപകരണത്തിന്റെ നിയുക്ത ഡോക്ക് MAC വിലാസം</translation>
 <translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> പതിപ്പ് നിയന്ത്രിക്കാൻ, കാലതാമസമില്ലാതെ കിയോസ്‌ക് ആപ്പ് സ്വയം സമാരംഭിക്കുന്നതിന് അനുവദിക്കുക.</translation>
 <translation id="4325690621216251241">സിസ്റ്റം ട്രേയിലേക്ക് ഒരു ലോഗ്ഔട്ട് ബട്ടൺ ചേർക്കുക</translation>
 <translation id="4332177773549877617">Android ആപ്പ് ഇൻസ്‌റ്റാളുകളുടെ ഇവൻ്റുകൾ ലോഗ് ചെയ്യുക</translation>
@@ -1771,6 +1852,7 @@
 <translation id="4360826270668210664">ഈ നയം സജ്ജമാക്കുകയാണെങ്കിൽ, വിദൂര ആക്‌സസ് ഹോസ്‌റ്റിന്, ഈ URL-ൽ നിന്ന് പ്രാമാണീകരണ ടോക്കൺ നേടുന്നതിന് പ്രാമാണീകരണ ക്ലയന്‍റുകൾ ആവശ്യമായിവരും. RemoteAccessHostTokenValidationUrl ബന്ധപ്പെട്ട് ഉപയോഗിക്കേണ്ടതുണ്ട്. 
 
 ഈ ഫീച്ചർ നിലവിൽ സെർവറിന്‍റെ ഭാഗത്ത് നിന്ന് പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.</translation>
+<translation id="4363057787588706121">വ്യത്യസ്‌ത ഉറവിടങ്ങളിൽ നിന്നുള്ള ലിസ്‌റ്റ് നയങ്ങളുടെ ലയിപ്പിക്കൽ അനുവദിക്കുക</translation>
 <translation id="436581050240847513">ഉപകരണ നെറ്റ്‌വർക്ക് ഇന്റർഫേസുകൾ റിപ്പോർട്ടുചെയ്യുക</translation>
 <translation id="4372704773119750918">എന്റർപ്രൈസ് ഉപയോക്താവിനെ മൾട്ടിപ്രൊഫൈലിന്റെ ഭാഗമാകാൻ അനുവദിക്കരുത് (പ്രാഥമികം അല്ലെങ്കിൽ ദ്വിതീയം)</translation>
 <translation id="4377599627073874279">എല്ലാ ഇമേജും കാണിക്കുന്നതിന്‌ എല്ലാ സൈറ്റുകളെയും അനുവദിക്കുക</translation>
@@ -1944,6 +2026,7 @@
 <translation id="4826326557828204741">ബാറ്ററി പവറിൽ പ്രവർത്തിക്കുന്നതിനിടയിൽ നിഷ്‌ക്രിയ കാലതാമസം എത്തിച്ചേരുമ്പോൾ സ്വീകരിക്കേണ്ട നടപടി</translation>
 <translation id="4832852360828533362">ഉപയോക്താവിനെയും ഉപകരണവും റിപ്പോർട്ട് ചെയ്യൽ</translation>
 <translation id="4834526953114077364">ആവശ്യമായത്രയും ശൂന്യമായ ഇടം ഉണ്ടാകുംവരെ അവസാന 3 മാസത്തിനുള്ളിൽ ലോഗിൻ ചെയ്യാത്ത ഉപയോക്താക്കൾ നീക്കംചെയ്യപ്പെടും</translation>
+<translation id="4835622243021053389">NTLMv2 പരിശോധിച്ചുറപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുക.</translation>
 <translation id="4858735034935305895">പൂർണ്ണസ്‌ക്രീൻ മോഡ് അനുവദിക്കുക</translation>
 <translation id="4861767323695239729">ഒരു ഉപയോക്തൃ സെഷനിൽ അനുവദിച്ച ഇൻപുട്ട് രീതികൾ കോൺഫിഗർ ചെയ്യുക</translation>
 <translation id="487460824085252184">സ്വയമേവ മൈഗ്രേറ്റ് ചെയ്യുക, ഉപയോക്തൃ സമ്മതം ചോദിക്കരുത്.</translation>
@@ -2066,6 +2149,11 @@
 
       <ph name="URL_LIST_POLICY_NAME" /> നയത്തിൽ നിന്ന് വ്യത്യസ്‌തമായി, ഇരു ദിശകളിലേക്കും നയങ്ങൾ ബാധകമാണ്. അതായത്, Internet Explorer ആഡ്-ഇൻ ഉണ്ടായിരിക്കുകയും അത് പ്രവർത്തനക്ഷമമായിരിക്കുകയും ചെയ്യുമ്പോൾ, <ph name="PRODUCT_NAME" /> എന്നതിൽ <ph name="IE_PRODUCT_NAME" /> ഈ URL-കൾ തുറക്കണോ എന്നതിനെയും ഇത് നിയന്ത്രിക്കുന്നു.</translation>
 <translation id="5124368997194894978">AC-യിൽ (ഓൾട്ടർനേറ്റിംഗ് കരണ്ട്) ബൂട്ട് ചെയ്യൽ പ്രവർത്തനക്ഷമമാക്കുക</translation>
+<translation id="5131211790949066746">വിപുലീകരണ ഇൻസ്‌റ്റാൾ ലിസ്‌റ്റ് നയങ്ങളായ <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" /> എന്നിവയുടെ ലയിപ്പിക്കൽ പ്രവർത്തനക്ഷമമാക്കുന്നു.
+
+      നിങ്ങൾ ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയാൽ, ഏറ്റവുമധികം മുൻഗണനയുള്ള ഒറ്റ ഉറവിടത്തിൽ നിന്നുള്ള മൂല്യങ്ങൾ ഉപയോഗിക്കുന്നതിൽ നിന്ന് വ്യത്യസ്‌തമായി ഉപകരണ പ്ലാറ്റ്‌ഫോം നയം, ഉപകരണ ക്ലൗഡ് നയം, ഉപയോക്തൃ പ്ലാറ്റ്‌ഫോം നയം എന്നിവ ഒരു ലിസ്‌റ്റ് ആയി ലയിപ്പിച്ച് ഒരുമിച്ച് ഉപയോഗിക്കും.
+
+      ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കുകയോ സജ്ജീകരിക്കാതെ വിടുകയോ ചെയ്‌താൽ, ഏറ്റവും കൂടുതൽ മുൻഗണനയുള്ള ഉറവിടത്തിൽ നിന്നുള്ള ലിസ്‌റ്റ് ഇനങ്ങൾ മാത്രം പരിഗണിക്കുകയും മറ്റ് ഉറവിടങ്ങളെല്ലാം വൈരുദ്ധ്യമുള്ളവയായി കാണിച്ച് അവഗണിക്കുകയും ചെയ്യും.</translation>
 <translation id="5141670636904227950">ലോഗിൻ സ്‌ക്രീനിൽ പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുന്ന സ്ഥിര സ്‌ക്രീൻ മാഗ്നിഫയർ തരം സജ്ജമാക്കുക</translation>
 <translation id="5142301680741828703"><ph name="PRODUCT_FRAME_NAME" />-ല്‍ എപ്പോഴും ഇനി പറയുന്ന URL പാറ്റേണുകള്‍ റെന്‍ഡര്‍ ചെയ്യുക</translation>
 <translation id="5148753489738115745"><ph name="PRODUCT_FRAME_NAME" />, <ph name="PRODUCT_NAME" /> എന്നത് സമാരംഭിക്കുമ്പോൾ ഉപയോഗിക്കുന്ന കൂടുതൽ പാരാമീറ്ററുകൾ വ്യക്തമാക്കുന്നതിന് നിങ്ങളെ അനുവദിക്കുന്നു .
@@ -2189,6 +2277,7 @@
 
       ഈ നയം സജ്ജീകരിക്കാതെ വിടുകയോ ശൂന്യമായ സ്‌ട്രിംഗിലേക്കോ അസാധുവായ പോർട്ട് ശ്രേണിയിലേക്കോ സജ്ജീകരിക്കുകയോ ആണെങ്കിൽ, ലഭ്യമായ ഏതൊരു ലോക്കൽ UDP പോർട്ടും ഉപയോഗിക്കാൻ WebRTC-നെ അനുവദിക്കും.</translation>
 <translation id="5290940294294002042">ഉപയോക്താവിന്‌ പ്രാപ്തമാക്കാനോ അപ്രാപ്തമാക്കാനോ കഴിയുന്ന പ്ലഗിനുകളുടെ ഒരു ലിസ്റ്റ് നിര്‍ദേശിക്കുക</translation>
+<translation id="5306186200045823863">Symantec Corporation-ന്റെ Legacy PKI Infrastructure-ൽ വിശ്വാസമർപ്പിക്കൂ</translation>
 <translation id="5307432759655324440">ആൾമാറാട്ട മോഡ് ലഭ്യത</translation>
 <translation id="5318185076587284965">വിദൂര ആക്‌സസ് ഹോസ്‌റ്റിലൂടെ റിലെ സെർവറുകളുടെ ഉപയോഗം പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="5323128137188992869"><ph name="PRODUCT_NAME" /> ഉപയോഗിക്കുന്ന ഉപകരണത്തിലേക്ക് കാസ്‌റ്റ് ചെയ്യാൻ ഉള്ളടക്കത്തെ അനുവദിക്കുക.
@@ -2287,6 +2376,7 @@
       നയങ്ങൾ തമ്മിൽ പരസ്‌പര വൈരുദ്ധ്യമുണ്ടായാൽ, <ph name="PRODUCT_NAME" /> കൂടുതൽ വ്യക്തതയുള്ള നയം ഉപയോഗിക്കുന്നു.</translation>
 <translation id="5475361623548884387">അച്ചടി പ്രാപ്തമാക്കുക</translation>
 <translation id="547601067149622666">തടസ്സമുണ്ടാക്കുന്ന പരസ്യങ്ങളുള്ള സൈറ്റുകളിൽ പരസ്യം അനുവദിക്കരുത്</translation>
+<translation id="5483065054530244863">ലോക്കൽ ട്രസ്‌റ്റ് ആങ്കർമാർ നൽകുന്ന SHA-1 സൈൻ ചെയ്‌ത സർട്ടിഫിക്കറ്റുകൾ അനുവദിക്കുക</translation>
 <translation id="5483777239978559943">ഈ നയം അവസാനിപ്പിച്ചിരിക്കുന്നു. Flash പ്ലഗിനിന്റെ ലഭ്യത നിയന്ത്രിക്കാൻ <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> എന്നതും PDF ഫയലുകൾ തുറക്കാൻ സംയോജിത PDF വ്യൂവർ ഉപയോഗിക്കണോ എന്നത് നിയന്ത്രിക്കാൻ <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> എന്നതും ഉപയോഗിക്കുക. 
 
 <ph name="PRODUCT_NAME" /> എന്നതിൽ ഉപയോക്താവിന്‌ പ്രവർത്തനക്ഷമമാക്കുകയോ പ്രവർത്തനരഹിതമാക്കുകയോ ചെയ്യാവുന്ന പ്ലഗിനുകളുടെ ഒരു ലിസ്റ്റ് നിര്‍ദേശിക്കുന്നു. 
@@ -2395,6 +2485,17 @@
           If you enable or do not set this policy, users can view their passwords in clear text in the password manager.</translation>
 <translation id="5620392548325769024">OS അപ്‌ഗ്രേഡിനെ തുടർന്നുള്ള ആദ്യ ബ്രൗസർ സമാരംഭിക്കലിൽ സ്വാഗത പേജ് കാണിക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="5630352020869108293">അവസാന സെഷൻ പുനഃസ്ഥാപിക്കുക</translation>
+<translation id="5643906875497889108">ഏതൊക്കെ ആപ്പ്/വിപുലീകരണ തരങ്ങൾ ഇൻസ്‌റ്റാൾ ചെയ്യാൻ അനുവദിക്കണമെന്നതിനെ നിയന്ത്രിക്കുകയും റൺടൈം ആക്‌സസിനെ പരിമിതപ്പെടുത്തുകയും ചെയ്യുന്നു.
+
+          <ph name="PRODUCT_NAME" />-ൽ ഇൻസ്‌റ്റാൾ ചെയ്യാവുന്ന അനുവദനീയമായ വിപുലീകരണ/ആപ്പുകളുടെ തരങ്ങളെയും ഏതൊക്കെ ഹോസ്‌റ്റുകൾക്ക് അവയുമായി സഹകരിക്കാനാകുമെന്നതിനെയും ഈ ക്രമീകരണം വൈറ്റ്‌-ലിസ്‌റ്റ് ചെയ്യുന്നു. ഈ മൂല്യം സ്‌ട്രിംഗുകളുടെ ഒരു ലിസ്‌റ്റാണ്, അവയിൽ ഓരോന്നും ഇനിപ്പറയുന്നവയിൽ ഒന്നായിരിക്കണം: "വിപുലീകരണം", "തീം", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". ഈ തരങ്ങളെക്കുറിച്ചുള്ള കൂടുതൽ വിവരങ്ങൾക്ക് <ph name="PRODUCT_NAME" /> വിപുലീകരണങ്ങളുടെ ഡോക്യുമെന്റേഷൻ കാണുക.
+
+          ExtensionInstallForcelist മുഖേന നിർബന്ധിതമായി ഇൻസ്റ്റാൾ ചെയ്‌ത വിപുലീകരണങ്ങൾക്കും ആപ്പുകൾക്കും ഈ നയം ബാധികമായിരിക്കും എന്ന കാര്യം ശ്രദ്ധിക്കുക.
+
+          ഈ ക്രമീകരണം കോൺഫിഗർ ചെയ്‌തിട്ടുണ്ടെങ്കിൽ, ലിസ്‌റ്റിൽ ഇല്ലാത്ത തരത്തിലുള്ള വിപുലീകരണങ്ങൾ/ആപ്പുകൾ ഇൻസ്‌റ്റാൾ ചെയ്യില്ല.
+
+          ഈ ക്രമീകരണം കോൺഫിഗർ ചെയ്യാതെ വിട്ടാൽ, പ്രവർത്തനത്തിൽ വരുത്തുന്ന സ്വീകാര്യമായ വിപുലീകരണ/ആപ്പ് തരങ്ങളിൽ നിയന്ത്രണങ്ങളൊന്നുമുണ്ടാകില്ല.
+
+          പതിപ്പ് 75-ന് മുമ്പുള്ള ഒന്നിലധികം കോമകളാൽ വേർതിരിച്ച വിപുലീകരണ ഐഡികൾ പിന്തുണയ്‌ക്കുകയില്ല, അവ ഒഴിവാക്കപ്പെടുകയും ചെയ്യും. മറ്റ് നയങ്ങൾ തുടർന്നും ബാധകമാകും.</translation>
 <translation id="5645779841392247734">ഈ സൈറ്റുകളില്‍ കുക്കികള്‍ അനുവദിക്കുക</translation>
 <translation id="5689430183304951538">ഡിഫോൾട്ട് പ്രിന്റിംഗ് പേജ് വലുപ്പം</translation>
 <translation id="5693469654327063861">ഡാറ്റ മൈഗ്രേഷൻ അനുവദിക്കുക</translation>
@@ -2434,6 +2535,7 @@
 <translation id="5765780083710877561">വിവരണം:</translation>
 <translation id="5770738360657678870">Dev ചാനൽ (അസ്ഥിരമായേക്കാവുന്നത്)</translation>
 <translation id="5774856474228476867">സ്ഥിരസ്ഥിതി തിരയൽ ദാതാവിന്‍റെ തിരയൽ URL</translation>
+<translation id="5775235485119094648">ഒരു സ്ഥിര ശ്രേണിയിക്കുള്ളിലായിരിക്കുമ്പോൾ ബാറ്ററി ചാർജ് ചെയ്യുക.</translation>
 <translation id="5776485039795852974">ഡെസ്ക്‌ടോപ്പ് നോട്ടിഫിക്കേഷനുകള്‍ ഒരു സൈറ്റ് കാണിക്കണോ എന്ന് എല്ലാ സമയത്തും ചോദിക്കുക.</translation>
 <translation id="5781412041848781654">HTTP പ്രാമാണീകരണത്തിനായി ഏത് GSSAPI ലൈബ്രറി ഉപയോഗിക്കണമെന്ന് വ്യക്തമാക്കുന്നു. നിങ്ങള്‍ക്ക് ഒരു ലൈബ്രറി പേരു മാത്രമോ അല്ലെങ്കിൽ മുഴുവന്‍ പാത്തോ സജ്ജമാക്കാം.
 
@@ -2501,6 +2603,7 @@
 <translation id="5893553533827140852">ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയിരിക്കുകയാണെങ്കിൽ, ഒരു വിദൂര ഹോസ്‌റ്റ് കണക്ഷനിലുടനീളം നുബ്ബി പ്രമാണീകരണ അഭ്യർത്ഥനകൾ അംഗീകരിക്കപ്പെടും.
 
           ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിലോ കോൺഫിഗർചെയ്‌തിട്ടില്ലെങ്കിലോ, നുബ്ബി പ്രമാണീകരണ അഭ്യർത്ഥനകൾ അംഗീകരിക്കപ്പെടില്ല.</translation>
+<translation id="5897913798715600338">വേഗത്തിലുള്ള ചാർജിംഗ് സാങ്കേതികവിദ്യ ഉപയോഗിച്ച് ബാറ്ററി ചാർജ് ചെയ്യുക.</translation>
 <translation id="5898486742390981550">ഒന്നിലധികം ഉപയോക്താക്കൾ ലോഗിൻ ചെയ്‌തിരിക്കുമ്പോൾ, പ്രാഥമിക ഉപയോക്താവിന് മാത്രമേ Android ആപ്പുകൾ ഉപയോഗിക്കാനാവൂ.</translation>
 <translation id="5900196529149231477">
       ഈ നയം സൈൻ ഇൻ സ്‌ക്രീനിലേക്ക് പ്രയോഗക്ഷമമാക്കുന്നു. ഉപയോക്തൃ സെഷനിലേക്ക് ബാധകമാക്കുന്ന <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> നയവും കാണുക. ഇരു നയങ്ങളും സമാന മൂല്യത്തിൽ സജ്ജീകരിക്കാൻ ശുപാർശ ചെയ്യുന്നു. മൂല്യങ്ങൾ പൊരുത്തപ്പെടുന്നില്ലെങ്കിൽ, ഉപയോക്തൃ നയം മുഖേന വ്യക്തമാക്കിയിരിക്കുന്ന മൂല്യം ബാധകമാക്കുമ്പോൾ, ഉപയോക്തൃ സെഷനിലേക്ക് പ്രവേശിക്കുന്ന സമയത്ത് കാലതാമസം നേരിട്ടേക്കാം.
@@ -2509,12 +2612,14 @@
       നയം കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിൽ, സൈൻ ഇൻ സ്‌ക്രീനിനായി പ്ലാറ്റ്‌ഫോം ഡിഫോൾട്ട് സൈറ്റ് ഐസൊലേഷൻ ക്രമീകരണം ഉപയോഗിക്കും.
       </translation>
 <translation id="5901427587865226597">രണ്ട് വശത്തുമുള്ള അച്ചടി മാത്രം</translation>
+<translation id="5905473632148429217">ഓൺലൈൻ OCSP/CRL പരിശോധനകൾ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="5906199912611534122">നെറ്റ്‌വർക്ക് ത്രോട്ടിലിംഗ് പ്രവർത്തനക്ഷമമാക്കാനോ പ്രവർത്തനരഹിതമാക്കാനോ അനുവദിക്കുന്നു.
       ഇത് എല്ലാ ഉപയോക്താക്കൾക്കും ഉപകരണത്തിലെ എല്ലാ ഇന്‍റർഫേസുകൾക്കും
       ബാധകമാണ്. സജ്ജമാക്കിയ ശേഷം, നയം ഇത് പ്രവർത്തനരഹിതമാക്കുന്നതിലേക്ക് മാറുന്നത് വരെ ത്രോട്ടിലിംഗ് നിലനിൽക്കുന്നു.
 
       'തെറ്റ്' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ
       ത്രോട്ടിലിംഗ് നടക്കില്ല. 'ശരി' എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, നൽകിയിരിക്കുന്ന അപ്‌ലോഡ്, ഡൗൺലോഡ് നിരക്കുകൾ (kbits/s-കളിൽ) അറിയാൻ സിസ്‌റ്റം ത്രോട്ടിൽ ചെയ്യും.</translation>
+<translation id="591088232153082363">ബാറ്ററി ഉപയോഗ പാറ്റേണിന്റെ അടിസ്ഥാനത്തിലുള്ള അഡാപ്‌റ്റീവ് ചാർജ് ബാറ്ററി.</translation>
 <translation id="5921713479449475707">HTTP മുഖേന യാന്ത്രിക അപ്‌ഡേറ്റ് ഡൗൺലോഡുകൾ അനുവദിക്കുക</translation>
 <translation id="5921888683953999946">ലോഗിൻ സ്‌ക്രീനിൽ വലിയ കഴ്‌സറിന്റെ പ്രവേശനക്ഷമത സവിശേഷതയുടെ ഡിഫോൾട്ട് അവസ്ഥ സജ്ജമാക്കുക.
 
@@ -2536,6 +2641,7 @@
 <translation id="5950205771952201658">സോഫ്‌റ്റ്‌വെയർ പരാജയം എന്ന വസ്‌തുതയുടെ വെളിച്ചത്തിൽ, ഓൺലൈൻ അസാധുവാക്കൽ പരിശോധനകൾ ഫലപ്രദമായ സുരക്ഷാ പ്രയോജനമൊന്നും നൽകാത്തതിനാൽ, <ph name="PRODUCT_NAME" /> പതിപ്പ് 19-ലും അതിനുശേഷമുള്ളവയിലും അവ സ്ഥിരമായി പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു. ഈ നയം true ആയി സജ്ജമാക്കുന്നതിലൂടെ, മുമ്പത്തെ പ്രവർത്തനരീതി പുനഃസ്ഥാപിച്ച് ഓൺലൈൻ OCSP/CRL പരിശോധനകൾ നിർവ്വഹിക്കും.
 
       ഈ നയം സജ്ജീകരിച്ചിട്ടില്ലെങ്കിലോ false ആയി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിലോ, <ph name="PRODUCT_NAME" /> 19-ലും അതിനുശേഷമുള്ളവയിലും <ph name="PRODUCT_NAME" /> ഓൺലൈൻ അസാധുവാക്കൽ പരിശോധനകൾ നിർവ്വഹിക്കില്ല.</translation>
+<translation id="5961137303188584693">ഉപകരണത്തിന്റെ അന്തർ നിർമ്മിത NIC MAC വിലാസം</translation>
 <translation id="5966615072639944554">വിദൂര അറ്റസ്‌റ്റേഷൻ API ഉപയോഗിക്കാൻ വിപുലീകരണങ്ങൾ അനുവദിച്ചിരിക്കുന്നു</translation>
 <translation id="5983708779415553259">ഉള്ളടക്ക പാക്കിലൊന്നുമില്ലാത്ത സൈറ്റുകളുടെ സ്ഥിര പെരുമാറ്റം</translation>
 <translation id="5997543603646547632">സ്ഥിരമായി 24 മണിക്കൂർ ക്ലോക്ക് ഉപയോഗിക്കുക</translation>
@@ -2626,6 +2732,17 @@
 <translation id="6111936128861357925">ദിനോസർ ഈസ്‌റ്റർ എഗ്ഗ് ഗെയിം അനുവദിക്കുക</translation>
 <translation id="6114416803310251055">നിരാകരിച്ചു</translation>
 <translation id="6133088669883929098">കീ സൃഷ്‌ടിക്കൽ ഉപയോഗിക്കാൻ എല്ലാ സൈറ്റുകളെയും അനുവദിക്കുക</translation>
+<translation id="6136537398661737682">ഈ നയം Google ലൊക്കേഷൻ സേവനങ്ങളുടെ പ്രാഥമിക നില നിയന്ത്രിക്കുന്നു.
+
+      ഈ നയം കോൺഫിഗർ ചെയ്യാത്തപ്പോഴോ <ph name="GLS_DISABLED" /> എന്നതിലേക്ക് സജ്ജീകരിച്ചിരിക്കുമ്പോഴോ, Google ലൊക്കേഷൻ സേവനങ്ങൾ പ്രാഥമികമായി പ്രവർത്തനരഹിതമായിരിക്കും.
+
+      ഈ നയം <ph name="GLS_ENABLED" /> എന്നതിലേക്ക് സജ്ജീകരിച്ചിരിക്കുമ്പോൾ, Google ലൊക്കേഷൻ സേവനങ്ങൾ പ്രാഥമികമായി പ്രവർത്തനക്ഷമമായിരിക്കും.
+
+      ഈ നയം <ph name="GLS_UNDER_USER_CONTROL" /> എന്നതിലേക്ക് സജ്ജീകരിച്ചിരിക്കുമ്പോൾ Google ലൊക്കേഷൻ സേവനങ്ങൾ ഉപയോഗിക്കണോ എന്ന് തിരഞ്ഞെടുക്കാൻ ഉപയോക്താവിനോട് ആവശ്യപ്പെടും. ഉപകരണ ലൊക്കേഷൻ ചോദിക്കുന്നതിനായി സേവനങ്ങൾ ഉപയോഗിക്കാൻ ഇത് Android ആപ്പുകളെ അനുവദിക്കും, Google-ന് അജ്ഞാത ലൊക്കേഷൻ ഡാറ്റ സമർപ്പിക്കുന്നത് പ്രവർത്തനക്ഷമമാക്കുകയും ചെയ്യും.
+
+      പ്രാഥമിക സജ്ജീകരണ സമയത്ത് മാത്രമാണ് Google ലൊക്കേഷൻ സേവനങ്ങളുടെ നിലയെ ഈ നയം നിയന്ത്രിക്കുന്നുവെന്ന കാര്യം ശ്രദ്ധിക്കുക. ഇതിന് ശേഷം ഉപയോക്താവിന് Android ക്രമീകരണം തുറന്ന് Google ലൊക്കേഷൻ സേവനങ്ങൾ ഓൺ/ഓഫ് ആക്കാം.
+
+      <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> നയം <ph name="BLOCK_GEOLOCATION_SETTING" /> എന്നതിലേക്ക് സജ്ജീകരിച്ചിരിക്കുമ്പോൾ, ഈ നയം അവഗണിക്കപ്പെടുകയും Google സേവനങ്ങൾ എല്ലായ്‌പ്പോഴും പ്രവർത്തനരഹിതമായിരിക്കുകയും ചെയ്യുമെന്ന കാര്യം ശ്രദ്ധിക്കുക.</translation>
 <translation id="6141402445226505817">എല്ലായ്‌പ്പോഴും പ്രാദേശിക സമയമേഖല കണ്ടെത്തൽ ഉപയോഗിക്കുക</translation>
 <translation id="6145799962557135888">JavaScript പ്രവർത്തിപ്പിക്കാൻ അനുവദിച്ചിരിക്കുന്ന സൈറ്റുകളെ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ഒരു ലിസ്റ്റ് സജ്ജമാക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു.
 
@@ -2687,9 +2804,17 @@
       പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, ഓട്ടോഫിൽ ഫോം ഡാറ്റ ഇമ്പോർട്ട് ചെയ്യില്ല.
 
       സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, അത് ഇമ്പോർട്ട് ചെയ്യണോയെന്നു ചോദിക്കും, അല്ലെങ്കിൽ സ്വയമേവ ഇമ്പോർട്ട് ചെയ്യൽ നടക്കും.</translation>
+<translation id="6221175752766085998">subjectAlternativeName വിപുലീകരണം ഇല്ലാതെ ലോക്കൽ ട്രസ്‌റ്റ് ആങ്കർമാർ നൽകുന്ന സർട്ടിഫിക്കറ്റുകൾ അനുവദിക്കുന്നു</translation>
 <translation id="6224304369267200483">URL-കൾ/ഡൊമെയ്‌നുകൾ നേരിട്ടുള്ള സുരക്ഷ കീ അറ്റസ്‌റ്റേഷൻ സ്വമേധയാ അനുവദിച്ചിരിക്കുന്നു</translation>
 <translation id="6233173491898450179">ഡൗൺലോഡ് ഡയറക്ടറി ക്രമീകരിക്കുക</translation>
 <translation id="6244210204546589761">തുടക്കത്തില്‍ തന്നെ URL-കള്‍ തുറക്കാന്‍</translation>
+<translation id="6255387031094435995">ഒരേ സ്‌കോപ്പും ലെവലും ഉള്ള തിരഞ്ഞെടുത്ത നയങ്ങൾ വ്യത്യസ്‌ത ഉറവിടങ്ങളിൽ നിന്നുള്ളവയാകുമ്പോൾ അവയെ ലയിപ്പിക്കാൻ അനുവദിക്കുന്നു.
+
+        ഒരു നയം ലിസ്‌റ്റിലുണ്ടെങ്കിൽ, രണ്ട് ഉറവിടങ്ങൾ തമ്മിൽ വൈരുദ്ധ്യമുണ്ടായാൽ അവയ്ക്ക്‌ ഒരേ സ്‌കോപ്പുകളും ലെവലുകളും ഉള്ള സാഹചര്യത്തിൽ മൂല്യങ്ങൾ പുതിയ നയ ലിസ്‌റ്റുമായി ലയിപ്പിക്കും.
+
+        ഒരു നയം ലിസ്‌റ്റിലുണ്ടെങ്കിൽ, രണ്ട് ഉറവിടങ്ങൾ തമ്മിലും വ്യത്യസ്‌ത സ്‌കോപ്പുകളും ഒപ്പം/അല്ലെങ്കിൽ ലെവലുകളും തമ്മിലും വൈരുദ്ധ്യമുണ്ടായാൽ, ഉയർന്ന മുൻഗണനയുള്ള നയം ബാധകമാകും.
+
+        നയം ലിസ്‌റ്റിൽ ഇല്ലെങ്കിൽ, ഉറവിടങ്ങളും സ്‌കോപ്പുകളും ഒപ്പം/അല്ലെങ്കിൽ ലെവലുകളും തമ്മിൽ എന്തെങ്കിലും വൈരുദ്ധ്യമുണ്ടായാൽ, ഉയർന്ന മുൻഗണനയുള്ള നയം ബാധകമാകും.</translation>
 <translation id="6258193603492867656">ജനറേറ്റുചെയ്‌ത Kerberos SPN-ല്‍ മാനദണ്ഡമില്ലാത്ത ഒരു പോര്‍ട്ട് ഉള്‍പ്പെടുത്തണമോ എന്ന് നിര്‍ദേശിക്കുന്നു.
 
           നിങ്ങള്‍ ഈ ക്രമീകരണം പ്രാപ്‌തമാക്കിയിട്ടുണ്ടെങ്കിലും ഒരു മാനദണ്ഡമില്ലാത്ത ഒരു പോര്‍ട്ട് (അതായത്, 80 അല്ലെങ്കിൽ 443 ഒഴികെയുള്ള ഒരു പോർട്ട്) നൽകുന്നുവെങ്കിൽ, ജനറേറ്റുചെയ്‌ത Kerberos SPN-ല്‍ ഇത് ഉള്‍പ്പെടുത്തുന്നതാണ്.
@@ -2891,6 +3016,7 @@
 <translation id="6757438632136860443"><ph name="FLASH_PLUGIN_NAME" /> പ്ലഗിൻ റൺ ചെയ്യാൻ അനുവദിക്കപ്പെട്ടിട്ടുള്ള സൈറ്റുകൾ വ്യക്തമാക്കുന്ന url പാറ്റേണുകളുടെ ഒരു ലിസ്‌റ്റ് സജ്ജീകരിക്കുന്നതിന് നിങ്ങളെ അനുവദിക്കുന്നു.
 
           ഈ നയം സജ്ജമാക്കാതെ വിട്ടിരിക്കുകയാണെങ്കിൽ, എല്ലാ സൈറ്റുകൾക്കും വേണ്ടി, ആഗോള ഡിഫോൾട്ട് മൂല്യം ഉപയോഗിക്കപ്പെടും;  'DefaultPluginsSetting' നയം സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ അതിൽ നിന്നോ, സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, ഉപയോക്താവിന്റെ വ്യക്തിഗത കോൺഫിഗറേഷനിൽ നിന്നോ ഉള്ള മൂല്യമാണ് ഉപയോഗിക്കപ്പെടുക.</translation>
+<translation id="6757613329154374267">ബാക്കപ്പെടുത്ത് പുനഃസ്ഥാപിക്കൽ പ്രവർത്തനക്ഷമമാക്കി</translation>
 <translation id="6762235610019366960"><ph name="PRODUCT_NAME" />-ലുള്ള പൂർണ്ണ-ടാബ് പ്രൊമോഷണലിന്റെ ഒപ്പം/അല്ലെങ്കിൽ വിദ്യാഭ്യാസ സംബന്ധിയായ ഉള്ളടക്കത്തിന്റെ അവതരണത്തെ നിയന്ത്രിക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു.
 
       കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിലോ പ്രവർത്തനക്ഷമമാക്കിയില്ലെങ്കിലോ ('ട്രൂ' എന്നായി സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ), ഉൽപ്പന്ന വിവരങ്ങൾ നൽകുന്നതിന് ഉപയോക്താക്കൾക്ക് <ph name="PRODUCT_NAME" /> പൂർണ്ണ-ടാബ് ഉള്ളടക്കം കാണിച്ചേക്കാം.
@@ -2913,6 +3039,7 @@
       സ്‌ട്രിംഗിൽ ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR}, ${MACHINE_NAME} എന്നീ വേരിയബിളുകൾ അടങ്ങിയിരിക്കും, ഒരു ഹോസ്‌റ്റ്നാമമായി ഉപയോഗിക്കുന്നതിന് മുമ്പ്, ഈ വേരിയബിളുകൾക്ക് പകരം, ഉപകരണത്തിലുള്ള മുല്യങ്ങൾ ഉപയോഗിക്കപ്പെടും. തൽഫലമായി ഉണ്ടാകുന്ന പകരംവയ്ക്കൽ ഒരു സാധുവായ ഹോസ്‌റ്റ്‌നാമം ആയിരിക്കണം (RFC 1035, വിഭാഗം 3.1 പ്രകാരം).
 
       ഈ നയം സജ്ജീകരിക്കാതിരിക്കുകയോ, പകരംവയ്‌ക്കലിന് ശേഷമുള്ള മൂല്യം സാധുവായ ഹോസ്‌റ്റ്നാമം അല്ലെങ്കിലോ, DHCP അഭ്യർത്ഥനയിൽ ഒരു ഹോസ്‌റ്റ്നാമവും സജ്ജീകരിക്കപ്പെടില്ല. </translation>
+<translation id="6833988859168635883">ആരംഭം, ഹോം പേജ്, പുതിയ ടാബ് പേജ്</translation>
 <translation id="6835883744948188639">വീണ്ടും സമാരംഭിക്കൽ ശുപാർശ ചെയ്‌തിരിക്കുന്നു എന്ന് സൂചിപ്പിക്കുന്ന ആവർത്തിച്ചുള്ള നിര്‍ദ്ദേശം ഉപയോക്താവിനെ കാണിക്കുക</translation>
 <translation id="6837480141980366278"><ph name="PRODUCT_NAME" /> എന്നതിൽ അന്തർനിർമ്മിതമായ DNS ക്ലയന്റ് ഉപയോഗിക്കണോ എന്നത് നിയന്ത്രിക്കുന്നു.
 
@@ -3025,6 +3152,17 @@
 സ്ക്രീൻ മങ്ങിക്കാനാവുമ്പോൾ, സ്‌മാർട്ട് ഡിം മോഡൽ, സ്ക്രീനിന്റെ മങ്ങിക്കൽ നീട്ടിവെക്കണോ എന്ന് വിലയിരുത്തുന്നു. സ്‌മാർട്ട് ഡിം മോഡൽ സ്ക്രീൻ മങ്ങുന്നത് നീട്ടിവെക്കുന്നു എങ്കിൽ, സ്ക്രീൻ മങ്ങുന്നത് വരെയുള്ള സമയം ഇത് ഫലപ്രദമായി ദീർഘിപ്പിക്കും. ഈ സാഹചര്യത്തിൽ, സ്ക്രീൻ ഓഫ്, സ്ക്രീൻ ലോക്ക്, നിഷ്ക്രിയമായിരിക്കുമ്പോഴുള്ള കാലതാമസം എന്നിവ, യഥാർത്ഥത്തിൽ കോൺഫിഗർ ചെയ്‌ത അതേ സ്ക്രീൻ മങ്ങൽ കാലതാമസത്തിൽ നിന്നുള്ള പരിധികൾ നിലനിർത്താനായി ക്രമീകരിക്കപ്പെടുന്നു.
 
 ഈ നയം 'ശരി' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിലോ സജ്ജീകരിക്കാതിരുന്നാലോ, സ്‌മാർട്ട് ഡിം മോഡൽ പ്രവർത്തനക്ഷമമാക്കുകയും സ്ക്രീൻ മങ്ങുന്നതുവരെ സമയം ദീർഘിപ്പിക്കാൻ അനുവദിക്കുകയും ചെയ്യും. ഈ നയം 'തെറ്റ്' എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, സ്ക്രീൻ മങ്ങിക്കുന്നതിനെ, സ്‌മാർട്ട് ഡിം മോഡൽ ബാധിക്കില്ല.</translation>
+<translation id="6967394885063085697">വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് പവർ മാനേജ്‌മെന്റ് നയം പ്രവർത്തനക്ഷമമാക്കുക.
+
+          ബാറ്ററിയുടെ ആയുസ് വർധിപ്പിക്കാൻ വിപുലീകരിച്ച ബാറ്ററി ചാർജിംഗ് മോഡ് ഉപയോക്താവിനെ സഹായിക്കുന്നു. വിപുലീകരിച്ച ചാർജിംഗ് മോഡിൽ ആയിരിക്കുമ്പോൾ സിസ്‌റ്റം പ്രവർത്തിക്കാത്ത സമയങ്ങളിൽ ബാറ്ററിയുടെ ആയുസ് വർധിപ്പിക്കാൻ അടിസ്ഥാന ചാർജിംഗ് അൽഗരിതവും മറ്റ് സാങ്കേതികവിദ്യകളും ഉപയോഗിക്കുന്നു. പ്രവർത്തന സമയത്ത് എക്‌സ്‌പ്രസ് ചാർജ് ഉപയോഗിക്കുന്നു. വേഗത്തിൽ ചാർജ് ആകാൻ എക്‌സ്‌പ്രസ് ചാർജ് ബാറ്ററിയെ അനുവദിക്കുന്നതിനാൽ, ബാറ്ററി പെട്ടന്ന് പൂർണ്ണ ചാർജ് ആകുന്നു. ഓരോ ദിവസവും സിസ്‌റ്റം ഏറ്റവുമധികം ഉപയോഗിക്കുന്ന സമയം, ആരംഭ സമയവും സമയ ദൈർഘ്യവും അനുസരിച്ച് വ്യക്തമാക്കുന്നു.
+
+          ഈ നയം ശരി എന്ന് സജ്ജീകരിക്കുകയും DeviceAdvancedBatteryChargeModeDayConfig സജ്ജീകരിക്കുകയും ചെയ്‌താൽ, ഉപകരണത്തിൽ പിന്തുണയ്‌ക്കുമെങ്കിൽ വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് എല്ലായ്‌പ്പോഴും പ്രവർത്തനക്ഷമമായിരിക്കും.
+
+          ഈ നയം തെറ്റ് എന്ന് സജ്ജീകരിച്ചാൽ, വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് എല്ലായ്‌പ്പോഴും പ്രവർത്തനരഹിതമായിരിക്കും.
+
+          ഈ നയം സജ്ജീകരിച്ചാൽ, ഉപയോക്താക്കൾക്ക് ഇത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല.
+
+          ഈ നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് പ്രവർത്തനരഹിതമാകും, ഉപയോക്താക്കൾക്ക് അത് പ്രവർത്തനക്ഷമമാക്കാൻ കഴിയുകയുമില്ല.</translation>
 <translation id="6972540544240464302">ടാസ്ക്ക് ഷെഡ്യൂളർ കോൺഫിഗറേഷൻ തിരഞ്ഞെടുക്കുക</translation>
 <translation id="6979158407327259162">Google ഡ്രൈവ്</translation>
 <translation id="6994082778848658360">ഈ ഫീച്ചറിന് അനുയോജ്യമാണെങ്കിൽ, രണ്ടാം ഘട്ട പരിശോധിച്ചുറപ്പിക്കൽ ഉറപ്പിക്കൽ നൽകുന്നതിന്, ഓൺ-ബോർഡ് സുരക്ഷിത എലമെന്റ് ഹാർഡ്‌വെയർ എങ്ങനെ ഉപയോഗിക്കാൻ കഴിയുമെന്ന് വ്യക്തമാക്കുന്നു. ഉപയോക്‌താവിന്റെ ഭൗതിക സാന്നിധ്യം തിരിച്ചറിയുന്നതിന് മെഷീൻ പവർ ബട്ടൺ ഉപയോഗിക്കുന്നു.
@@ -3104,6 +3242,17 @@
       ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമോ പ്രവർത്തനരഹിതമോ ആക്കുകയാണെങ്കിൽ, ഉപയോക്താക്കൾക്ക് ഇത് മാറ്റാനോ അസാധുവാക്കാനോ കഴിയില്ല.
 
       ഈ നയം സജ്ജമാക്കാതെ വിടുകയാണെങ്കിൽ, അൺലോക്ക് ചെയ്യുന്നതിന് ഒരു പാസ്‌വേഡ് ആവശ്യപ്പെടണോ വേണ്ടയോ എന്നത് ഉപയോക്താവിന് തിരഞ്ഞെടുക്കാനാകും.</translation>
+<translation id="7107148737865880402">USB പവർ പങ്കിടൽ പവർ മാനേജ്‌മെന്റ് നയം പ്രവർത്തനക്ഷമമാക്കുക.
+
+          സിസ്‌റ്റം ബാറ്ററി ഉപയോഗിക്കുന്ന മൊബൈൽ ഫോൺ പോലെയുള്ള ഉപകരണങ്ങൾ ചാർജ് ചെയ്യാൻ ഉപയോഗിക്കാനാകുന്ന ലൈറ്റനിംഗ് ബോൾട്ട് അല്ലെങ്കിൽ ബാറ്ററി ഐക്കൺ ഉപയോഗിച്ച് അടയാളപ്പെടുത്തിയ പ്രത്യേക USB പോർട്ട് ചില ഉപകരണങ്ങളിലുണ്ട്. സിസ്‌റ്റം സ്ലീപ്പ്, ഷട്ട് ഡൗൺ മോഡുകളിൽ ആയിരിക്കുമ്പോൾ ഈ പോർട്ടിന്റെ ചാർജിംഗ് രീതിയെ ഈ നയം ബാധിക്കുന്നു. സിസ്‌റ്റം സജീവമായിരിക്കുമ്പോൾ മറ്റ് USB പോർട്ടുകളെയും ചാർജിംഗ് രീതിയെയും ഈ നയം ബാധിക്കില്ല.
+
+          സജീവമായിരിക്കുമ്പോൾ, USB പോർട്ട് എപ്പോഴും പവർ നൽകുന്നു.
+
+          സ്ലീപ്പ് മോഡിൽ ആയിരിക്കുമ്പോൾ, ഈ നയം ശരി എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഉപകരണം വോൾ ചാർജറിൽ കണക്‌റ്റ് ചെയ്‌തിരിക്കുമ്പോഴോ ബാറ്ററി നില 50%-ത്തിൽ താഴെയാണെങ്കിലോ USB പോർട്ടിലേക്ക് പവർ നൽകും. അല്ലെങ്കിൽ പവർ നൽകില്ല.
+
+          ഷട്ട് ഡൗൺ ആയിരിക്കുമ്പോൾ, ഈ നയം ശരി എന്ന് സജ്ജീകരിച്ചിട്ടുണ്ടെങ്കിൽ, ഉപകരണം വോൾ ചാർജറിലേക്ക് പ്ലഗ് ഇൻ ചെയ്‌തിരിക്കുമ്പോൾ USB പോർട്ടിലേക്ക് പവർ നൽകും. അല്ലെങ്കിൽ പവർ നൽകില്ല.
+
+          ഈ നയം സജ്ജീകരിക്കാതെ വിട്ടാൽ, നയം പ്രവർത്തനക്ഷമമായിരിക്കും ഉപയോക്താവിന് അത് പ്രവർത്തനരഹിതമാക്കാനാവുകയുമില്ല.</translation>
 <translation id="7115494316187648452">അവസാന ബ്രൗസർ വിൻഡോ അടച്ചിരിക്കുമ്പോൾ OS ലോഗിനിൽ <ph name="PRODUCT_NAME" /> പ്രോസസ് ആരംഭിച്ചിട്ടുണ്ടോ എന്ന് നിർണ്ണയിക്കുകയും സജീവമായി നിലനിർത്തുന്നതിന്, എല്ലാ സെഷൻ കുക്കികളും ഉൾപ്പെടെ പശ്ചാത്തല ആപ്‌സിനെയും നിലവിലെ ബ്രൗസിംഗ് സെഷനെയും അനുവദിച്ചുകൊണ്ട്, അവസാന ബ്രൗസർ വിൻഡോ അടയ്‌ക്കുന്നവരെ പ്രവർത്തിക്കുകയും ചെയ്യുന്നു. പശ്ചാത്തല പ്രോസസ്, സിസ്‌റ്റം ട്രേയിൽ ഒരു ഐക്കൺ പ്രദർശിപ്പിക്കുന്നതിനാൽ അവിടെ നിന്നുതന്നെ അടയ്ക്കാം.
 
       ഈ നയം ശരി എന്ന് സജ്ജമാക്കുകയാണെങ്കിൽ, പശ്ചാത്തല മോഡ് പ്രവർത്തനക്ഷമമാകും എന്നാൽ പിന്നീട് ബ്രൗസർ ക്രമീകരണത്തിൽ ഉപയോക്താവിന് ഇത് നിയന്ത്രിക്കാൻ കഴിയുകയില്ല.
@@ -3150,6 +3299,7 @@
           ഈ നയം ശരി എന്ന് സജ്ജീകരിക്കുകയോ സജ്ജീകരിക്കാതെ വിടുകയോ AllowWakeLocks തെറ്റ് എന്ന് സജ്ജീകരിക്കാതിരിക്കുകയോ ആണെങ്കിൽ, പവർ മാനേജ്‌മെന്‍റിനായി സ്‌ക്രീൻ വേക്ക് ലോക്കുകൾ പരിഗണിക്കപ്പെടും.
 
           ഈ നയം തെറ്റ് എന്ന് സജ്ജീകരിച്ചാൽ, സ്‌‌ക്രീൻ വേക്ക് ലോക്ക് അഭ്യർത്ഥനകൾ സിസ്‌റ്റം വേക്ക് ലോക്ക് അഭ്യർത്ഥനകളിലേക്ക് തരംതാഴ്‌ത്തപ്പെടും.</translation>
+<translation id="7177857088692019405">അതിവേഗ അൺലോക്ക്</translation>
 <translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="718956142899066210">അപ്‌ഡേറ്റുകൾക്കായി അനുവദിച്ച കണക്ഷൻ തരങ്ങൾ</translation>
 <translation id="7194407337890404814">സ്ഥിരസ്ഥിതി തിരയൽ ദാതാവിന്‍റെ പേര്‌</translation>
@@ -3212,6 +3362,7 @@
 <translation id="7273823081800296768">ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കിയിട്ടുണ്ടെങ്കിലോ കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിലോ, തുടർന്ന് കണക്റ്റുചെയ്യുന്ന സമയത്ത് ഉപയോക്താക്കൾക്ക് ക്ലയന്റുകളും ഹോസ്റ്റുകളും ജോടിയാക്കുന്നതിന് തിരഞ്ഞെടുക്കാനാകും, എല്ലായ്‌പ്പോഴും ഒരു PIN നൽകേണ്ടതില്ല.
 
           ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയിട്ടുണ്ടെങ്കിൽ, തുടർന്ന് ഈ സവിശേഷത ലഭ്യമാകില്ല.</translation>
+<translation id="7274077256421167535">USB പവർ പങ്കിടൽ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="7275334191706090484">നിയന്ത്രിത ബുക്ക്‌മാർക്കുകൾ</translation>
 <translation id="7291084543582732020">ഈ ക്രമീകരണം പ്രവർത്തനക്ഷമമാക്കുകയാണെങ്കിൽ, ഫീച്ചറിനുള്ള ആവശ്യകതകൾ പാലിക്കുന്നുണ്ടെങ്കിൽ Smart Lock ഉപയോഗിക്കാൻ ഉപയോക്താക്കളെ അനുവദിക്കും. 
 
@@ -3351,6 +3502,15 @@
       നയം 0 ആണെങ്കിൽ, ഡിഫോൾട്ട് കാഷെ വലുപ്പം ഉപയോഗിക്കും എന്നാൽ ഉപയോക്താവിന് അത് മാറ്റാനാകില്ല.
 
       നയം സജ്ജമാക്കിയിട്ടില്ലെങ്കിൽ, ഡിഫോൾട്ട് വലുപ്പം ഉപയോഗിക്കുകയും ഉപയോക്താവിന് --media-cache-size ഫ്ലാഗ് ഉപയോഗിച്ച് അത് അസാധുവാക്കാനാകുകയും ചെയ്യും.</translation>
+<translation id="759389052790680884">ബാറ്ററിയുടെ ചാർജ്, ഇഷ്‌ടാനുസൃത ചാർജിംഗ് അവസാനിപ്പിക്കൽ ശതമാനത്തിൽ സജ്ജീകരിക്കുക.
+
+          ബാറ്ററിയുടെ ചാർജിംഗ് അവസാനിപ്പിക്കുന്നതിനുള്ള ഇഷ്‌ടാനുസൃത മൂല്യം എത്തിക്കഴിയുമ്പോൾ ബാറ്ററി ചാർജ് ചെയ്യുന്നത് അവസാനിപ്പിക്കുന്നു.
+
+          DeviceBatteryChargeCustomStopCharging എന്നതിനേക്കാൾ കുറവായിരിക്കണം DeviceBatteryChargeCustomStartCharging.
+
+          DeviceBatteryChargeMode ഇഷ്‌ടാനുസൃതമെന്ന് സജ്ജീകരിച്ചാൽ മാത്രമേ ഈ നയം ഉപയോഗിക്കൂ.
+
+          ഈ നയം കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിലോ സജ്ജീകരിക്കാതെ വിടുകയോ ചെയ്‌താൽ, അടിസ്ഥാന ബാറ്ററി ചാർജ് മോഡ് ബാധകമാകും.</translation>
 <translation id="759957074386651883">സുരക്ഷിത ബ്രൗസിംഗ് ക്രമീകരണം</translation>
 <translation id="7604169113182304895">ഈ ലിസ്‌റ്റ്‌ ഉപയോഗിക്കാൻ Android ആപ്പുകൾ സ്വയമേവ തിരഞ്ഞെടുത്തേക്കാം. നിങ്ങൾക്ക്‌ ഇത് ഉപയോഗിക്കാൻ അവയെ നിർബന്ധിക്കാനാവില്ല.</translation>
 <translation id="7612157962821894603"><ph name="PRODUCT_NAME" /> സ്റ്റാർട്ട് അപ്പിൽ സിസ്റ്റമുടനീളമുള്ള ഫ്ലാഗുകൾ പ്രയോഗിക്കണം</translation>
@@ -3428,6 +3588,15 @@
 <translation id="7712109699186360774">ഒരു സൈറ്റിന് എന്‍റെ ക്യാമറ കൂടാതെ/അല്ലെങ്കിൽ മൈക്രോഫോൺ ആക്‌സസ് ചെയ്യണമെന്നുള്ളപ്പോഴെല്ലാം ചോദിക്കുക</translation>
 <translation id="7713608076604149344">ഡൗൺലോഡ് നിയന്ത്രണങ്ങൾ</translation>
 <translation id="7715711044277116530">അവതരണ മോഡിൽ സ്‌ക്രീൻ മങ്ങുന്നതിന്റെ കാലതാമസം സ്‌കെയിൽ ചെയ്യുന്നതനുസരിച്ചുള്ള ശതമാനം</translation>
+<translation id="7716781462866245042">വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് ദിന കോൺഫിഗറേഷൻ സജ്ജീകരിക്കുക.
+
+          DeviceAdvancedBatteryChargeModeEnabled ശരി എന്ന് സജ്ജീകരിച്ചാൽ മാത്രമേ ഈ നയം ഉപയോഗിക്കൂ.
+
+          ഈ നയം കോൺഫിഗർ ചെയ്‌തിട്ടില്ലെങ്കിലോ സജ്ജീകരിക്കാതെ വിട്ടാലോ വിപുലീകരിച്ച ബാറ്ററി ചാർജ് മോഡ് എല്ലായ്‌പ്പോഴും പ്രവർത്തനരഹിതമായിരിക്കും.
+
+          ശ്രദ്ധിക്കുക: <ph name="CHARGE_END_TIME_FIELD_NAME" /> എന്നതിനേക്കാൾ കുറവായിരിക്കണം<ph name="CHARGE_START_TIME_FIELD_NAME" />.
+
+         ശ്രദ്ധിക്കുക: <ph name="MINUTE_FIELD_NAME" /> ഫീൽഡിന് <ph name="CHARGE_START_TIME_FIELD_NAME" />, <ph name="CHARGE_END_TIME_FIELD_NAME" /> എന്നിവയിൽ അനുവദിച്ചിരിക്കുന്ന മൂല്യങ്ങൾ 0, 15, 30, 45 എന്നിവയാണ്.</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> ഉപയോഗസഹായി സവിശേഷതകൾ കോൺഫിഗർ ചെയ്യുക.</translation>
 <translation id="7724994675283793633">HTTP-യ്‌ക്കായി 80-ഉം HTTPS-ന് 443-ഉം ഉപയോഗിക്കുന്നത് ഒഴിവാക്കി ഈ നയം പോർട്ടുകളിൽ HTTP/0.9 പ്രവർത്തനക്ഷമമാക്കുന്നു.
 
@@ -3503,6 +3672,7 @@
       സൈൻ-ഇൻ സ്‌ക്രീനിൽ ഒരു സ്‌ക്രീൻ സേവർ ആയി ഉപയോഗിക്കുന്ന വിപുലീകരണത്തിന്റെ ഐഡി നിർണ്ണയിക്കുന്നു. വിപുലീകരണം, AppPacks നയം മുഖേന ഈ ഡൊമെയ്‌നിനായി കോൺഫിഗർ ചെയ്‌തിരിക്കുന്ന AppPack-ന്റെ ഭാഗമായിരിക്കണം.</translation>
 <translation id="7882857838942884046">Google Sync പ്രവർത്തനരഹിതമാക്കുന്നത് Android ബായ്‌ക്കപ്പും പുനഃസ്ഥാപിക്കലും ശരിയായി പ്രവർത്തിക്കാതിരിക്കാൻ കാരണമായേക്കാം.</translation>
 <translation id="7882890448959833986">പിന്തുണയ്‌ക്കാത്ത OS മുന്നറിയിപ്പ് നിയന്ത്രിക്കുക</translation>
+<translation id="7895553628261067384">റിമോട്ട് ആക്‌സസ്</translation>
 <translation id="7902255855035461275">ഈ ലിസ്‌റ്റിലെ പാറ്റേണുകൾ, അഭ്യർത്ഥിക്കുന്ന URL-ന്റെ സുരക്ഷാ ഉറവിടവുമായി
       പൊരുത്തപ്പെടും. ഒരു പൊരുത്തം കണ്ടെത്തിയാൽ ആവശ്യപ്പെടാതെ തന്നെ
       ഓഡിയോ ക്യാപ്‌ചർ ഉപകരണത്തിലേക്ക് ആക്‌സസ് അനുവദിക്കും.
@@ -3516,6 +3686,11 @@
 <translation id="7937491150792971922">ഒന്നിലധികം ഉറവിടങ്ങളിൽ നിന്നുള്ള വിപുലീകരണം ഇൻസ്‌റ്റാൾ ചെയ്യൽ ലിസ്‌റ്റ് നയങ്ങൾ ലയിപ്പിക്കുക</translation>
 <translation id="7937766917976512374">വീഡിയോ ക്യാപ്‌ചർ അനുവദിക്കുകയോ നിരസിക്കുകയോ ചെയ്യുക</translation>
 <translation id="7941975817681987555">ഒരു നെറ്റ്‌വർക്ക് കണക്ഷനിലും നെറ്റ്‌വർക്ക് പ്രവർത്തനങ്ങൾ മുൻകൂട്ടി നൽകരുത്</translation>
+<translation id="7952007677054834789">പേജുകൾ <ph name="PRODUCT_NAME" /> എന്നതിലെ ഡിഫോൾട്ട് ഹോം പേജിലും പുതിയ ഡിഫോൾട്ട് ടാബ് പേജിലും ആരംഭത്തിൽ ലോഡ് ആകാനും ഉപയോക്താക്കൾ അത് മാറ്റുന്നതിൽ നിന്ന് തടയുന്നതിനും കോൺഫിഗർ ചെയ്യുക.
+
+      ഹോം പേജാക്കുന്നതിന് നിങ്ങൾ ഒരു പുതിയ ടാബ് തിരഞ്ഞടുക്കുകയോ ഒരു URL ആയി സജ്ജീകരിക്കുകയും ഒപ്പം ഒരു ഹോം പേജ് URL വ്യക്‌തമാക്കുകയോ ചെയ്‌താൽ ഉപയോക്താവിന്റെ ഹോം പേജ് ക്രമീകരണം പൂർണ്ണമായും ലോക്ക് ഡൗൺ മാത്രമാകും. ഹോം പേജ് URL വ്യക്തമാക്കുന്നില്ലെങ്കിൽ, 'chrome://newtab' എന്നത് വ്യക്‌തമാക്കിക്കൊണ്ട് ഉപയോക്താവിന് പുതിയ ടാബ് പേജിൽ ഹോം പേജ് ക്രമീകരിക്കാനാവും.
+
+      'ആരംഭ പ്രവർത്തനത്തിലെ' 'URL-കളുടെ ലിസ്‌റ്റ് തുറക്കുക' എന്നത് നിങ്ങൾ തിരഞ്ഞെടുത്തിട്ടില്ലെങ്കിൽ 'ആരംഭത്തിൽ തുറക്കേണ്ട URLകൾ' എന്ന നയം അവഗണിക്കപ്പെടും.</translation>
 <translation id="7952958573604504839"><ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" /> എന്നതിനെ അനുകൂലിച്ചുകൊണ്ട് M48-ൽ ഈ നയം അവസാനിപ്പിച്ച്, M54-ൽ നിന്ന് നീക്കംചെയ്‌തു.
 
       <ph name="PRODUCT_NAME" /> എന്നതിൽ നെറ്റ്‌വർക്ക് പ്രവചനം പ്രവർത്തനക്ഷമമാക്കുകയും ഈ ക്രമീകരണം മാറ്റുന്നതിൽ നിന്ന് ഉപയോക്താക്കളെ തടയുകയും ചെയ്യുന്നു.
@@ -3659,6 +3834,7 @@
 <translation id="8176035528522326671">എന്റർപ്രൈസ് ഉപയോക്താവിനെ പ്രാഥമിക മൾട്ടിപ്രൊഫൈൽ ഉപയോക്താവായി മാത്രം അനുവദിക്കുക (എന്റർപ്രൈസ് നിയന്ത്രിത ഉപയോക്താക്കൾക്കായുള്ള ഡിഫോൾട്ട് പെരുമാറ്റരീതി)</translation>
 <translation id="8214600119442850823">പാസ്‌വേഡ് മാനേജർ കോൺഫിഗർ ചെയ്യുന്നു.</translation>
 <translation id="8217516105848565518">ഈ നയം അവസാനിപ്പിച്ചിരിക്കുന്നു. പകരം RemoteAccessHostDomainList ഉപയോഗിക്കുക.</translation>
+<translation id="8244171102276095471">TLS-ൽ RC4 സൈഫർ സ്യൂട്ടുകൾ പ്രവർത്തനക്ഷമമാക്കുക</translation>
 <translation id="8244525275280476362">നയ അസാധുവാക്കലിന് ശേഷമുള്ള പരമാവധി ലഭ്യമാക്കൽ കാലതാമസം</translation>
 <translation id="8256688113167012935">അനുബന്ധ ഉപകരണ-പ്രാദേശിക അക്കൗണ്ടിനായി ലോഗിൻ സ്‌ക്രീനിൽ കാണിച്ചിരിക്കുന്ന <ph name="PRODUCT_OS_NAME" /> അക്കൗണ്ട് പേര് നിയന്ത്രിക്കുന്നു.
 
@@ -3699,6 +3875,7 @@
 <translation id="8312129124898414409">വെബ്‌സൈറ്റുകൾക്ക് കീ സൃഷ്‌ടിക്കൽ ഉപയോഗിക്കാൻ അനുവാദമുണ്ടോയെന്ന് സജ്ജമാക്കാൻ നിങ്ങളെ അനുവദിക്കുന്നു. കീ സൃഷ്‌ടിക്കൽ ഉപയോഗിക്കുന്നത് എല്ലാ വെബ്‌സൈറ്റുകൾക്കുമായി അനുവദിക്കാം അല്ലെങ്കിൽ എല്ലാ വെബ്‌സൈറ്റുകൾക്കുമായി നിരസിക്കാം.
 
           ഈ നയം സജ്ജമാക്കാത്ത നിലയിലാണെങ്കിൽ, 'BlockKeygen' ഉപയോഗിക്കുന്നതാണ് ഒപ്പം ഉപയോക്താവിന് ഇത് മാറ്റാനുമാകും.</translation>
+<translation id="8320149248919453401">ബാറ്ററി ചാർജ് മോഡ്</translation>
 <translation id="8329984337216493753">ഈ നയം റീട്ടെയ്ൽ മോഡിൽ മാത്രം സജീവമാണ്.
 
       DeviceIdleLogoutTimeout വ്യക്തമാക്കുമ്പോൾ, ലോഗൗട്ട് നിർവ്വഹിക്കുന്നതിന് മുമ്പ് ഉപയോക്താവിന് ദൃശ്യമാകുന്ന ഒരു കൗണ്ട് ഡൗൺ ടൈമറോടുകൂടിയ മുന്നറിയിപ്പ് സന്ദേശത്തിന്റെ സമയദൈർഘ്യത്തെ ഈ നയം നിർവചിക്കുന്നു.
@@ -3849,6 +4026,7 @@
       സജ്ജീകരിച്ചിട്ടില്ലെങ്കിൽ, <ph name="PRODUCT_OS_NAME" /> ഉപകരണങ്ങൾക്ക് 345600000 മില്ലിസെക്കൻഡിന്റെയും (നാല് ദിവസം) <ph name="PRODUCT_NAME" />-ന് 604800000 മില്ലിസെക്കൻഡിന്റെയും (ഒരു ആഴ്‌ച) ഡിഫോൾട്ട് കാലയളവ് ഉപയോഗിക്കപ്പെടുന്നു.</translation>
 <translation id="8685024486845674965">പാസ്‌വേഡ് പുനരുപയോഗിച്ച്, പാസ്‍വേഡ് പരിരക്ഷ മുന്നറിയിപ്പ് ട്രിഗ്ഗര്‍ ചെയ്‌തു</translation>
 <translation id="8693243869659262736">അന്തർനിർമ്മിത DNS ക്ലയന്‍റ് ഉപയോഗിക്കുക</translation>
+<translation id="8698286761337647563">SAML ഉപയോക്താക്കളെ പാസ്‌വേഡ് കാലഹരണപ്പെട്ടാൽ എത്രദിവസം മുമ്പ് അവരെ അറിയിക്കണം</translation>
 <translation id="8703488928438047864">ബോര്‍ഡ് നില റിപ്പോർട്ട് ചെയ്യുക</translation>
 <translation id="8703872185032220081">പവർ പീക്ക് ഷിഫ്‌റ്റ് ദിന കോൺഫിഗറേഷൻ സജ്ജീകരിക്കുക.
 
@@ -3901,6 +4079,7 @@
       ഈ ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കിയിരിക്കുകയോ സജ്ജീകരിക്കാതിരിക്കുകയോ ചെയ്യുന്നെങ്കിൽ, പാസ്‌വേഡ് മാറ്റാനായി https://myaccounts.google.com എന്നതിലേക്ക് പാസ്‌വേഡ് പരിരക്ഷാ സേവനം ഉപയോക്താക്കളെ അയയ്ക്കും.
       ഒരു <ph name="MS_AD_NAME" /> ഡൊമെയ്‌നിൽ ചേർന്നിട്ടുള്ള Windows ഇൻസ്‌റ്റൻസുകളിലോ Windows 10 Pro-യിലോ ഉപകരണ മാനേജ്‌മെന്‍റിനായി എൻറോൾ ചെയ്‌ത എന്‍റർപ്രൈസ് ഇൻസ്‌റ്റൻസുകളിലോ മാത്രമേ ഈ നയം ലഭ്യമാകൂ.</translation>
 <translation id="8798099450830957504">സ്ഥിരസ്ഥിതി</translation>
+<translation id="8800453707696044281">ബാറ്ററി ചാർജ് ഇഷ്‌ടാനുസൃത ചാർജിംഗ് അവസാനിപ്പിക്കൽ ശതമാനത്തിൽ സജ്ജീകരിക്കുക</translation>
 <translation id="8801680448782904838">ബ്രൗസർ റീലോഞ്ച് ചെയ്യൽ അല്ലെങ്കിൽ ഉപകരണം റീസ്‌റ്റാർട്ട് ചെയ്യൽ ശുപാർശ ചെയ്യുന്നു എന്നോ ആവശ്യമാണ് എന്നോ ഉപയോക്താവിനെ അറിയിക്കുക</translation>
 <translation id="8818173863808665831">ഉപകരണത്തിന്റെ ഭൂമിശാസ്‌ത്ര ലൊക്കേഷൻ റിപ്പോർട്ടുചെയ്യുക..
 
@@ -4013,6 +4192,11 @@
       SAML ഉപയോഗിച്ച് പ്രാമാണീകരിച്ച ഉപയോക്താക്കൾക്ക് മാത്രമേ ഈ നയം ബാധകമാകൂ. 
 
       ഈ നയത്തിന്റെ മൂല്യം സെക്കൻഡിൽ വ്യക്തമാക്കണം.</translation>
+<translation id="9018338365267278833">ഇൻസ്‌റ്റലേഷൻ മോഡ് ബ്ലോക്ക് ചെയ്‌തിരിക്കുന്നു എന്ന് സജ്ജീകരിച്ചിരിക്കുന്നതും അവയിലെ ലോക്കൽ ഡാറ്റയെ ശുദ്ധീകരിക്കുകയും ചെയ്യുന്ന <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> എന്നതിൽ ദൃശ്യമാകുന്ന വിപുലീകരണങ്ങളെയോ <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> എന്നതിൽ ദൃശ്യമാകുന്ന വിപുലീകരണങ്ങളെയോ ഇത് നീക്കം ചെയ്യും.  ലോക്കലായി സംഭരിച്ചിട്ടില്ലാത്ത ഉപയോക്തൃ ഡാറ്റയ്‌ക്ക് എന്ത് സംഭവിക്കുമെന്ന് മനസ്സിലാക്കാൻ വിപുലീകരണങ്ങളുടെ സ്വകാര്യതാ നയമോ ഡാറ്റാ നിലനിർത്തൽ നയമോ പരിശോധിക്കുക.
+
+      നയം പ്രവർത്തനക്ഷമമാക്കി എന്ന് സജ്ജീകരിക്കുമ്പോൾ, മുമ്പ് പരാമർശിച്ച ലിസ്‌റ്റുകളിലെ (ഒരു മെഷീനിൽ മുമ്പേ ഇൻസ്‌റ്റാൾ ചെയ്‌തിട്ടുണ്ടെങ്കിൽ) വിപുലീകരണങ്ങൾ ആ മെഷീനിൽ നിന്ന് പരിപൂർണ്ണമായി (ലോക്കൽ ഉപയോക്തൃ ഡാറ്റ ഉൾപ്പെടെ) നീക്കം ചെയ്യപ്പെടും.
+
+      നയം പ്രവർത്തനരഹിതമാക്കി സജ്ജീകരിക്കുമ്പോഴോ സജ്ജീകരിക്കാതെ വിടുമ്പോഴോ, മുമ്പ് പരാമർശിച്ച ലിസ്‌റ്റുകളിലെ (ഒരു മെഷീനിൽ മുമ്പേ ഇൻസ്‌റ്റാൾ ചെയ്‌തിട്ടുണ്ടെങ്കിലും <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />ബ്ലാക്ക്‌ലിസ്‌റ്റിൽ ഉൾപ്പെട്ടവ) വിപുലീകരണങ്ങൾ ആ മെഷീനിൽ പ്രവർത്തനരഹിതമാക്കും എന്നാൽ അൺഇൻസ്‌റ്റാൾ ചെയ്യില്ല.</translation>
 <translation id="9027787254195333560">ഈ നയം ലോഗിൻ സ്‌ക്രീനിലെ ഉപയോക്താവിനെ പ്രതിനിധീകരിക്കുന്ന അവതാർ ചിത്രത്തെ കോൺഫിഗർ ചെയ്യാൻ നിങ്ങളെ അനുവദിക്കുന്നു. അവതാർ ചിത്രം ഡൗൺലോഡ് ചെയ്യാനാകുന്ന <ph name="PRODUCT_OS_NAME" /> എന്നതിൽ നിന്നും ഡൗൺലോഡിന്റെ സമഗ്രത പരിശോധിച്ചുറപ്പിക്കുന്നതിന് ഉപയോഗിക്കുന്ന ഒരു ഗൂഢഭാഷ ഹാഷിൽ നിന്നുമുള്ള URL വ്യക്തമാക്കിയാണ് ഈ നയം സജ്ജീകരിക്കുന്നത്. ചിത്രം JPEG ഫോർമാറ്റിലുള്ളതും, 512kB കവിയാത്ത വലുപ്പത്തിലുള്ളതുമായിരിക്കണം. ഏതൊരു പ്രാമാണീകരണവുമില്ലാതെ തന്നെ URL ആക്‌സസ് ചെയ്യാവുന്നതായിരിക്കണം. 
 
       അവതാർ ചിത്രം ഡൗൺലോഡ് ചെയ്‌ത് കാഷെ ചെയ്‌തു. URL അല്ലെങ്കിൽ ഹാഷ് മാറുമ്പോഴൊക്കെ അത് വീണ്ടും ഡൗൺലോഡ് ചെയ്യും. 
diff --git a/components/policy/resources/policy_templates_mr.xtb b/components/policy/resources/policy_templates_mr.xtb
index 83a7559..1fbabdb 100644
--- a/components/policy/resources/policy_templates_mr.xtb
+++ b/components/policy/resources/policy_templates_mr.xtb
@@ -56,7 +56,7 @@
       हे धोरण सेट केलेले असल्यास, साइन इन स्क्रीन नेहमी या धोरणाच्या (धोरण फॉरवर्ड कंपॅटिबिलिटी सूची म्हणून निर्धारित केलेले आहे) प्रथम मूल्याद्वारे दिलेल्या लोकॅलमध्ये डिस्प्ले केले जाईल. हे धोरण सेट नसेल किंवा ते रिक्त सूचीवर सेट असल्यास, साइन इन स्क्रीन अंतिम वापरकर्ता सेशनच्या लोकॅलमध्ये डिस्प्ले केले जाईल. हे धोरण वैध नसलेल्या मूल्यावर सेट असल्यास,साइन इन स्क्रीन एका फॉलबॅक लोकॅलमध्ये डिस्प्ले केले जाईल (सध्या, en-US).</translation>
 <translation id="1052499923181221200">जो पर्यंत SamlInSessionPasswordChangeEnabled सत्य वर असणार नाही, तो पर्यंत या धोरणाचा प्रभाव होणार नाही.
       ते धोरण सत्य असल्यास आणि हे धोरण १४ (उदाहरणार्थ) वर सेट केले असल्यास, याचा अर्थ असा आहे की SAML वापरकर्त्यांना १४ दिवस आधी सूचित केले जाईल की त्यांचा पासवर्ड एका निश्चित तारखेस एक्स्पायर होणार आहे.
-      त्यानंतर ते सेशनमध्ये पासवर्ड बदलून आणि ते एक्स्पायर होण्यापूर्वी त्यांचे पासवर्ड अपडेट करुन ते त्वरित हाताळू शकतात.
+      त्यानंतर ते सेशनमध्ये पासवर्ड बदलून आणि ते एक्स्पायर होण्यापूर्वी त्यांचे पासवर्ड अपडेट करुन त्वरित हाताळू शकतात.
       पण, या सूचना तेव्हाच दाखवल्या जातात जेव्हा SAML लॉग इन फ्लो दरम्यान SAML ओळख पुरवठ्याद्वारे पासवर्ड एक्स्पायर झाल्याची माहिती डिव्हाइसला पाठवली जाते.
       हे धोरण शून्य वर सेट करणे म्हणजे वापरकर्त्यांना आधीपासून सूचित केले जाणार नाही - पासवर्ड आधीच एक्स्पायर झाल्यानंतर त्यांना फक्त सूचित केले जाईल.
 
@@ -3131,7 +3131,7 @@
       जर हे धोरण सत्य वर सेट असेल किंवा सेट केलेले नसेल तर स्मार्ट डीम मॉडेल सुरू होईल आणि स्क्रीन मंद होईपर्यंत वेळ वाढवण्यासाठी परवानगी देईल. हे धोरण असत्यवर सेट केलेले असेल तर स्मार्ट डीम मॉडेल स्क्रीन मंद होण्यावर प्रभाव होणार नाही.</translation>
 <translation id="6967394885063085697">प्रगत बॅटरी चार्ज मोड पॉवर व्यवस्थापन धोरण सुरू करा.
 
-          प्रगत बॅटरी चार्जिंग मोड वापरकर्त्यास बॅटरीची क्षमता वाढवण्यास अनुमती देते. बॅटरी क्षमता वाढवण्यासाठी काम करत नसतानाच्या तासांमध्ये.प्रगत चार्जिंग मोडमध्ये सिस्टम मानक चार्जिंग अल्गोरिदम आणि इतर तंत्रज्ञानाचा वापर करेल. कामाच्या तासांमध्ये, एक्सप्रेस चार्ज वापरले जाते. हा एक्सप्रेस चार्ज बॅटरी चार्ज करण्यास परवानगी देतो; म्हणून, बॅटरी लवकरच पूर्ण चार्ज होत आहे. प्रत्येक दिवसासाठी ज्या वेळेस सिस्टम सर्वात जास्त वापरला जाईल ती सुरू होण्याची वेळ आणि कालावधी नमूद केला जातो.
+          प्रगत बॅटरी चार्जिंग मोड वापरकर्त्यास बॅटरीची क्षमता वाढवण्यास अनुमती देते. बॅटरी क्षमता वाढवण्यासाठी काम करत नसतानाच्या तासांमध्ये.प्रगत चार्जिंग मोडमध्ये सिस्टम मानक चार्जिंग अल्गोरिदम आणि इतर तंत्रज्ञानाचा वापर करेल. कामाच्या तासांमध्ये, एक्स्प्रेस चार्ज वापरले जाते. हा एक्स्प्रेस चार्ज बॅटरी चार्ज करण्यास परवानगी देतो; म्हणून, बॅटरी लवकरच पूर्ण चार्ज होत आहे. प्रत्येक दिवसासाठी ज्या वेळेस सिस्टम सर्वात जास्त वापरला जाईल ती सुरू होण्याची वेळ आणि कालावधी नमूद केला जातो.
 
           हे धोरण सत्य वर सेट असल्यास, आणि DeviceAdvancedBatteryChargeModeDayConfig हे सेट असल्यास, जर डिव्हाइसवर सपोर्ट करत असेल तर प्रगत बॅटरी चार्ज मोड नेहमी सुरू असेल.
 
@@ -3227,7 +3227,7 @@
 
           बंद असेल तेव्हा, हे धोरण सत्य वर सेट असल्यास, जेव्हा डिव्हाइस भिंतीवरील चार्जरला प्लग इन केले असेल तेव्हा USB पोर्टला पॉवर पुरवली जाईल. अन्यथा पॉवर पुरवली जाणार नाही.
 
-          हे धोरण सेट न केलेले ठेवल्यास, धोरण सुरू केले असते आणि वापरकर्त्याद्वारे बंद केले जाऊ शकत नाही.</translation>
+          हे धोरण सेट न केलेले ठेवल्यास, धोरण सुरू असते आणि वापरकर्त्याद्वारे बंद केले जाऊ शकत नाही.</translation>
 <translation id="7115494316187648452"><ph name="PRODUCT_NAME" /> प्रक्रिया OS लॉगिनवर सुरू झाली किंवा नाही हे निर्धारित करते आणि अंतिम ब्राउझर विंडो बंद झाल्यानंतर देखील चालू ठेवते, आणि कोणत्याही सेशन कुकीसह, बॅकग्राउंड ॲप्स आणि सद्य ब्राउझिंग सेशन सक्रिय ठेवण्याची अनुमती देते.
 
       हे धोरण सत्य वर सेट केले असल्‍यास, बॅकग्राउंड मोड सक्षम केला जातो आणि वापरकर्त्याद्वारे ब्राउझिंग सेटिंग्जमध्‍ये नियंत्रित केला जाऊ शकत नाही.
diff --git a/components/policy/resources/policy_templates_no.xtb b/components/policy/resources/policy_templates_no.xtb
index 4bfa469..a002575 100644
--- a/components/policy/resources/policy_templates_no.xtb
+++ b/components/policy/resources/policy_templates_no.xtb
@@ -51,6 +51,13 @@
 <translation id="1049138910114524876">Konfigurer hvilken lokalitet som brukes på påloggingsskjermen for <ph name="PRODUCT_OS_NAME" />.
 
       Hvis denne regelen er spesifisert, vises påloggingsskjermen alltid med lokaliteten som er angitt av den første verdien i denne regelen. (Regelen defineres som en liste for fremoverkompatibilitet.) Hvis regelen ikke er spesifisert eller den er angitt som en tom liste, vises påloggingsskjermen med lokaliteten for den forrige brukerøkten. Hvis regelen er angitt som en verdi som ikke er noen gyldig lokalitet, vises påloggingsskjermen med en reservelokalitet (som for øyeblikket er en-US).</translation>
+<translation id="1052499923181221200">Denne regelen har ingen virkning med mindre SamlInSessionPasswordChangeEnabled er satt til «true» (sann).
+      Hvis den regelen er satt til «true», og denne regelen er satt til f.eks. 14, betyr det at SAML-brukere blir varslet 14 dager i forveien om at passordene deres kommer til å utløpe på en viss dato.
+      Da kan de håndtere dette umiddelbart ved å endre passord mens de er i en økt, og oppdatere passordene sine før de utløper.
+      Men disse varslene vises kun hvis SAML-identitetsleverandøren sender informasjon om passordutløp til enheten i løpet av SAML-påloggingsflyten.
+      Hvis denne regelen er satt til null, betyr det at brukere ikke blir varslet i forveien – de blir først varslet når passordet allerede er utløpt.
+
+      Hvis denne regelen er angitt, kan ikke brukeren endre eller overstyre den.</translation>
 <translation id="1062011392452772310">Slå på ekstern attestasjon for enheten</translation>
 <translation id="1062407476771304334">Erstatt</translation>
 <translation id="1079801999187584280">Ikke tillat bruk av utviklerverktøy</translation>
@@ -199,6 +206,7 @@
       Hvis regelen er aktivert, får Google-assistenten tilgang til skjermkonteksten.
       Hvis regelen er deaktivert, får ikke Google-assistenten tilgang til skjermkonteksten.
       Hvis regelen ikke er angitt, kan brukerne velge om de vil gi Google-assistenten tilgang til skjermkonteksten eller ikke.</translation>
+<translation id="1376119291123231789">Slå på avansert modus for batterilading</translation>
 <translation id="1383493480903114193">Denne regelen tvinger nettverkskode til å kjøre i nettleserprosessen.
 
       Som standard er denne regelen slått av. Hvis den slås på, kan brukere være utsatt for sikkerhetsproblemene når nettverksprosessen kjøres isolert.
@@ -296,6 +304,18 @@
 <translation id="1477934438414550161">TLS 1.2</translation>
 <translation id="1502843533062797703">Slå på blokkering av innsetting av tredjepartsprogramvare</translation>
 <translation id="1504431521196476721">Ekstern attestering</translation>
+<translation id="1507382822467487898">
+          Konfigurerer hvilken MAC-adresse som brukes ved tilkobling av dokk til enheten.
+
+          Når dokker er koblet til enkelte enhetsmodeller, brukes enhetens dokkspesifikke MAC-adresse som standard til å identifisere enheten på Ethernet. Denne regelen gjør det mulig for administrator å endre MAC-adressens kilde mens enheten er dokket.
+
+          Hvis «DeviceDockMacAddress» er valgt eller regelen ikke er angitt, brukes enhetens dokkspesifikke MAC-adresse.
+
+          Hvis «DeviceNicMacAddress» er valgt, brukes enhetens NIC-MAC-adresse.
+
+          Hvis «DockNicMacAddress» er valgt, brukes dokkens NIC-MAC-adresse.
+
+          Brukeren kan ikke endre denne innstillingen.</translation>
 <translation id="1507957856411744193">Hvis denne regelen angis som «true» (sann), kobles <ph name="PRODUCT_NAME" /> til Cast-enheter på alle IP-adresser, ikke bare private RFC1918/RFC4193-adresser.
 
           Hvis denne regelen angis som «false» (usann), kobles <ph name="PRODUCT_NAME" /> bare til Cast-enheter på private RFC1918/RFC4193-adresser.
@@ -727,6 +747,17 @@
 <translation id="2303795211377219696">Slå på autofyll for kredittkort</translation>
 <translation id="2309390639296060546">Standardinnstilling for geoposisjonering</translation>
 <translation id="2327252517317514801">Spesifiser hvilke domener som har tilgang til G Suite</translation>
+<translation id="2356878440219553005">Angir regelen for strømstyring i modus for batterilading.
+
+          Styr batteriladingen dynamisk for å minimere batterislitasje som følge av batteribelastning, og forleng batterilevetiden.
+
+          Hvis egendefinert modus for batterilading er valgt, må DeviceBatteryChargeCustomStartCharging og DeviceBatteryChargeCustomStopCharging være angitt.
+
+          Hvis denne regelen er angitt, brukes modus for batterilading hvis enheten støtter det.
+
+          Hvis regelen ikke er angitt, men enheten støtter regelen, brukes standard modus for batterilading og kan ikke endres av brukeren.
+
+          Merk: <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> overstyrer denne regelen hvis førstnevnte er angitt.</translation>
 <translation id="237494535617297575">Gjør at du kan angi en liste over nettadressemønstre som spesifiserer hvilke nettsteder som får vise varsler. Hvis denne retningslinjen ikke angis, brukes den globale verdien for alle nettsteder, enten fra retningslinjen DefaultNotificationsSetting hvis den er angitt, eller av brukerens egen konfigurasjon hvis den nevnte retningslinjen ikke er angitt.</translation>
 <translation id="2386362615870139244">Tillat låser for skjermaktivering</translation>
 <translation id="2411817661175306360">Advarsler om passordbeskyttelse er slått av</translation>
@@ -762,6 +793,7 @@
 
       Hvis denne regelen har verdien «False», kan ikke automatisk pålogging uten forsinkelse unngås (hvis den er konfigurert).</translation>
 <translation id="2454228136871844693">Optimaliser for stabilitet.</translation>
+<translation id="2463034609187171371">Slå på DHE-chifferserier i TLS</translation>
 <translation id="2463365186486772703">Lokalitet for program</translation>
 <translation id="2466131534462628618">Autentisering via obligatoriske sider ignorerer proxy-tjenere</translation>
 <translation id="2482676533225429905">Innebygde meldinger</translation>
@@ -941,6 +973,7 @@
 <translation id="2769952903507981510">Konfigurer det ønskede domenenavnet for verter med ekstern adgang</translation>
 <translation id="2787173078141616821">Rapportér informasjon om Android-status</translation>
 <translation id="2799297758492717491">Tillat automatisk avspilling av medier fra en godkjenningsliste for nettadressemønstre</translation>
+<translation id="2801155097555584385">Angi egendefinert startverdi for batterilading i prosent</translation>
 <translation id="2801230735743888564">Gir brukerne mulighet til å spille dinosaurspill-påskeegget når enheten ikke er koblet til.
 
       Hvis denne regelen er satt til false (usann), kan ikke brukerne spille dinosaurspillet når enheten ikke er koblet til. Hvis regelen er satt til true (sann), kan brukerne spille dinosaurspillet. Hvis denne regelen ikke er angitt, kan ikke brukerne spille dinosaurspillet på registrerte Chrome OS-installasjoner, men de kan spille det i andre situasjoner.</translation>
@@ -1014,6 +1047,7 @@
       Hvis du deaktiverer denne innstillingen eller ikke angir noen verdi, brukes skriveren som ble brukt sist, som standard destinasjonsvalg i forhåndsvisningen for utskrifter.
 
       Hvis du aktiverer denne innstillingen, brukes skriveren som er standard for OS-et, som standard destinasjonsvalg.</translation>
+<translation id="285627849510728211">Angi dagskonfigurasjon av avansert modus for batterilading</translation>
 <translation id="2856674246949497058">Rull tilbake og behold målversjonen hvis OS-versjonen er nyere enn målet. Utfør en powerwash i løpet av prosessen.</translation>
 <translation id="2872961005593481000">Slå av</translation>
 <translation id="2873651257716068683">Overstyrer standard sidestørrelse for utskrift. Hvis sidestørrelsen ikke er tilgjengelig, ignoreres regelen.</translation>
@@ -1148,12 +1182,26 @@
 <translation id="3072045631333522102">Skjermsparer som skal brukes på påloggingssiden i detaljistmodus</translation>
 <translation id="3072847235228302527">Angi bruksvilkårene for en konto på enheten</translation>
 <translation id="3077183141551274418">Aktiverer eller deaktiverer fanelivssykluser</translation>
+<translation id="3079417254871857650">Angir handlingen som skal utføres når brukerens hjemmekatalog er opprettet med eCryptfs-kryptering.
+
+      Hvis du setter denne regelen til «DisallowArc», deaktiveres Android-apper for brukeren, og det utføres ingen overføring fra eCryptfs-kryptering til ext4-kryptering. Kjøring av Android-apper hindres ikke når hjemmekatalogen allerede er kryptert med ext4.
+
+      Hvis du setter denne regelen til «Migrate», blir eCryptfs-krypterte hjemmekataloger automatisk overført til ext4-kryptering ved pålogging – uten at brukeren blir bedt om samtykke.
+
+      Hvis du setter denne regelen til «Wipe», blir eCryptfs-krypterte hjemmekataloger automatisk slettet ved pålogging, og nye, ext4-krypterte hjemmekataloger blir opprettet for å erstatte dem. Advarsel: Dette fjerner brukerens lokale data.
+
+      Hvis du setter denne regelen til «MinimalMigrate», blir eCryptfs-krypterte hjemmekataloger automatisk slettet ved pålogging, og nye, ext4-krypterte hjemmekataloger blir opprettet for å erstatte dem. Handlingen forsøker imidlertid å beholde påloggingstoken, slik at brukeren ikke må logge på igjen. Advarsel: Dette fjerner brukerens lokale data.
+
+      Hvis du setter denne regelen til et alternativ som ikke støttes lenger («AskUser» eller «AskForEcryptfsArcUsers»), fungerer den som om du hadde valgt «Migrate» i stedet.
+
+      Denne regelen gjelder ikke for kioskbrukere. Hvis denne regelen ikke er angitt, fungerer enheten som om «DisallowArc» var valgt.</translation>
 <translation id="3086995894968271156">Konfigurer Cast-mottakeren i <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3088796212846734853">Lar deg angi en liste over nettadressemønstre som spesifiserer nettsteder som får vise bilder.
 
           Hvis denne regelen ikke angis, brukes den globale standardverdien for alle nettsteder, enten fra DefaultImagesSetting-regelen hvis den er angitt, eller fra brukerens egen konfigurering hvis ikke.
 
           Merk at denne regelen tidligere var aktivert på Android ved en feil, men den har aldri vært støttet fullt ut på Android.</translation>
+<translation id="3091832372132789233">Lad batteriet på enheter som hovedsakelig er tilkoblet en ekstern strømkilde.</translation>
 <translation id="3096595567015595053">Liste over aktiverte programtillegg</translation>
 <translation id="3101501961102569744">Velg hvordan innstillinger for proxy-tjener angis</translation>
 <translation id="3101709781009526431">Dato og klokkeslett</translation>
@@ -1179,6 +1227,7 @@
           Hvis denne innstillingen er slått av, bruker <ph name="PRODUCT_NAME" /> bare integrerte meldingsverter som er installert på systemnivå.
 
           Hvis denne innstillingen ikke er angitt, tillater <ph name="PRODUCT_NAME" /> bruk av integrerte meldingsverter på brukernivå.</translation>
+<translation id="3177802893484440532">Krev OCSP/CRL-kontroller på nettet for lokale klareringsankre</translation>
 <translation id="3185009703220253572">siden versjon <ph name="SINCE_VERSION" /></translation>
 <translation id="3187220842205194486">Android-apper har ikke tilgang til bedriftsnøkler. Denne regelen har ingen innvirkning på slike.</translation>
 <translation id="3205825995289802549">Maksimer det første nettleservinduet ved den første kjøringen</translation>
@@ -1188,6 +1237,7 @@
 <translation id="3220624000494482595">Hvis kioskappen er en Android-app, har den ikke kontroll over <ph name="PRODUCT_OS_NAME" />-versjonen – selv ikke hvis regelen er angitt som <ph name="TRUE" />.</translation>
 <translation id="3236046242843493070">Nettadressemønstre du vil tillate installasjoner av utvidelser, programmer og brukerskript fra</translation>
 <translation id="3240609035816615922">Regel for tilgang til konfigurering av skrivere.</translation>
+<translation id="3240655340884151271">Dokkens innebygde NIC-MAC-adresse</translation>
 <translation id="3243309373265599239">Angir hvor lenge brukeren kan være inaktiv før skjermen nedtones når enheten kjører på batteristrøm.
 
           Når denne innstillingen er konfigurert til en verdi høyere enn null. angir den hvor lenge brukeren må være inaktiv før <ph name="PRODUCT_OS_NAME" /> nedtoner skjermen.
@@ -1205,6 +1255,12 @@
 <translation id="3284094172359247914">Kontrollér bruken av WebUSB API</translation>
 <translation id="3288595667065905535">Utgivelseskanal</translation>
 <translation id="3292147213643666827">Aktiverer <ph name="PRODUCT_NAME" /> til å fungere som mellomtjener mellom <ph name="CLOUD_PRINT_NAME" /> og tidligere skrivere tilkoblet denne datamaskinen. Hvis innstillingen er aktivert eller ikke konfigurert, kan brukerne aktivere mellomtjener for Google Cloud Print ved hjelp av autentisering i Google-kontoen. Hvis denne innstillingen er deaktivert, kan ikke brukere aktivere mellomtjeneren, og får ikke tilgang til å dele datamaskinens skrivere med <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3312206664202507568">Slår på en side på chrome://password-change som gjør det mulig for SAML-brukere å endre SAML-passordene sine mens de er i en økt. Dette sikrer at SAML-passordet og enhetens låseskjermpassord holdes synkronisert.
+
+      Denne regelen slår også på varsler som advarer SAML-brukere hvis SAML-passordene deres snart utløper, så de kan håndtere dette umiddelbart ved å endre passord mens de er i en økt.
+      Men disse varslene vises kun hvis SAML-identitetsleverandøren sender informasjon om passordutløp til enheten i løpet av SAML-påloggingsflyten.
+
+      Hvis denne regelen er angitt, kan ikke brukeren endre eller overstyre den.</translation>
 <translation id="3322771899429619102">Gjør det mulig å definere en liste med nettadressemønstre for å spesifisere nettsteder som har tillatelse til å bruke nøkkelgenerering. Hvis det er et nettadressemønster i «KeygenBlockedForUrls», overstyrer det disse unntakene.
 
           Hvis denne regelen ikke angis, brukes den globale standardverdien for alle nettstedene, enten fra regelen «DefaultKeygenSetting» hvis den er angitt, eller fra brukerens personlige konfigurasjon.</translation>
@@ -1292,6 +1348,7 @@
 
           Hvis innstillingen er satt til False eller ikke er angitt, begynner tidtakingen av strømstyringsforsinkelser og øktens varighet å løpe umiddelbart når økten starter.</translation>
 <translation id="3478024346823118645">Slett brukerdata ved avlogging</translation>
+<translation id="3480961938508521469">Lad batteriet helt opp i standard hastighet.</translation>
 <translation id="348495353354674884">Aktiver virtuelt tastatur</translation>
 <translation id="3487623755010328395">
         Hvis denne regelen er angitt, prøver <ph name="PRODUCT_NAME" /> å registrere seg og bruke tilknyttede retningslinjer for nettskyen for alle profiler.
@@ -1335,6 +1392,8 @@
 <translation id="3547954654003013442">Innstillinger for proxy-tjener</translation>
 <translation id="355118380775352753">Nettsteder som skal åpnes i en alternativ nettleser</translation>
 <translation id="3554984410014457319">La Google-assistenten lytte etter frasen for taleaktivering</translation>
+<translation id="356579196325389849">Brukere kan konfigurere utgivelseskanalen for Chrome OS</translation>
+<translation id="3575011234198230041">HTTP-autentisering</translation>
 <translation id="3577251398714997599">Annonseinnstillinger for nettsteder med forstyrrende annonser</translation>
 <translation id="357917253161699596">Tillat brukere å administrere brukersertifikater</translation>
 <translation id="3583230441447348508">Spesifiserer en liste over forhåndskonfigurerte delte nettverksressurser.
@@ -1365,6 +1424,7 @@
 
         Denne regelen brukes ved registrering av retningslinjer for nettskyer med maskinomfang på datamaskiner. Den kan angis via registeret eller GPO i Windows, plist på Mac og en JSON-regelfil i Linux.</translation>
 <translation id="3660562134618097814">Overfør SAML IdP-informasjonskapsler ved pålogging</translation>
+<translation id="3668151900457104753">Avinstaller utvidelser på svartelisten</translation>
 <translation id="3701121231485832347">Kontrollerer innstillinger som er spesifikke for <ph name="PRODUCT_OS_NAME" />-enheter som administreres av <ph name="MS_AD_NAME" />.</translation>
 <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Feltet med én linje er avviklet og det fjernes i nær fremtid. Begynn å bruke tekstfeltet med flere linjer nedenfor.)</translation>
 <translation id="3709266154059827597">Konfigurer installasjonssperrelisten for utvidelser</translation>
@@ -1446,6 +1506,16 @@
           Hvis denne innstillingen ikke angis, blir skjermtastaturet i utgangspunktet slått av, men kan slås på av brukeren når som helst.</translation>
 <translation id="382476126209906314">Konfigurer TalkGadget-prefikset for verter med ekstern adgang</translation>
 <translation id="3824972131618513497">Kontrollerer innstillinger tilknyttet strømstyring og omstart.</translation>
+<translation id="3826475866868158882">Google Posisjonstjenester er slått på</translation>
+<translation id="3831054243924627613">Denne regelen styrer innledende tilstand for sikkerhetskopiering og gjenoppretting for Android.
+
+      Når denne regelen er satt til <ph name="BR_DISABLED" /> eller ikke er konfigurert, er sikkerhetskopiering og gjenoppretting for Android i utgangspunktet avslått.
+
+      Når denne regelen er satt til <ph name="BR_ENABLED" />, er sikkerhetskopiering og gjenoppretting for Android i utgangspunktet påslått.
+
+      Når denne regelen er satt til <ph name="BR_UNDER_USER_CONTROL" />, kan brukeren velge om sikkerhetskopiering og gjenoppretting for Android skal brukes. Hvis brukeren slår på sikkerhetskopiering og gjenoppretting, lastes Android-appdata opp til Android-tjenere for sikkerhetskopiering og gjenopprettes derfra når kompatible apper installeres på nytt.
+
+      Merk at denne regelen kun styrer tilstanden for sikkerhetskopiering og gjenoppretting for Android i det innledende oppsettet. Brukeren kan åpne Android-innstillingene senere og slå sikkerhetskopiering og gjenoppretting for Android på eller av.</translation>
 <translation id="3831376478177535007">Når denne innstillingen er aktivert, tillater <ph name="PRODUCT_NAME" /> at sertifikater utstedt av Symantec Corporations eldre PKI-operasjoner kan brukes hvis de ellers godkjennes og er koblet til et gjenkjent CA-sertifikat.
 
       Merk at denne regelen avhenger av at operativsystemet fremdeles gjenkjenner sertifikater fra Symantecs eldre infrastruktur. Hvis en oppdatering av operativsystemet endrer operativsystemets håndtering av slike sertifikater, gjelder ikke denne regelen lenger. Videre er denne regelen ment som en midlertidig løsning for å gi selskaper mer tid på å gå bort fra eldre Symantec-sertifikater. Denne regelen fjernes på eller rundt 1. januar 2019. 
@@ -1527,6 +1597,15 @@
 
           Hvis den ikke er spesifisert eller har verdien false (usann), kan brukere overføre filer til Google Disk.</translation>
 <translation id="3915395663995367577">Nettadresse til en .pac-fil for proxy-tjener</translation>
+<translation id="3920892052017026701">Angi egendefinert startverdi for batterilading i prosent.
+
+          Batteriladingen starter når batterinivået synker under den egendefinerte startverdien for batterilading.
+
+          DeviceBatteryChargeCustomStartCharging må være mindre enn DeviceBatteryChargeCustomStopCharging.
+
+          Denne regelen brukes bare hvis DeviceBatteryChargeMode er satt til egendefinert.
+
+          Hvis denne regelen ikke er konfigurert eller angitt, brukes standard modus for batterilading.</translation>
 <translation id="3925377537407648234">Angi skjermoppløsning og skaleringsfaktor</translation>
 <translation id="3939893074578116847">Send nettverkspakker til administreringstjeneren for å overvåke nettstatusen, slik at
       tjeneren kan oppdage om enheten er uten nett.
@@ -1658,6 +1737,7 @@
 <translation id="4150201353443180367">Skjerm</translation>
 <translation id="4157003184375321727">Rapportering av operativsystem og maskinvareversjon</translation>
 <translation id="4157594634940419685">Gi tilgang til egne CUPS-skrivere</translation>
+<translation id="4160962198980004898">Kilde for enhetens MAC-adresse når enheten er dokket</translation>
 <translation id="4163705126749612234">Konfigurerer de obligatoriske klientdomenenavnene som skal brukes for verter for ekstern tilgang, og hindrer brukerne i å endre dem.
 
           Hvis denne innstillingen er slått på, kan bare klienter fra et av de angitte domenene koble til verten.
@@ -1735,6 +1815,7 @@
       Vær oppmerksom på at selv når regelen inneholder en app-ID, er det ikke sikkert at brukeren kan aktivere den aktuelle appen som en notatapp på låseskjermen. I Chrome 61 er for eksempel settet med tilgjengelige apper også begrenset av plattformen.
 
     Hvis regelen ikke angis, innfører den ikke noen begrensinger for hvilke apper brukeren kan aktivere på låseskjermen.</translation>
+<translation id="4313767483634435271">Enhetens dokkspesifikke MAC-adresse</translation>
 <translation id="4322842393287974810">La den automatisk startede kioskappen uten forsinkelse kontrollere <ph name="PRODUCT_OS_NAME" />-versjonen</translation>
 <translation id="4325690621216251241">Legg til en avloggingsknapp for systemstatusfeltet</translation>
 <translation id="4332177773549877617">Loggfør hendelser for installasjoner av Android-apper</translation>
@@ -1766,6 +1847,7 @@
 <translation id="4360826270668210664">Hvis denne regelen er angitt, krever verten for ekstern tilgang at autentiseringsklientene innhenter et autentiseringstoken fra denne nettadressen før de kobles til. Denne regelen må brukes sammen med RemoteAccessHostTokenValidationUrl.
 
           Denne funksjonen er for øyeblikket slått av på tjenersiden.</translation>
+<translation id="4363057787588706121">Tillat sammenslåing av listeregler fra ulike kilder</translation>
 <translation id="436581050240847513">Rapportér nettverksgrensesnitt for enheten</translation>
 <translation id="4372704773119750918">Ikke tilllat bedriftsbrukeren å være en del av flerprofilen (primær eller sekundær)</translation>
 <translation id="4377599627073874279">La alle nettsteder vise alle bilder</translation>
@@ -1940,6 +2022,7 @@
 <translation id="4826326557828204741">Handling som skal utføres når inaktivitetsforsinkelsen blir overgått mens maskinen kjører på batteriet</translation>
 <translation id="4832852360828533362">Bruker- og enhetsrapportering</translation>
 <translation id="4834526953114077364">Det fjernes brukere til nok plass er frigjort, i rekkefølgen «lengst tid siden forrige gang brukt og ikke pålogget de siste tre månedene»</translation>
+<translation id="4835622243021053389">Slå på NTLMv2-autentisering.</translation>
 <translation id="4858735034935305895">Tillat fullskjermmodus</translation>
 <translation id="4861767323695239729">Konfigurer tillatte inndatametoder i brukerøkter</translation>
 <translation id="487460824085252184">Overfør automatisk. Ikke be om brukersamtykke.</translation>
@@ -2055,6 +2138,11 @@
 
 I motsetning til <ph name="URL_LIST_POLICY_NAME" /> gjelder denne regelen begge veier. Det betyr at når Internet Explorer-tilleggsprogrammet er installert og aktivert, kontrollerer det også om <ph name="IE_PRODUCT_NAME" /> skal åpne disse nettadressene i <ph name="PRODUCT_NAME" />.</translation>
 <translation id="5124368997194894978">Slå på oppstart ved tilkobling til strømnettet</translation>
+<translation id="5131211790949066746">Slår på sammenslåing av regler for hvilke utvidelser som kan installeres, fra <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> og <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />.
+
+      Hvis du slår på denne innstillingen, blir verdiene fra reglene for maskinplattformen, maskinskyen og brukerplattformen slått sammen til én liste. Denne brukes samlet i stedet for å bruke verdiene fra den enkeltkilden som har høyest prioritet.
+
+      Hvis du slår av denne innstillingen eller ikke angir den, brukes kun listeoppføringer fra kilden med høyest prioritet. Alle andre kilder vises som konflikter, men ignoreres.</translation>
 <translation id="5141670636904227950">Angi standard skjermforstørrelsestype som er aktivert på påloggingssiden</translation>
 <translation id="5142301680741828703">Alltid gjengi følgende nettadressemønstre i <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Lar deg spesifisere ytterligere parametere som brukes når <ph name="PRODUCT_FRAME_NAME" /> kjører <ph name="PRODUCT_NAME" />.
@@ -2173,6 +2261,7 @@
 
       Hvis regelen ikke er konfigurert, eller hvis den er angitt som en tom streng eller et ugyldig portområde, kan WebRTC bruke alle tilgjengelige lokale UDP-porter.</translation>
 <translation id="5290940294294002042">Angi en liste over programtillegg som brukeren kan aktivere eller deaktivere</translation>
+<translation id="5306186200045823863">Klarér Symantec Corporations eldre PKI-infrastruktur</translation>
 <translation id="5307432759655324440">Tilgjengelighet for inkognitomodus</translation>
 <translation id="5318185076587284965">Aktiver bruken av relétjenere ved fjerntilgangsverten</translation>
 <translation id="5323128137188992869">Tillat at innhold castes til enheten med <ph name="PRODUCT_NAME" />.
@@ -2272,6 +2361,7 @@
       Hvis det er konflikt mellom regler, bruker <ph name="PRODUCT_NAME" /> den mest spesifikke regelen.</translation>
 <translation id="5475361623548884387">Aktiver utskrift</translation>
 <translation id="547601067149622666">Ikke tillat annonser på nettsteder med forstyrrende annonser</translation>
+<translation id="5483065054530244863">Tillat SHA-1-signerte sertifikater som er utstedt av lokale klareringsankre</translation>
 <translation id="5483777239978559943">Denne regelen er avviklet. Bruk <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> for å kontrollere tilgjengeligheten av Flash-programtillegget og <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> for å kontrollere om det integrerte PDF-visningsprogrammet skal brukes til å åpne PDF-filer.
 
       Angir en liste over programtillegg brukerne kan slå av eller på i <ph name="PRODUCT_NAME" />.
@@ -2388,6 +2478,17 @@
           Hvis du slår på eller ikke angir denne regelen, kan brukerne se passordene i klartekst i passordbehandlingen.</translation>
 <translation id="5620392548325769024">Slå på visning av velkomstsiden den første gangen nettleseren åpnes etter OS-oppgraderinger.</translation>
 <translation id="5630352020869108293">Gjenopprett den siste økten</translation>
+<translation id="5643906875497889108">Styrer hvilke app- og utvidelsestyper som kan installeres, og begrenser tilgang under kjøring.
+
+          Denne innstillingen godkjenner de tillatte app- og utvidelsestypene som kan installeres i <ph name="PRODUCT_NAME" />, og hvilke verter de kan samhandle med. Verdien er en liste med strenger. Hver av dem må være en av disse: «extension», «theme», «user_script», «hosted_app», «legacy_packaged_app» eller «platform_app». Se dokumentasjon for <ph name="PRODUCT_NAME" />-utvidelser for mer informasjon om disse typene.
+
+          Merk at denne regelen også påvirker utvidelser og apper som skal administratorinstalleres via ExtensionInstallForcelist.
+
+          Hvis denne innstillingen er konfigurert, installeres ikke utvidelser og apper med typer som ikke står på listen.
+
+          Hvis denne innstillingen ikke er konfigurert, legges det ingen begrensninger på godkjente app- og utvidelsestyper.
+
+          Bruk av flere utvidelses-ID-er atskilt med komma støttes ikke før versjon 75 og blir hoppet over. Resten av regelen fortsetter å gjelde.</translation>
 <translation id="5645779841392247734">Tillat informasjonskapsler på disse nettstedene</translation>
 <translation id="5689430183304951538">Standard sidestørrelse for utskrift</translation>
 <translation id="5693469654327063861">Tillat dataoverføring</translation>
@@ -2427,6 +2528,7 @@
 <translation id="5765780083710877561">Beskrivelse:</translation>
 <translation id="5770738360657678870">Utviklerkanal (kan være ustabil)</translation>
 <translation id="5774856474228476867">Nettadresse for søk for standard søkeleverandør</translation>
+<translation id="5775235485119094648">Lad batteriet mens batterinivået ligger innenfor et bestemt område.</translation>
 <translation id="5776485039795852974">Spør hver gang et nettsted ønsker å vise skrivebordsvarslinger</translation>
 <translation id="5781412041848781654">Spesifiserer hvilket GSSAPI-bibliotek som skal brukes for HTTP-autentisering. Du kan angi enten bare biblioteknavnet eller den fullstendige banen.
 
@@ -2494,6 +2596,7 @@
 <translation id="5893553533827140852">Hvis denne innstillingen er aktivert sendes gnubby-godkjenningsforespørsler via en proxy-tjener på en ekstern tjenertilkobling.
 
           Hvis denne innstillingen ikke er aktivert sendes ikke gnubby-godkjenningsforespørsler via en proxy-tjener.</translation>
+<translation id="5897913798715600338">Lad batteriet ved bruk av teknologi for hurtiglading.</translation>
 <translation id="5898486742390981550">Når flere brukere er logget på, er det bare hovedbrukeren som kan bruke Android-apper.</translation>
 <translation id="5900196529149231477">
       Denne regelen gjelder for påloggingsskjermen. Se også regelen <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, som gjelder for brukerøkten. Vi anbefaler å bruke den samme verdien for begge reglene. Hvis verdiene ikke er like, kan det oppstå en forsinkelse når du starter en brukerøkt og verdien fra brukerregelen er aktiv.
@@ -2502,12 +2605,14 @@
       Hvis regelen ikke er konfigurert, blir standardinnstillingene for nettstedsisolering for plattformen brukt for påloggingsskjermen.
       </translation>
 <translation id="5901427587865226597">Bare tosidig utskrift</translation>
+<translation id="5905473632148429217">Slå på OCSP/CRL-kontroller på nettet</translation>
 <translation id="5906199912611534122">Brukes til å slå reduksjon av nettverkshastighet av og på.
       Dette gjelder alle brukere og alle grensesnitt på enheten. Når regelen er angitt,
       varer reduksjonen helt til den slås av.
 
       Hvis den er angitt som «false» (usann), reduseres ikke hastigheten.
       Hvis den er angitt som «true» (sann), reduseres systemet til de angitte opplastings- og nedlastingshastighetene (i kbit/s).</translation>
+<translation id="591088232153082363">Tilpasset batterilading basert på batteribruksmønsteret.</translation>
 <translation id="5921713479449475707">Tillat automatisk oppdatering av nedlastinger via HTTP</translation>
 <translation id="5921888683953999946">Angi standardtilstand for den store musepekerens tilgjengelighet på påloggingssiden.
 
@@ -2529,6 +2634,7 @@
 <translation id="5950205771952201658">Som et resultat av at nettbaserte opphevelsekontroller for «soft-fail» ikke gir noen effektiv sikkerhetsfordel, er de avslått som standard i <ph name="PRODUCT_NAME" /> versjon 19 og nyere. Hvis denne regelen settes til true (sann), gjenopprettes tidligere atferd. I tillegg blir OCSP/CRL-kontroller på nettet utført.
 
       Hvis regelen ikke spesifiseres eller settes til false (usann), utfører ikke <ph name="PRODUCT_NAME" /> nettbaserte opphevelsekontroller i <ph name="PRODUCT_NAME" /> 19 og nyere.</translation>
+<translation id="5961137303188584693">Enhetens innebygde NIC-MAC-adresse</translation>
 <translation id="5966615072639944554">Utvidelser kan bruke API-et for ekstern attestasjon</translation>
 <translation id="5983708779415553259">Standard atferd for nettsteder som ikke inngår i noen innholdspakker.</translation>
 <translation id="5997543603646547632">Bruk 24-timersklokken som standard</translation>
@@ -2619,6 +2725,17 @@
 <translation id="6111936128861357925">Tillat dinosaurspill-påskeegget</translation>
 <translation id="6114416803310251055">avskrevet</translation>
 <translation id="6133088669883929098">Tillat alle nettsteder å bruke nøkkelgenerering</translation>
+<translation id="6136537398661737682">Denne regelen styrer innledende tilstand for Google Posisjonstjenester.
+
+      Når denne regelen er satt til <ph name="GLS_DISABLED" /> eller ikke er konfigurert, er Google Posisjonstjenester i utgangspunktet avslått.
+
+      Når denne regelen er satt til <ph name="GLS_ENABLED" />, er Google Posisjonstjenester i utgangspunktet påslått.
+
+      Når denne regelen er satt til <ph name="GLS_UNDER_USER_CONTROL" />, kan brukeren velge om Google Posisjonstjenester skal brukes. Dette gjør det mulig for Android-apper å bruke tjenestene til å etterspørre enhetens posisjon og slår dessuten på innsending av anonyme posisjonsdata til Google.
+
+      Merk at denne regelen kun styrer tilstanden for Google Posisjonstjenester i det innledende oppsettet. Brukeren kan åpne Android-innstillingene senere og slå Google Posisjonstjenester på eller av.
+
+      Merk at denne regelen ignoreres og Google Posisjonstjenester alltid er avslått når <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" />-regelen er satt til <ph name="BLOCK_GEOLOCATION_SETTING" />.</translation>
 <translation id="6141402445226505817">Bruk alltid omtrentlig detektering av tidssoner</translation>
 <translation id="6145799962557135888">Gjør at du kan angi en liste over nettadressemønstre som angir hvilke nettsteder som får kjøre JavaScript.
 
@@ -2694,9 +2811,17 @@
       Hvis regelen er slått av, importeres ikke autofylldataene for skjemaer.
 
       Hvis den ikke spesifiseres, kan brukeren bli spurt om vedkommende vil importere, eller dataene kan bli importert automatisk.</translation>
+<translation id="6221175752766085998">Tillat sertifikater som er utstedt av lokale klareringsankre uten subjectAlternativeName-utvidelsen</translation>
 <translation id="6224304369267200483">Nettadresser/domener tillater automatisk direkte Sikkerhetsnøkkel-attestering</translation>
 <translation id="6233173491898450179">Angi nedlastingskatalog</translation>
 <translation id="6244210204546589761">Nettadresser som skal åpnes ved oppstart</translation>
+<translation id="6255387031094435995">Gjør det mulig å slå sammen de valgte reglene når de kommer fra ulike kilder med samme omfang og nivå.
+
+        Hvis regler står på listen og det oppstår konflikt mellom to kilder med samme omfang og nivå, blir verdiene slått sammen til en ny regelliste.
+
+        Hvis regler står på listen og det oppstår konflikt mellom to kilder som dessuten har ulikt omfang eller nivå, brukes reglene med høyest prioritet.
+
+        Hvis regler ikke står på listen og det oppstår konflikt mellom kilder, omfang eller nivåer, brukes reglene med høyest prioritet.</translation>
 <translation id="6258193603492867656">Angir om den genererte Kerberos-SPN-en skal inneholde en ikke-standard port.
 
           Hvis du aktiverer denne innstillingen, og en ikke-standard port (dvs. en annen port enn 80 eller 443) oppgis, omfattes den av den genererte Kerberos-SPN-en.
@@ -2899,6 +3024,7 @@
 <translation id="6757438632136860443">Lar deg angi en liste med nettadressemønstre for å spesifisere nettsteder hvor <ph name="FLASH_PLUGIN_NAME" />-programtillegget skal kunne kjøres automatisk.
 
           Hvis denne regelen ikke angis, brukes den globale standardverdien for alle nettsteder. Denne verdien hentes fra «DefaultPluginsSetting»-regelen hvis den er angitt, eller fra brukerens personlige konfigurasjon hvis den ikke er angitt.</translation>
+<translation id="6757613329154374267">Sikkerhetskopiering og gjenoppretting er påslått</translation>
 <translation id="6762235610019366960">Lar deg kontrollere fremvisningen av reklame- og/eller utdanningsinnhold i hele fanen i <ph name="PRODUCT_NAME" />.
 
       Hvis den ikke er konfigurert eller aktivert (satt til true/sant), kan <ph name="PRODUCT_NAME" /> vise innhold i hele fanen til brukere for å levere produktinformasjon.
@@ -2921,6 +3047,7 @@
       Strengen kan inneholde variablene ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR} og ${MACHINE_NAME}. Disse blir erstattet med verdier på enheten før strengen blir tatt i bruk som vertsnavn. Den resulterende strengen må være et gyldig vertsnavn (per RFC 1035, del 3.1).
 
       Hvis denne regelen ikke er angitt, eller hvis den endelige verdien ikke er et gyldig vertsnavn, blir ikke noe vertsnavn angitt i DHCP-forespørsler. </translation>
+<translation id="6833988859168635883">Oppstart, startside og side for ny fane</translation>
 <translation id="6835883744948188639">Vis brukeren en gjentakende melding om at omstart anbefales</translation>
 <translation id="6837480141980366278">Kontrollerer om den innebygde DNS-klienten brukes i <ph name="PRODUCT_NAME" />.
 
@@ -3027,6 +3154,17 @@
 
       Like før skjermen nedtones, evaluerer den smarte modellen for nedtoning om nedtoning av skjermen bør utsettes. Hvis den smarte modellen for nedtoning utsetter nedtoning av skjermen, forlenges tiden det tar før skjermen nedtones. I dette tilfellet blir utsettelsen av avslått skjerm, låseskjerm og inaktivitet justert til å samsvare med tidsrommet fra nedtoningsutsettelsen slik det ble konfigurert opprinnelig.
       Hvis denne regelen er angitt som «True» (sann), eller hvis den ikke er angitt, slås den smarte modellen for nedtoning på, og den kan forlenge tiden det tar før skjermen nedtones. Hvis denne regelen er angitt som «False» (usann), påvirkes ikke nedtoning av skjermen av den smarte modellen for nedtoning.</translation>
+<translation id="6967394885063085697">Slå på regelen for strømstyring i avansert modus for batterilading.
+
+          Med avansert modus for batterilading kan brukeren maksimere batterilevetiden. I avansert lademodus bruker systemet standardalgoritmen for lading og andre teknikker utenfor arbeidstiden for å maksimere batterilevetiden. I arbeidstiden brukes ekspresslading. Ekspresslading gjør det mulig å lade batteriet raskere – derfor blir batteriet raskere fulladet. For hver dag spesifiseres tidsrommet når systemet brukes mest, ved å angi starttid og varighet.
+
+          Hvis denne regelen er satt til «true» (sann) og DeviceAdvancedBatteryChargeModeDayConfig er angitt, er avansert modus for batterilading alltid påslått hvis enheten støtter det.
+
+          Hvis regelen er satt til «false» (usann), er avansert modus for batterilading alltid avslått.
+
+          Hvis du angir denne regelen, kan ikke brukerne endre eller overstyre den.
+
+          Hvis regelen ikke er angitt, er avansert modus for batterilading avslått og kan ikke slås på av brukeren.</translation>
 <translation id="6972540544240464302">Velg konfigurasjon for oppgaveplanlegging</translation>
 <translation id="6979158407327259162">Google Disk</translation>
 <translation id="6994082778848658360">Spesifiserer hvordan det integrerte sikre maskinvareelementet kan brukes til å tilby tofaktor-autentisering hvis det er kompatibelt med denne funksjonen. Av/på-knappen på maskinen brukes til å finne ut om brukeren er fysisk til stede.
@@ -3100,6 +3238,17 @@
       Hvis du slår på eller av denne innstillingen, kan ikke brukere endre eller overstyre den.
 
       Hvis regelen ikke er angitt, kan brukeren velge om det skal brukes passord for å låse opp enheten eller ikke.</translation>
+<translation id="7107148737865880402">Slå på regelen for strømstyring ved USB-strømdeling.
+
+          Visse enheter har spesifikke USB-porter markert med lyn- eller batteriikon. Disse kan brukes til å lade enheter som mobiltelefoner ved bruk av systembatteriet. Denne regelen påvirker ladeatferden til denne porten mens enheten er avslått eller i hvilemodus. Denne regelen påvirker ikke de andre USB-portene eller ladeatferden mens enheten er aktiv.
+
+          Når enheten er aktiv, leverer USB-porten alltid strøm.
+
+          Når enheten er i hvilemodus og denne regelen er satt til «true» (sann), leverer USB-porten strøm når enheten er koblet til stikkontakt eller batterinivået er &gt; 50 %. Ellers leverer ikke USB-porten strøm.
+
+          Når enheten er avslått og denne regelen er satt til «true», leverer USB-porten strøm når enheten er koblet til stikkontakt. Ellers leverer ikke USB-porten strøm.
+
+          Hvis denne regelen ikke er angitt, fungerer den som om den er slått på, og brukeren kan ikke slå den av.</translation>
 <translation id="7115494316187648452">Avgjør om <ph name="PRODUCT_NAME" />-prosesser skal starte ved OS-pålogging og fortsette å kjøre når det siste nettleservinduet lukkes, noe som gjør at bakgrunnsapper og den gjeldende nettleserøkten, samt eventuelle informasjonskapsler for økten, fortsatt er aktive. Det vises et ikon i systemfeltet for bakgrunnsprosesser som er i gang, og de kan alltids lukkes derfra.
 
       Hvis denne regelen settes til sann, slås bakgrunnsmodusen på. Den kan ikke kontrolleres av brukerne i nettleserinnstillingene.
@@ -3150,6 +3299,7 @@
           Hvis denne regelen er angitt som «true» (sant) eller ikke angis, fungerer skjermoppvekkingslåser under strømstyring, med mindre AllowWakeLocks er angitt som «false» (usant).
 
           Hvis denne regelen er angitt som «false» (usant), blir forespørsler om skjermoppvekkingslåser nedgradert til systemoppvekkingsforespørsler.</translation>
+<translation id="7177857088692019405">Hurtigopplåsing</translation>
 <translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="718956142899066210">Tilkoblingstyper som tillates for oppdateringer</translation>
 <translation id="7194407337890404814">Navn for standard søkeleverandør</translation>
@@ -3213,6 +3363,7 @@
 <translation id="7273823081800296768">Hvis denne innstillingen er aktivert eller ikke konfigurert, kan brukere velge å knytte sammen klienter og verter ved tilkobling, og dermed sørge for at PIN-koden ikke må angis hver gang.
 
           Hvis denne innstillingen er deaktivert, er ikke funksjonen tilgjengelig.</translation>
+<translation id="7274077256421167535">Slå på USB-strømdeling</translation>
 <translation id="7275334191706090484">Administrerte bokmerker</translation>
 <translation id="7291084543582732020">Hvis du slår på denne innstillingen, kan brukerne bruke Smart Lock, såfremt kravene for funksjonen oppfylles.
 
@@ -3352,6 +3503,15 @@
       Hvis verdien for innstillingen er 0, brukes standard bufferstørrelse, og brukeren kan ikke endre den.
 
       Hvis innstillingen ikke er angitt, brukes standard bufferstørrelse, og brukeren kan overstyre den med «--disk-cache-size»-flagget.</translation>
+<translation id="759389052790680884">Angi egendefinert stoppverdi for batterilading i prosent.
+
+          Batteriladingen stanses når den egendefinerte stoppverdien for batterilading er nådd.
+
+          DeviceBatteryChargeCustomStartCharging må være mindre enn DeviceBatteryChargeCustomStopCharging.
+
+          Denne regelen brukes bare hvis DeviceBatteryChargeMode er satt til egendefinert.
+
+          Hvis denne regelen ikke er konfigurert eller angitt, brukes standard modus for batterilading.</translation>
 <translation id="759957074386651883">Innstillinger for Safe Browsing</translation>
 <translation id="7604169113182304895">Android-apper kan følge denne listen frivillig. Du kan ikke tvinge dem til å respektere den.</translation>
 <translation id="7612157962821894603">Flagg for hele systemet som skal brukes ved oppstart av <ph name="PRODUCT_NAME" /></translation>
@@ -3430,6 +3590,15 @@
 <translation id="7712109699186360774">Spør hver gang et nettsted ønsker å bruke kameraet og/eller mikrofonen min</translation>
 <translation id="7713608076604149344">Begrensninger for nedlastinger</translation>
 <translation id="7715711044277116530">Prosentandelen det skaleres etter for forsinkelse av skjermdemping i presentasjonsmodus</translation>
+<translation id="7716781462866245042">Angi dagskonfigurasjon av avansert modus for batterilading.
+
+          Denne regelen brukes bare hvis DeviceAdvancedBatteryChargeModeEnabled er satt til «true» (sann).
+
+          Hvis regelen ikke er konfigurert eller angitt, er avansert modus for batterilading alltid avslått.
+
+          Merk: <ph name="CHARGE_START_TIME_FIELD_NAME" /> må være mindre enn <ph name="CHARGE_END_TIME_FIELD_NAME" />.
+
+          Merk: Tillatte verdier for <ph name="MINUTE_FIELD_NAME" />-feltet i <ph name="CHARGE_START_TIME_FIELD_NAME" /> og <ph name="CHARGE_END_TIME_FIELD_NAME" /> er 0, 15, 30 og 45.</translation>
 <translation id="7717938661004793600">Konfigurer tilgjengelighetfunksjonene for <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7724994675283793633">Denne regelen slår på HTTP/0.9 for andre porter enn 80 for HTTP og 443 for HTTPS.
 
@@ -3503,6 +3672,7 @@
       Bestemmer ID-en for utvidelsen som skal brukes som skjermsparer på påloggingssiden. Utvidelsen må være del av AppPack-elementet som er konfigurert for dette domenet gjennom DeviceAppPack-retningslinjene.</translation>
 <translation id="7882857838942884046">Hvis du slår av Google-synkronisering, fungerer ikke funksjonen for sikkerhetskopiering og gjenoppretting for Android som den skal.</translation>
 <translation id="7882890448959833986">Ignorer advarselen om at operativsystemet ikke støttes</translation>
+<translation id="7895553628261067384">Ekstern tilgang</translation>
 <translation id="7902255855035461275">Mønstrene i denne listen sammenlignes med sikkerhetskilden til nettadressen forespørselen kommer fra. Hvis det finnes samsvar, blir tilgang til videoopptaksenheter gitt uten forespørsel på forhånd.
 
 MERK: Frem til versjon 45 ble denne regelen bare støttet i kioskmodus.</translation>
@@ -3514,6 +3684,11 @@
 <translation id="7937491150792971922">Slå sammen regler for hvilke utvidelser som kan installeres, fra flere kilder</translation>
 <translation id="7937766917976512374">Tillat eller blokkér videoopptak</translation>
 <translation id="7941975817681987555">Ikke forutsi nettverkshandlinger på noen nettverkstilkoblinger</translation>
+<translation id="7952007677054834789">Konfigurer sidene som skal lastes ved oppstart, samt standard startside og standard side for ny fane i <ph name="PRODUCT_NAME" />. Brukere blir forhindret fra å endre dem.
+
+      Brukerens innstillinger for startside blir kun fullstendig låst enten hvis du velger startsiden som siden for ny fane, eller hvis du velger at den skal være en nettadresse, og spesifiserer en nettadresse for startsiden. Hvis du ikke spesifiserer nettadressen for startsiden, kan brukeren fremdeles angi siden for ny fane som startside ved å angi «chrome://newtab».
+
+      Regelen «Nettadresser som skal åpnes ved oppstart» ignoreres, med mindre du velger «Åpne en liste over nettadresser» i «Handling ved oppstart».</translation>
 <translation id="7952958573604504839">I M48 er denne regelen avviklet til fordel for <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />, og i M54 er den fjernet.
 
       Slår på nettverksforslag i <ph name="PRODUCT_NAME" /> og hindrer brukerne i å endre denne innstillingen.
@@ -3652,6 +3827,7 @@
 <translation id="8176035528522326671">Tillat at bedriftsbrukeren bare er primær flerprofilbruker (standardatferd for bedriftsadministrerte brukere)</translation>
 <translation id="8214600119442850823">Konfigurerer passordlagring.</translation>
 <translation id="8217516105848565518">Denne regelen er avviklet. Bruk RemoteAccessHostDomainList i stedet.</translation>
+<translation id="8244171102276095471">Slå på RC4-chifferserier i TLS</translation>
 <translation id="8244525275280476362">Maksimal innlastingsforsinkelse etter ugyldiggjøring av en innstilling</translation>
 <translation id="8256688113167012935">Kontrollerer hvilket kontonavn <ph name="PRODUCT_OS_NAME" /> viser på påloggingsskjermen for enhetens tilhørende lokale konto.
 
@@ -3692,6 +3868,7 @@
 <translation id="8312129124898414409">Gjør det mulig å angi om nettsteder har tillatelse til å bruke nøkkelgenerering. Bruk av nøkkelgenerering kan enten være tillatt for alle nettsteder eller blokkert for alle nettsteder.
 
           Hvis denne regelen ikke angis, brukes «BlockKeygen», og brukeren kan endre den.</translation>
+<translation id="8320149248919453401">Modus for batterilading</translation>
 <translation id="8329984337216493753">Denne retningslinjen er aktiv bare i detaljistmodus.
 
       Når DeviceIdleLogoutTimeout er spesifisert, definerer denne retningslinjen varigheten av advarselfeltet med en nedtellingsklokke som vises til brukeren før den blir logget av.
@@ -3856,6 +4033,7 @@
       Hvis denne regelen ikke er angitt, brukes standardperioden på 345 600 000 millisekunder (fire dager) for <ph name="PRODUCT_OS_NAME" />-enheter og 604 800 000 millisekunder (én uke) for <ph name="PRODUCT_NAME" />.</translation>
 <translation id="8685024486845674965">Advarselen om passordbeskyttelse utløses ved gjenbruk av passord</translation>
 <translation id="8693243869659262736">Bruk innebygd DNS-klient</translation>
+<translation id="8698286761337647563">Antall dager i forveien SAML-brukere skal varsles om at passordene deres snart utløper</translation>
 <translation id="8703488928438047864">Rapportér kortstatus</translation>
 <translation id="8703872185032220081">Angi dagskonfigurasjon for strømtoppskift.
 
@@ -3904,6 +4082,7 @@
       Hvis denne innstillingen er slått av eller ikke er angitt, sender tjenesten for passordbeskyttelse brukerne til https://myaccounts.google.com for å endre passordet.
       Denne regelen er bare tilgjengelig på Windows-forekomster som er tilknyttet <ph name="MS_AD_NAME" />-domener, eller Windows 10 Pro- eller Enterprise-forekomster som er registrert for enhetsadministrering.</translation>
 <translation id="8798099450830957504">Standard</translation>
+<translation id="8800453707696044281">Angi egendefinert stoppverdi for batterilading i prosent</translation>
 <translation id="8801680448782904838">Varsle en bruker om at nettleseren eller enheten bør eller må startes på nytt</translation>
 <translation id="8818173863808665831">Rapportering av enhetens geografiske posisjon.
 
@@ -4016,6 +4195,11 @@
       Denne regelen påvirker bare brukere som autentiserer seg via SAML.
 
       Regelverdien skal angis i sekunder.</translation>
+<translation id="9018338365267278833">Dette fjerner utvidelser som vises i <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, eller som vises i <ph name="EXTENSION_SETTINGS_POLICY_NAME" /> og har installasjonsmodus satt til blokkert, og sletter lokale brukerdata sammen med dem permanent.  Se personvernreglene eller dataoppbevaringsreglene for utvidelsene for å forstå hva som kan skje med brukerdata som ikke lagres lokalt.
+
+      Når regelen er satt til «enabled» (slått på), fjernes utvidelser på de ovennevnte listene (hvis de allerede er installert på maskinen) fullstendig fra maskinen (inkludert lokale brukerdata).
+
+      Når regelen er satt til «disabled» (slått av) eller ikke er angitt, blir utvidelser på de ovennevnte listene (hvis de allerede er installert på maskinen og står på svartelisten <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />) slått av på maskinen, men ikke avinstallert.</translation>
 <translation id="9027787254195333560">Med denne regelen kan du konfigurere hvilket brukerbilde som representerer brukeren på påloggingsskjermen. Du angir denne regelen ved å spesifisere nettadressen <ph name="PRODUCT_OS_NAME" /> kan laste ned brukerbildet fra, og en kryptografisk hash som brukes til å bekrefte at ingen har tuklet med nedlastingen. Bildet må være i JPEG-format og ikke større enn 512 kB. Nettadressen må være tilgjengelig uten krav om autentisering.
 
       Brukerbildet blir lastet ned og bufret. Det lastes ned på nytt hver gang nettadressen eller hashen endres.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 2ae2e91..a2e3976 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -54,6 +54,13 @@
 <translation id="1049138910114524876">Устанавливает региональные настройки для экрана входа <ph name="PRODUCT_OS_NAME" />.
 
       Если правило настроено, для экрана входа будет задан язык, указанный первым (правило определяется списком для прямой совместимости). Если правило не настроено или указан пустой список, будут использоваться региональные настройки последнего сеанса пользователя. Если задано некорректное значение, будет использоваться резервное значение (en-US).</translation>
+<translation id="1052499923181221200">Это правило действует, только если в правиле SamlInSessionPasswordChangeEnabled установлено значение True.
+      Если это правило включено и в нем установлено, к примеру, значение 14, — это означает, что пользователи SAML будут предупреждены за 14 дней до того, как срок действия их пароля истечет.
+      Получив уведомление, пользователи сразу смогут изменить пароль во время сеанса.
+      Однако эти уведомления будут показаны, только если при входе в SAML поставщик идентификационной информации отправил на устройство сведения об истечении срока действия пароля.
+      Если установить нулевое значение, пользователи не будут предупреждены заранее — они получат уведомление, только когда пароль уже перестанет действовать.
+
+      Если для этого правила установлено значение, пользователь не может его изменить или переопределить.</translation>
 <translation id="1062011392452772310">Включает удаленную проверку устройства</translation>
 <translation id="1062407476771304334">Заменить</translation>
 <translation id="1079801999187584280">Запретить использование Инструментов разработчика</translation>
@@ -212,6 +219,7 @@
       Если правило включено, Google Ассистент сможет просматривать данные на экране устройства.
       Если правило отключено, Google Ассистент не сможет просматривать данные на экране.
       Если правило не настроено, пользователи самостоятельно выбирают, разрешать ли Google Ассистенту просматривать данные на экране или нет.</translation>
+<translation id="1376119291123231789">Включить расширенный режим зарядки батареи</translation>
 <translation id="1383493480903114193">Это правило принудительно запускает сетевой код в процессе браузера.
 
       По умолчанию правило отключено. Если оно включено, безопасность пользователей оказывается под угрозой, как только сетевой процесс запускается в изолированной среде.
@@ -306,6 +314,18 @@
 <translation id="1477934438414550161">TLS 1.2</translation>
 <translation id="1502843533062797703">Запретить ПО независимых производителей передавать код</translation>
 <translation id="1504431521196476721">Удаленная проверка</translation>
+<translation id="1507382822467487898">
+          Определяет, какой MAC-адрес (адрес управления доступом к среде) будет использоваться при подключении устройства к док-станции.
+
+          Когда к некоторым моделям устройств подключается док-станция, для идентификации устройства в сети Ethernet по умолчанию используется MAC-адрес этой док-станции. Используя это правило, администратор может изменить источник MAC-адреса при подключении к док-станции.
+
+          Если выбрано значение DeviceDockMacAddress или правило не настроено, используется MAC-адрес док-станции, к которой подключено устройство.
+
+          Если выбрано значение DeviceNicMacAddress, используется MAC-адрес сетевой платы устройства.
+
+          Если выбрано значение DockNicMacAddress, используется MAC-адрес сетевой платы док-станции, к которой подключено устройство.
+
+          Пользователь не может изменить эту настройку.</translation>
 <translation id="1507957856411744193">Если для правила задано значение True, <ph name="PRODUCT_NAME" /> будет подключаться к устройствам Google Cast на всех IP-адресах, а не только на закрытых адресах RFC1918/RFC4193.
 
           Если для правила задано значение False, <ph name="PRODUCT_NAME" /> будет подключаться только к устройствам Google Cast на закрытых адресах RFC1918/RFC4193.
@@ -728,6 +748,17 @@
 <translation id="2303795211377219696">Включить автозаполнение данных кредитных карт</translation>
 <translation id="2309390639296060546">Настройка географического положения по умолчанию</translation>
 <translation id="2327252517317514801">Определение доменов с правом доступа к G Suite</translation>
+<translation id="2356878440219553005">Определяет, какое правило используется для управления режимом зарядки батареи.
+
+          С помощью этого правила можно контролировать процесс зарядки батареи, чтобы свести к минимуму ее износ и увеличить время работы без подзарядки.
+
+          Если выбран пользовательский режим зарядки батареи, необходимо указать значения для правил DeviceBatteryChargeCustomStartCharging и DeviceBatteryChargeCustomStopCharging.
+
+          Если это правило настроено, будет применяться выбранный режим зарядки батареи при условии, что он поддерживается на устройстве.
+
+          Если правило не настроено и устройство поддерживает эту возможность, будет применяться стандартный режим зарядки батареи, и пользователи не смогут его изменить.
+
+          Примечание. Если настроено правило <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" />, его значение будет иметь приоритет над этим правилом.</translation>
 <translation id="237494535617297575">Задает список шаблонов URL для сайтов, которым разрешено отображать уведомления. Если это правило не настроено, для всех сайтов используется глобальное значение по умолчанию на основе правила DefaultNotificationsSetting (если оно настроено, в противном случае – на основе пользовательской конфигурации).</translation>
 <translation id="2386362615870139244">Использование блокировки сна</translation>
 <translation id="2411817661175306360">Предупреждения от защиты паролем отключены</translation>
@@ -763,6 +794,7 @@
 
       Если задано значение "false", автоматический вход без задержки (если он настроен) нельзя отменить.</translation>
 <translation id="2454228136871844693">Оптимизировать для стабильной работы</translation>
+<translation id="2463034609187171371">Включить наборы шифров DHE в TLS</translation>
 <translation id="2463365186486772703">Региональные настройки приложения</translation>
 <translation id="2466131534462628618">Игнорировать прокси при аутентификации через страницу входа</translation>
 <translation id="2482676533225429905">Обмен сообщениями с оригинальными приложениями</translation>
@@ -932,6 +964,7 @@
 <translation id="2769952903507981510">Настройка имени домена для хостов удаленного доступа</translation>
 <translation id="2787173078141616821">Отправка отчетов с информацией о состоянии Android</translation>
 <translation id="2799297758492717491">Разрешить автоматически воспроизводить видео на страницах из белого списка шаблонов URL</translation>
+<translation id="2801155097555584385">Установить значение в процентах, при котором батарея начнет заряжаться</translation>
 <translation id="2801230735743888564">Разрешить пользователям играть с динозавром офлайн.
 
       Если для правила указано значение False, при отсутствии интернет-соединения игра с динозавром будет недоступна. Если указано значение True, пользователи смогут в нее играть. Если правило не настроено, игра будет недоступна на зарегистрированных устройствах Chrome OS, однако при других обстоятельствах пользователи смогут играть в нее.</translation>
@@ -1005,6 +1038,7 @@
       Если это правило отключено или не настроено, все задания печати, открытые в режиме предварительного просмотра, будут по умолчанию отправляться на последний выбранный принтер.
 
       Если правило настроено, задания печати, открытые в режиме предварительного просмотра, будут отправляться на системный принтер по умолчанию.</translation>
+<translation id="285627849510728211">Установить ежедневное время включения и выключения расширенного режима зарядки батареи</translation>
 <translation id="2856674246949497058">Откатить до целевой версии и оставаться на ней, если установлена более поздняя версия ОС. В процессе запустить функцию Powerwash.</translation>
 <translation id="2872961005593481000">Завершить работу</translation>
 <translation id="2873651257716068683">Переопределяет размер страницы для печати по умолчанию. Если размер страницы недоступен, это правило не действует.</translation>
@@ -1137,12 +1171,26 @@
 <translation id="3072045631333522102">Экранная заставка, используемая для экрана входа в коммерческой версии</translation>
 <translation id="3072847235228302527">Установить Условия использования локального аккаунта</translation>
 <translation id="3077183141551274418">Правило включает или отключает жизненный цикл вкладки</translation>
+<translation id="3079417254871857650">Позволяет указать, какое действие необходимо выполнить, если при создании домашнего каталога использовался способ шифрования eCryptfs.
+
+      Если установлено значение DisallowArc, все Android-приложения для этого пользователя отключаются, а переход с eCryptfs на ext4 не выполняется. Если домашний каталог уже зашифрован с помощью ext4, запуск Android-приложений будет разрешен.
+
+      Если установлено значение Migrate, переход с eCryptfs на ext4 выполняется при входе автоматически – без согласия пользователя.
+
+      Если установлено значение Wipe, домашние каталоги, зашифрованные с помощью eCryptfs, удаляются при входе, а вместо них создаются новые с ext4-шифрованием. Внимание! В этом случае локальные данные пользователя будут удалены.
+
+      Если установлено значение MinimalMigrate, домашние каталоги, зашифрованные с помощью eCryptfs, удаляются при входе, а вместо них создаются новые с ext4-шифрованием. Однако токены авторизации сохраняются, чтобы пользователю не приходилось снова входить в систему. Внимание! В этом случае локальные данные пользователя будут удалены.
+
+      Если вы выберете значение, которое больше не поддерживается (например, AskUser или AskForEcryptfsArcUsers), вместо него будет использоваться значение Migrate.
+
+      Правило не применяется к пользователям с устройствами в режиме киоска. Если правило не настроено, используется значение DisallowArc.</translation>
 <translation id="3086995894968271156">Настройка ресивера Cast в <ph name="PRODUCT_NAME" />.</translation>
 <translation id="3088796212846734853">Правило позволяет задать список шаблонов URL для сайтов, которым разрешено показывать изображения.
 
           Если это правило не настроено, для всех сайтов используется глобальное значение по умолчанию на основе правила DefaultImagesSetting (если оно настроено, в противном случае – на основе пользовательской конфигурации).
 
          Обратите внимание, что эта функция не поддерживается на Android, несмотря на то что раньше ее можно было включить.</translation>
+<translation id="3091832372132789233">Заряжать батарею устройств, которые изначально подключены к внешнему источнику питания.</translation>
 <translation id="3096595567015595053">Список включенных плагинов</translation>
 <translation id="3101501961102569744">Выбрать способ настройки прокси-сервера</translation>
 <translation id="3101709781009526431">Дата и время</translation>
@@ -1168,6 +1216,7 @@
           Если параметр отключен, <ph name="PRODUCT_NAME" /> будет использовать для обмена сообщениями с оригинальными приложениями только те хосты, которые установлены на уровне системы.
 
           Если правило не настроено, <ph name="PRODUCT_NAME" /> разрешает использование хостов обмена сообщениями с оригинальными приложениями на уровне пользователей.</translation>
+<translation id="3177802893484440532">Настроить обязательное выполнение проверок OCSP/CRL в режиме онлайн для локальных якорей доверия</translation>
 <translation id="3185009703220253572">начиная с версии <ph name="SINCE_VERSION" /></translation>
 <translation id="3187220842205194486">Приложения Android не могут получить доступ к корпоративным ключам. Это правило на них не влияет.</translation>
 <translation id="3205825995289802549">Позволяет разворачивать первое окно браузера при изначальном запуске</translation>
@@ -1177,6 +1226,7 @@
 <translation id="3220624000494482595">Если киоск-приложение является приложением Android, оно не сможет управлять версией <ph name="PRODUCT_OS_NAME" />, даже если для правила задано значение <ph name="TRUE" />.</translation>
 <translation id="3236046242843493070">Шаблоны URL, с которых разрешается установка расширений, приложений и пользовательских скриптов</translation>
 <translation id="3240609035816615922">Настройка доступа к принтерам из файла конфигурации</translation>
+<translation id="3240655340884151271">MAC-адрес встроенной сетевой платы док-станции</translation>
 <translation id="3243309373265599239">Указывает, через какое время бездействия экран затемняется при работе от сети.
 
 Если значение правила больше нуля, оно определяет время бездействия, через которое <ph name="PRODUCT_OS_NAME" /> затемняет экран.
@@ -1198,6 +1248,12 @@
 Если этот параметр включен или не настроен, пользователи могут включить прокси-сервер виртуального принтера, войдя в аккаунт Google.
 
 Если этот параметр отключен, пользователи не могут включить прокси-сервер, и принтеры на этом компьютере нельзя будет использовать как <ph name="CLOUD_PRINT_NAME" />.</translation>
+<translation id="3312206664202507568">Включает страницу chrome://password-change, на которой пользователи SAML могут сменить пароль во время сеанса — это позволяет синхронизировать пароль SAML и пароль для блокировки экрана.
+
+      Когда это правило включено, пользователям SAML также отправляются уведомления о том, что срок действия их пароля скоро истечет, чтобы они могли сразу сменить его во время сеанса.
+      Однако эти уведомления будут показаны, только если при входе в SAML поставщик идентификационной информации отправил на устройство сведения об истечении срока действия пароля.
+
+      Если для этого правила установлено значение, пользователь не может его изменить или переопределить.</translation>
 <translation id="3322771899429619102">Позволяет задать список шаблонов URL для сайтов, которым разрешено создавать ключи. При этом, если указанный шаблон подпадает под действие правила KeygenBlockedForUrls, сайту все равно будет разрешено создавать ключи. Если правило KeygenAllowedForUrls не настроено, для всех сайтов используется значение по умолчанию на основе правила DefaultKeygenSetting (если оно настроено, в противном случае – на основе пользовательской конфигурации).</translation>
 <translation id="332771718998993005">Определяет название ресивера <ph name="PRODUCT_NAME" />.
 
@@ -1281,6 +1337,7 @@
 
           Если выбрано значение FALSE, время для параметров электропитания и длительность сеанса начнут отсчитываться сразу после начала сеанса.</translation>
 <translation id="3478024346823118645">Стирать пользовательские данные при выходе</translation>
+<translation id="3480961938508521469">Полная зарядка батареи на обычной скорости</translation>
 <translation id="348495353354674884">Включить виртуальную клавиатуру</translation>
 <translation id="3487623755010328395">
         Если это правило используется, <ph name="PRODUCT_NAME" /> попытается зарегистрироваться и применить ко всем профилям соответствующую политику облачных сервисов.
@@ -1327,6 +1384,8 @@
 <translation id="3547954654003013442">Настройки прокси-сервера</translation>
 <translation id="355118380775352753">Сайты, которые должны открываться в альтернативном браузере</translation>
 <translation id="3554984410014457319">Разрешить Google Ассистенту распознавать голосовую активацию</translation>
+<translation id="356579196325389849">Разрешить пользователям настраивать версию обновления Chrome OS</translation>
+<translation id="3575011234198230041">HTTP-аутентификация</translation>
 <translation id="3577251398714997599">Настройки для сайтов с навязчивой рекламой</translation>
 <translation id="357917253161699596">Разрешить пользователям управлять сертификатами пользователей</translation>
 <translation id="3583230441447348508">Определяет список предварительно настроенных общих папок сети.
@@ -1357,6 +1416,7 @@
 
         Это правило используется на компьютерах, и в Windows его можно настроить с помощью реестра или групповой политики, в macOS – с помощью PLIST-файла, а в Linux – с помощью файла правил JSON.</translation>
 <translation id="3660562134618097814">Позволяет передавать файлы cookie поставщика услуг аутентификации SAML при входе в аккаунт</translation>
+<translation id="3668151900457104753">Удалить расширения, добавленные в черный список</translation>
 <translation id="3701121231485832347">Регулирует специальные настройки для устройств <ph name="PRODUCT_OS_NAME" /> под управлением <ph name="MS_AD_NAME" />.</translation>
 <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (Поле, состоящее из одной строки, устарело и в будущем будет удалено. Используйте расположенное ниже текстовое поле, которое содержит несколько строк.)</translation>
 <translation id="3709266154059827597">Настройка черного списка расширений</translation>
@@ -1437,6 +1497,16 @@
           Если значение не выбрано, экранная клавиатура по умолчанию будет отключена, но пользователи смогут включить ее в любой момент.</translation>
 <translation id="382476126209906314">Настройка префикса TalkGadget для хостов удаленного доступа</translation>
 <translation id="3824972131618513497">Настройки перезагрузки и управления питанием.</translation>
+<translation id="3826475866868158882">Геолокация Google включена</translation>
+<translation id="3831054243924627613">Это правило позволяет установить первоначальную настройку функции резервного копирования и восстановления системы Android.
+
+      Когда правило не настроено или установлено значение <ph name="BR_DISABLED" />, резервное копирование и восстановление системы Android изначально отключено.
+
+      Когда установлено значение <ph name="BR_ENABLED" />, резервное копирование и восстановление системы Android изначально включено.
+
+      Когда установлено значение <ph name="BR_UNDER_USER_CONTROL" />, пользователь сам выбирает, включать ли функцию резервного копирования и восстановления системы Android. Если пользователь включит ее, данные Android-приложений будут загружены на резервные серверы, откуда они будут при возможности восстанавливаться при переустановке приложений.
+
+      Обратите внимание, что это правило влияет на статус функции резервного копирования и восстановления только при первоначальной настройке устройства. Впоследствии пользователь может открыть настройки Android и включить или отключить функцию резервного копирования и восстановления системы.</translation>
 <translation id="3831376478177535007">Когда настройка включена, <ph name="PRODUCT_NAME" /> принимает сертификаты, выданные устаревшей инфраструктурой открытых ключей Symantec Corporation, если они прошли проверку и связаны с поддерживаемым сертификатом ЦС.
 .
 
@@ -1519,6 +1589,15 @@
 
           Если задано значение "false", загрузка файлов на Google Диск будет разрешена.</translation>
 <translation id="3915395663995367577">URL файла PAC прокси-сервера</translation>
+<translation id="3920892052017026701">Позволяет установить значение в процентах, при котором батарея начнет заряжаться.
+
+          Батарея начнет заряжаться, когда уровень заряда достигнет установленного значения.
+
+          Значение этого правила должно быть меньше значения правила DeviceBatteryChargeCustomStopCharging.
+
+          Это правило можно использовать, только если в правиле DeviceBatteryChargeMode установлен пользовательский режим зарядки.
+
+          Если правило не настроено или значение для него не задано, применяется стандартный режим зарядки батареи.</translation>
 <translation id="3925377537407648234">Настроить разрешение дисплея и коэффициент масштабирования</translation>
 <translation id="3939893074578116847">Сеевые пакеты позволяют серверу управления
       определять, когда устройство отключено от сети.
@@ -1647,6 +1726,7 @@
 <translation id="4150201353443180367">Экран</translation>
 <translation id="4157003184375321727">Информирование о версии OС и встроенного ПО</translation>
 <translation id="4157594634940419685">Разрешить доступ к принтерам CUPS</translation>
+<translation id="4160962198980004898">Источник MAC-адреса устройства при подключении к док-станции</translation>
 <translation id="4163705126749612234">Определяет обязательные доменные имена, отвечающие за клиенты удаленного доступа, и запрещает пользователям их менять.
 
           Если параметр включен, только клиенты из указанного домена могут подключаться к хосту.
@@ -1723,6 +1803,7 @@
       Обратите внимание: если идентификатор приложения присутствует в списке правила, это не гарантирует, что пользователь сможет использовать это приложение для заметок на заблокированном экране. Например, в Chrome 61 список доступных приложений дополнительно ограничен самой платформой.
 
       Если правило не настроено, пользователь сможет включить неограниченное количество приложений на заблокированном экране.</translation>
+<translation id="4313767483634435271">MAC-адрес указанной док-станции устройства</translation>
 <translation id="4322842393287974810">Разрешает киоск-приложению, которое запускается автоматически и без задержек, управлять версией <ph name="PRODUCT_OS_NAME" /></translation>
 <translation id="4325690621216251241">Кнопка выхода в области уведомлений</translation>
 <translation id="4332177773549877617">Вести журнал событий, связанных с установкой приложений на Android</translation>
@@ -1753,6 +1834,7 @@
 <translation id="4360826270668210664">Если правило включено, то для подключения хост удаленного доступа потребует от клиента токен, полученный по указанному URL. Правило используется совместно с RemoteAccessHostTokenValidationUrl.
 
           Сейчас эта функция отключена на сервере.</translation>
+<translation id="4363057787588706121">Разрешить объединять правила, содержащие списки значений, из нескольких источников</translation>
 <translation id="436581050240847513">Сообщать о сетевых интерфейсах устройств</translation>
 <translation id="4372704773119750918">Отключить поддержку многопрофильного режима (основного и дополнительного профиля) для корпоративных пользователей</translation>
 <translation id="4377599627073874279">Разрешить показ изображений на всех сайтах</translation>
@@ -1921,6 +2003,7 @@
 <translation id="4826326557828204741">Действие в случае превышения времени бездействия при работе от аккумулятора.</translation>
 <translation id="4832852360828533362">Отчеты о пользователях и устройствах</translation>
 <translation id="4834526953114077364">Удалять неиспользуемые аккаунты, вход в которые не выполнялся ни разу за последние 3 месяца, пока на диске не освободится достаточно места</translation>
+<translation id="4835622243021053389">Включить аутентификацию NTLMv2</translation>
 <translation id="4858735034935305895">Разрешить полноэкранный режим</translation>
 <translation id="4861767323695239729">Настроить способы ввода для сеанса пользователя</translation>
 <translation id="487460824085252184">Переносить автоматически, без запроса разрешения</translation>
@@ -2039,6 +2122,11 @@
 
       В отличие от <ph name="URL_LIST_POLICY_NAME" /> правила применяются в обоих направлениях. Это значит, что если надстройка Internet Explorer установлена и включена, она также будет контролировать, должны ли URL из <ph name="IE_PRODUCT_NAME" /> открываться в <ph name="PRODUCT_NAME" />.</translation>
 <translation id="5124368997194894978">Настройка загрузки при подаче переменного тока.</translation>
+<translation id="5131211790949066746">Позволяет объединить списки расширений, указанных в правилах <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> и <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />.
+
+      Если это правило включено, значения правил компьютера, облачного сервиса и пользовательской платформы объединяются в один список и используются целиком.
+
+      Если правило отключено или не настроено, используется только список из источника с наивысшим приоритетом. Все остальные источники считаются конфликтующими и игнорируются.</translation>
 <translation id="5141670636904227950">Настройка типа экранной лупы, отображаемой на экране входа по умолчанию</translation>
 <translation id="5142301680741828703">Всегда обрабатывать следующие шаблоны URL в <ph name="PRODUCT_FRAME_NAME" /></translation>
 <translation id="5148753489738115745">Позволяет задать дополнительные параметры, которые используются при запуске <ph name="PRODUCT_NAME" /> из <ph name="PRODUCT_FRAME_NAME" />.
@@ -2149,6 +2237,7 @@
 
      Если правило не задано либо значением является пустая строка или недействительный диапазон портов, WebRTC будет разрешено использование любого доступного порта UDP.</translation>
 <translation id="5290940294294002042">Указать список плагинов, доступных пользователю</translation>
+<translation id="5306186200045823863">Считать надежной устаревшую инфраструктуру открытых ключей Symantec Corporation</translation>
 <translation id="5307432759655324440">Доступность режима инкогнито</translation>
 <translation id="5318185076587284965">Разрешить использование серверов ретрансляции хостами удаленного доступа</translation>
 <translation id="5323128137188992869">Позволяет транслировать контент на устройство с помощью <ph name="PRODUCT_NAME" />.
@@ -2242,6 +2331,7 @@
       В случае противоречия <ph name="PRODUCT_NAME" /> использует наиболее точное правило.</translation>
 <translation id="5475361623548884387">Включить печать</translation>
 <translation id="547601067149622666">Заблокировать навязчивую рекламу на сайтах</translation>
+<translation id="5483065054530244863">Разрешить сертификаты с подписью SHA-1, выпущенные локальными якорями доверия</translation>
 <translation id="5483777239978559943">Правило больше не поддерживается. Используйте вместо него <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> для управления доступностью Flash-плагина и <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" /> для настройки встроенного средства просмотра PDF-файлов.
 
       Правило задает список плагинов, которые пользователи могут самостоятельно включать и отключать в <ph name="PRODUCT_NAME" />.
@@ -2358,6 +2448,17 @@
           Если параметр включен или не настроен, пользователи могут просматривать пароли в незашифрованном виде в диспетчере.</translation>
 <translation id="5620392548325769024">Включить показ стартовой страницы при первом запуске браузера после обновления ОС</translation>
 <translation id="5630352020869108293">Восстановить последний сеанс</translation>
+<translation id="5643906875497889108">Определяет, расширения и приложения какого типа можно устанавливать, а также ограничивает доступ к среде выполнения.
+
+          Это правило описывает разрешенные в <ph name="PRODUCT_NAME" /> типы расширений и приложений, а также хосты, с которыми они могут взаимодействовать. Представляет собой список строк, каждая из которых должна содержать одно из следующих значений: extension, theme, user_script, hosted_app, legacy_packaged_app, platform_app. Подробную информацию о типах читайте в документации по расширениям <ph name="PRODUCT_NAME" />.
+
+          Это правило также влияет на расширения и приложения, которые принудительно устанавливаются в соответствии с правилом ExtensionInstallForcelist.
+
+          Если правило настроено, расширения и приложения, тип которых не указан в списке, устанавливаться не будут.
+
+          Если правило не настроено, будут устанавливаться расширения и приложения всех типов.
+
+          До версии 75 использование нескольких идентификаторов расширений, разделенных запятыми, не поддерживается, поэтому такие значения будут пропускаться. Остальные значения будут по-прежнему применяться.</translation>
 <translation id="5645779841392247734">Разрешить файлы cookie на этих сайтах</translation>
 <translation id="5689430183304951538">Размер страницы для печати по умолчанию</translation>
 <translation id="5693469654327063861">Разрешить перенос данных</translation>
@@ -2397,6 +2498,7 @@
 <translation id="5765780083710877561">Описание:</translation>
 <translation id="5770738360657678870">Канал для разработчиков (может быть нестабильной)</translation>
 <translation id="5774856474228476867">URL поиска для поисковой системы по умолчанию</translation>
+<translation id="5775235485119094648">Заряжать батарею, когда уровень заряда соответствует выбранному диапазону</translation>
 <translation id="5776485039795852974">Спрашивать всегда, если сайт собирается отобразить уведомление</translation>
 <translation id="5781412041848781654">Определяет, какую библиотеку GSSAPI использовать для HTTP-аутентификации. Можно указать только название библиотеки либо полный путь.
 
@@ -2458,6 +2560,7 @@
 <translation id="5893553533827140852">Если этот параметр включен, запросы на авторизацию Gnubby будут передаваться через подключение к удаленному хосту.
 
           Если этот параметр отключен или не задан, запросы на авторизацию Gnubby не будут передаваться через прокси.</translation>
+<translation id="5897913798715600338">Использовать технологию быстрой зарядки</translation>
 <translation id="5898486742390981550">Если в систему вошло несколько пользователей, приложения Android доступны только основному.</translation>
 <translation id="5900196529149231477">
       Это правило применяется к настройкам экрана входа. Ознакомьтесь также с правилом <ph name="ISOLATE_ORIGINS_POLICY_NAME" />, которое задает настройки для сеанса пользователя. Для этих правил рекомендуется выбирать одинаковые значения. Если значения не совпадают, при начале сеанса могут возникать задержки, вызванные применением пользовательских параметров.
@@ -2466,6 +2569,7 @@
       Если правило не настроено, то на экране входа будут применяться настройки изоляции сайтов, установленные по умолчанию.
       </translation>
 <translation id="5901427587865226597">Только двусторонняя печать</translation>
+<translation id="5905473632148429217">Включить проверки OCSP/CRL в режиме онлайн</translation>
 <translation id="5906199912611534122">Разрешает включать и отключать регулировку пропускной способности сети.
       Это правило применяется ко всем пользователям и интерфейсам на устройстве.
       Если правило настроено, регулировка будет включена, пока вы не
@@ -2474,6 +2578,7 @@
       Если вы укажете значение False, регулировка выполняться не будет.
       Если вы укажете значение True, система будет регулировать
       пропускную способность сети, чтобы обеспечить оптимальную скорость скачивания и загрузки (в кбит/с).</translation>
+<translation id="591088232153082363">Адаптивный режим зарядки батареи на основе данных о расходе заряда батареи</translation>
 <translation id="5921713479449475707">Разрешить автоматическое скачивание обновлений по протоколу HTTP</translation>
 <translation id="5921888683953999946">Наличие или отсутствие большого курсора по умолчанию на экране входа.
 
@@ -2495,6 +2600,7 @@
 <translation id="5950205771952201658">Поскольку проверка номеров сертификатов в реальном времени без жесткого отклонения отозванных сертификатов не дает существенного усиления защиты, в <ph name="PRODUCT_NAME" /> 19 и более поздних версиях она по умолчанию отключена. Если задать значение true, будет восстановлен предыдущий режим работы с проведением проверок OCSP/CRL.
 
       Если задано значение false или правило не настроено, в <ph name="PRODUCT_NAME" /> 19 и более поздних версиях <ph name="PRODUCT_NAME" /> не будет проверять номера сертификатов.</translation>
+<translation id="5961137303188584693">MAC-адрес встроенной сетевой платы устройства</translation>
 <translation id="5966615072639944554">Разрешает расширениям использовать API удаленного подтверждения данных</translation>
 <translation id="5983708779415553259">Действие по умолчанию для сайтов, не включенных в пакеты контента</translation>
 <translation id="5997543603646547632">Использовать по умолчанию 24-часовой формат времени</translation>
@@ -2585,6 +2691,17 @@
 <translation id="6111936128861357925">Разрешает игру с динозавром</translation>
 <translation id="6114416803310251055">устарело</translation>
 <translation id="6133088669883929098">Разрешить всем сайтам создавать ключи</translation>
+<translation id="6136537398661737682">Это правило позволяет установить первоначальную настройку геолокации Google.
+
+      Когда правило не настроено или установлено значение <ph name="GLS_DISABLED" />, геолокация Google изначально отключена.
+
+      Когда установлено значение <ph name="GLS_ENABLED" />, геолокация Google изначально включена.
+
+      Когда установлено значение <ph name="GLS_UNDER_USER_CONTROL" />, пользователь сам выбирает, включать ли геолокацию Google. Когда функция включена, Android-приложения могут запрашивать данные о местоположении устройства. При этом также включается отправка анонимных геоданных в Google.
+
+      Обратите внимание, что это правило влияет на статус геолокации Google только при первоначальной настройке устройства. Впоследствии пользователь может открыть настройки Android и включить или отключить геолокацию Google.
+
+      Обратите внимание: когда для правила <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> установлено значение <ph name="BLOCK_GEOLOCATION_SETTING" />, это правило игнорируется и геолокация Google всегда отключена.</translation>
 <translation id="6141402445226505817">Всегда определять часовой пояс приблизительно</translation>
 <translation id="6145799962557135888">Задает список шаблонов URL для сайтов, которым разрешено запускать JavaScript. Если это правило не настроено, для всех сайтов используется глобальное значение по умолчанию на основе правила DefaultJavaScriptSetting (если оно настроено, в противном случае – на основе пользовательской конфигурации).</translation>
 <translation id="614662973812186053">Это правило также контролирует сбор данных об использовании и диагностике Android.</translation>
@@ -2660,9 +2777,17 @@
       Если это правило отключено, сохраненные пароли не импортируются.
 
       Если правило не настроено, импорт может быть выполнен автоматически или пользователю может быть предложено выполнить его вручную.</translation>
+<translation id="6221175752766085998">Разрешить сертификаты без расширения subjectAlternativeName, выданные локальными якорями доверия</translation>
 <translation id="6224304369267200483">URL и домены, которым разрешена автоматическая проверка электронных ключей</translation>
 <translation id="6233173491898450179">Выбор каталога для скачиваний</translation>
 <translation id="6244210204546589761">URL, открывающиеся при запуске</translation>
+<translation id="6255387031094435995">Позволяет объединять выбранные правила из разных источников с одинаковыми областями действия и уровнем.
+
+        Если правило есть в списке, в случае конфликта между двумя источниками (при условии, что они обладают одинаковыми областями действия и уровнем) значения будут объединены в новый список.
+
+        Если правило есть в списке, в случае конфликта между двумя источниками, а также между различными областями действия и/или уровнем будет применяться правило с наивысшим приоритетом.
+
+        Если правила нет в списке, в случае возникновения конфликта между источниками, областями действия и/или уровнем будет применяться правило с наивысшим приоритетом.</translation>
 <translation id="6258193603492867656">Определяет, нужно ли включать нестандартный порт в созданное название SPN Kerberos. Если этот параметр активен и указан нестандартный порт (то есть любой порт, кроме 80 или 443), он будет включен в созданное название SPN Kerberos. Если этот параметр неактивен, в созданном названии SPN Kerberos порт не указывается.</translation>
 <translation id="6261643884958898336">Сообщать данные, идентифицирующие компьютер</translation>
 <translation id="6281043242780654992">Задает правила для обмена сообщениями с оригинальными приложениями. Хосты такого обмена, включенные в черный список, будут загружаться только в том случае, если они добавлены в белый.</translation>
@@ -2860,6 +2985,7 @@
 <translation id="6757438632136860443">Позволяет задать список шаблонов URL для сайтов, которым разрешено запускать плагин <ph name="FLASH_PLUGIN_NAME" />.
 
           Если это правило не настроено, то для всех сайтов используется глобальное значение по умолчанию из правила DefaultPluginsSetting (если оно задано, в противном случае применяется пользовательская конфигурация).</translation>
+<translation id="6757613329154374267">Включить резервное копирование и восстановление</translation>
 <translation id="6762235610019366960">Устанавливает, как в <ph name="PRODUCT_NAME" /> показываются коммерческие и образовательные материалы, полностью занимающие вкладку.
 
       Если правило включено (указано значение True) или не настроено, в <ph name="PRODUCT_NAME" /> разрешено показывать контент, содержащий информацию о товаре и занимающий всю вкладку.
@@ -2882,6 +3008,7 @@
       Значение может содержать переменные ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR} и ${MACHINE_NAME}. Они заменяются параметрами устройства, которые используются в имени хоста (см. RFC 1035, раздел 3.1).
 
       Если правило не настроено или имя хоста недействительно, то имя в DHCP-запросе не передается. </translation>
+<translation id="6833988859168635883">Главная страница и страница быстрого доступа при запуске</translation>
 <translation id="6835883744948188639">Уведомлять пользователя о том, что рекомендуется перезапустить браузер</translation>
 <translation id="6837480141980366278">Определяет, используется ли в <ph name="PRODUCT_NAME" /> встроенный клиент DNS.
 
@@ -2992,6 +3119,17 @@
 
       Умное затемнение оценивает, нужно ли отложить затемнение экрана. Если такая необходимость есть, время до затемнения, блокировки и выключения экрана продлевается.
       Если это правило активно (True) или не задано, интеллектуальная модель затемнения будет включена и будет продлевать время до затемнения экрана. Если правило отключено (False), время до затемнения экрана меняться не будет.</translation>
+<translation id="6967394885063085697">Включает расширенный режим зарядки батареи.
+
+          Расширенный режим зарядки позволяет максимально использовать ресурс батареи. В этом режиме система будет использовать стандартный алгоритм зарядки и другие технологии, чтобы сохранить заряд батареи в нерабочие часы. В рабочие часы используется экспресс-зарядка. Экспресс-зарядка позволяет быстрее зарядить батарею. Для каждого дня недели устанавливается начало и продолжительность времени, в течение которого система будет использоваться больше всего.
+
+          Если установлено значение True и настроено правило DeviceAdvancedBatteryChargeModeDayConfig, расширенный режим зарядки будет всегда включен при условии, что устройство поддерживает такую возможность.
+
+          Если установлено значение False, расширенный режим зарядки будет всегда отключен.
+
+          Если правило настроено, пользователи не могут его изменить или переопределить.
+
+          Если правило не настроено, расширенный режим зарядки отключен и пользователь не может его включить.</translation>
 <translation id="6972540544240464302">Выбор конфигурации планировщика задач</translation>
 <translation id="6979158407327259162">Google Диск</translation>
 <translation id="6994082778848658360">Определяет, как  можно использовать встроенный аппаратный защитный элемент для двухэтапной аутентификации, если этот элемент ее поддерживает. Аппаратная кнопка питания используется для подтверждения физического присутствия пользователя.
@@ -3055,6 +3193,17 @@
       Пользователи не смогут изменить выбранную вами настройку или обойти ее.
 
       Если вы не настроите правило, пользователи смогут самостоятельно решать, включать блокировку или нет.</translation>
+<translation id="7107148737865880402">Позволяет настроить режим подачи энергии через порт USB, предназначенный для зарядки других устройств.
+
+          На некоторых устройствах есть специальный порт USB, отмеченный значком молнии или батареи, который можно использовать для зарядки устройств (например, мобильного телефона) от системной батареи. С помощью этого правила можно настроить режим работы этого порта, когда система выключена или находится в спящем режиме. Это правило не влияет на остальные порты USB, а также на возможность зарядки устройств при включенной и активной системе.
+
+          Когда система активна, этот порт USB всегда будет подавать энергию.
+
+          Если система находится в спящем режиме и установлено значение True, этот порт USB будет подавать энергию при условии, что устройство подключено к розетке или уровень заряда системной батареи составляет более 50 %. Во всех остальных случаях энергия подаваться не будет.
+
+          Если система выключена и установлено значение True, этот порт USB будет подавать энергию при условии, что устройство подключено к розетке. Во всех остальных случаях энергия подаваться не будет.
+
+          Если правило не настроено, оно включено по умолчанию и пользователь не может его отключить.</translation>
 <translation id="7115494316187648452">Определяет, запускается ли процесс <ph name="PRODUCT_NAME" /> при входе в ОС и продолжает ли работать после закрытия последнего окна браузера, позволяя фоновым приложениям и текущему сеансу (вместе с соответствующими файлами cookie) оставаться активными. Когда браузер происходит в фоновом режиме, в области уведомлений виден значок, позволяющий завершить процесс.
 
       Если вы выберете значение True, фоновый режим будет включен и пользователь не сможет отключить его в настройках браузера.
@@ -3105,6 +3254,7 @@
           Если значение не задано или установлено как True, расширения и приложения ARC смогут устанавливать запрет блокировки экрана при условии, что для правила AllowWakeLocks значение не задано или установлено как True.
 
           Если задано значение False, запросы на запрет блокировки экрана будут восприниматься как запросы на запрет блокировки системы.</translation>
+<translation id="7177857088692019405">Быстрая разблокировка</translation>
 <translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="718956142899066210">Разрешенные типы подключений для загрузки обновлений</translation>
 <translation id="7194407337890404814">Название поисковой системы по умолчанию</translation>
@@ -3169,6 +3319,7 @@
 <translation id="7273823081800296768">Если данный параметр включен или не настроен, пользователи могут связывать клиенты и хосты в момент подключения, чтобы не вводить PIN-код каждый раз.
 
           Если данный параметр отключен, эта функция недоступна.</translation>
+<translation id="7274077256421167535">Включить подачу энергии через USB</translation>
 <translation id="7275334191706090484">Управляемые закладки</translation>
 <translation id="7291084543582732020">Если правило включено и все требования соблюдены, пользователи могут использовать Smart Lock.
 
@@ -3304,6 +3455,15 @@
       Если установлено значение 0, используется кеш стандартного размера, но пользователь не может его изменить.
 
       Если это правило не настроено, также используется кеш стандартного размера, но пользователь может изменить его с помощью флага --disk-cache-size.</translation>
+<translation id="759389052790680884">Позволяет установить значение в процентах, при котором батарея перестанет заряжаться.
+
+          Батарея перестанет заряжаться, когда уровень заряда достигнет установленного значения.
+
+          Значение этого правила должно быть больше значения правила DeviceBatteryChargeCustomStartCharging.
+
+          Это правило можно использовать, только если в правиле DeviceBatteryChargeMode установлен пользовательский режим зарядки.
+
+          Если правило не настроено или значение для него не задано, применяется стандартный режим зарядки батареи.</translation>
 <translation id="759957074386651883">Настройки Безопасного просмотра</translation>
 <translation id="7604169113182304895">Вы не можете принудить приложения Android соблюдать правила в отношении этого списка.</translation>
 <translation id="7612157962821894603">Системные настройки, действующие при запуске <ph name="PRODUCT_NAME" /></translation>
@@ -3377,6 +3537,15 @@
 <translation id="7712109699186360774">Предупреждать, что сайт пытается получить доступ к камере или микрофону</translation>
 <translation id="7713608076604149344">Ограничения скачивания</translation>
 <translation id="7715711044277116530">Коэффициент увеличения задержки затемнения экрана в режиме презентации</translation>
+<translation id="7716781462866245042">Устанавливает время ежедневного включения и отключения расширенного режима зарядки батареи.
+
+          Используется, только если для правила DeviceAdvancedBatteryChargeModeEnabled задано значение True.
+
+          Если правило не настроено или значение для него не задано, расширенный режим зарядки батареи будет всегда отключен.
+
+          Примечание. Время начала (<ph name="CHARGE_START_TIME_FIELD_NAME" />) должно предшествовать времени окончания (<ph name="CHARGE_END_TIME_FIELD_NAME" />).
+
+          Обратите внимание: допустимые значения для поля <ph name="MINUTE_FIELD_NAME" /> во времени начала (<ph name="CHARGE_START_TIME_FIELD_NAME" />) и окончания (<ph name="CHARGE_END_TIME_FIELD_NAME" />) — 0, 15, 30 и 45.</translation>
 <translation id="7717938661004793600">Настраивает специальные возможности <ph name="PRODUCT_OS_NAME" />.</translation>
 <translation id="7724994675283793633">Правило включает поддержку HTTP/0.9 для портов кроме 80 (HTTP) и 443 (HTTPS).
 
@@ -3450,6 +3619,7 @@
       Определяет идентификатор расширения для использования в качестве заставки на экране входа. Расширение должно входить в состав пакета приложений для данного домена, заданного в правиле DeviceAppPack.</translation>
 <translation id="7882857838942884046">Отключение Google Sync приведет к сбоям в работе Android Backup and Restore.</translation>
 <translation id="7882890448959833986">Скрывает предупреждения о неподдерживаемой ОС</translation>
+<translation id="7895553628261067384">Удаленный доступ</translation>
 <translation id="7902255855035461275">Шаблоны, указанные в списке, сверяются с запрашивающим URL. При обнаружении соответствий доступ к видеоустройствам предоставляется без предварительного запроса.
 
       ПРИМЕЧАНИЕ. До версии 45 это правило поддерживалось только в режиме киоска.</translation>
@@ -3461,6 +3631,11 @@
 <translation id="7937491150792971922">Объединить правила установки расширений из нескольких источников в один список</translation>
 <translation id="7937766917976512374">Включение или отключение функции захвата видео</translation>
 <translation id="7941975817681987555">Никогда не предопределять параметры сети</translation>
+<translation id="7952007677054834789">Настраивает главную страницу и страницу быстрого доступа по умолчанию в <ph name="PRODUCT_NAME" /> и запрещает пользователям изменять ее.
+
+      Пользовательские настройки главной страницы полностью блокируются, если в качестве главной страницы выбрана страница быстрого доступа или указан определенный URL. Если URL главной страницы не указан, пользователь может установить страницу быстрого доступа в качестве главной, набрав в адресной строке "chrome://newtab".
+
+      Содержание списка "URL, открывающиеся при запуске" игнорируется, если в разделе "Действие при запуске" не выбран параметр "Открыть одну или несколько страниц".</translation>
 <translation id="7952958573604504839">Это правило перестало поддерживаться в M48 и было заменено на <ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />, а в M54 – удалено.
 
       Оно включает предопределение параметров сети в <ph name="PRODUCT_NAME" /> и запрещает пользователям менять эту настройку.
@@ -3601,6 +3776,7 @@
 <translation id="8176035528522326671">Разрешить корпоративному пользователю в многопрофильном режиме быть только основным профилем (настройка по умолчанию для корпоративных управляемых профилей)</translation>
 <translation id="8214600119442850823">Позволяет настроить диспетчер паролей.</translation>
 <translation id="8217516105848565518">Правило больше не поддерживается. Вместо него используется RemoteAccessHostDomainList.</translation>
+<translation id="8244171102276095471">Включить наборы шифров RC4 в TLS</translation>
 <translation id="8244525275280476362">Максимальная задержка извлечения после аннулирования политики</translation>
 <translation id="8256688113167012935">Управление названиями локальных аккаунтов, привязанных к устройству, на странице входа <ph name="PRODUCT_OS_NAME" />.
 
@@ -3640,6 +3816,7 @@
 <translation id="8300992833374611099">Установить ограничения на использование Инструментов разработчика</translation>
 <translation id="8306117673860983372">Настройки входа</translation>
 <translation id="8312129124898414409">Позволяет разрешить или запретить создание ключей для всех сайтов. Если это правило не настроено, для всех сайтов будет использоваться правило BlockKeygen (пользователь может изменить эту настройку).</translation>
+<translation id="8320149248919453401">Режим заряда батареи</translation>
 <translation id="8329984337216493753">Эти правила действуют только в коммерческой версии.
 
 Если параметр "DeviceIdleLogoutTimeout" задан, эти правила определяют длительность отображения предупреждающего сообщения, в котором идет обратного отсчета до выхода из аккаунта.
@@ -3805,6 +3982,7 @@
        Если правило не настроено, используется период по умолчанию: 345 600 000 миллисекунд (четыре дня) для устройств <ph name="PRODUCT_OS_NAME" /> и 604 800 000 миллисекунд (одна неделя) для браузера <ph name="PRODUCT_NAME" />.</translation>
 <translation id="8685024486845674965">Предупреждение от защиты паролем срабатывает при повторном использовании пароля</translation>
 <translation id="8693243869659262736">Встроенный клиент DNS</translation>
+<translation id="8698286761337647563">За сколько дней предупреждать пользователей SAML об истечении срока действия пароля</translation>
 <translation id="8703488928438047864">Отчеты о статусе процессора</translation>
 <translation id="8703872185032220081">Позволяет указать ежедневное время включения и выключения режима пиковой нагрузки.
 
@@ -3849,6 +4027,7 @@
       Если правило отключено или не настроено, служба защиты паролей перенаправляет пользователей на страницу https://myaccounts.google.com.
       Правило можно установить только на устройствах Windows, входящих в домен <ph name="MS_AD_NAME" />, а также на устройствах Windows 10 Pro или Enterprise, зарегистрированных в консоли администратора.</translation>
 <translation id="8798099450830957504">По умолчанию</translation>
+<translation id="8800453707696044281">Установить уровень заряда в процентах, при котором будет прекращаться зарядка</translation>
 <translation id="8801680448782904838">Уведомлять пользователя о том, что рекомендуется или требуется перезапустить браузер или устройство</translation>
 <translation id="8818173863808665831">Отправка сведений о географическом местоположении устройства.
 
@@ -3972,6 +4151,11 @@
       Правило затрагивает только тех пользователей, которые проходят аутентификацию с помощью SAML.
 
       Значение правила указывается в секундах.</translation>
+<translation id="9018338365267278833">Удаляет расширения, установка которых заблокирована правилами <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" /> и <ph name="EXTENSION_SETTINGS_POLICY_NAME" />. При этом также удаляются локальные пользовательские данные.  Чтобы узнать о том, что может произойти с пользовательскими данными, которые не были сохранены на устройстве, ознакомьтесь с политикой конфиденциальности или политикой хранения данных, используемых разработчиками расширений.
+
+      Когда правило будет включено, заблокированные правилами расширения (если они уже установлены) будут полностью удалены с компьютера (вместе с локальными пользовательскими данными).
+
+      Если отключить правило или не настраивать его, заблокированные правилами расширения (если они уже установлены и входят в черный список правила <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />) будут отключены на компьютере без удаления.</translation>
 <translation id="9027787254195333560">Позволяет выбрать аватар для экрана входа в систему. Чтобы настроить правило, необходимо указать URL, откуда <ph name="PRODUCT_OS_NAME" /> может скачать изображение, а также криптографический хеш, с помощью которого проверяется целостность скачанного файла. Поддерживаются изображения в формате JPEG размером не более 512 КБ. URL должен быть доступен без аутентификации.
 
       Изображение скачивается и сохраняется в кеше. В случае изменения URL или хеша файл скачивается повторно.
diff --git a/components/policy/resources/policy_templates_sr.xtb b/components/policy/resources/policy_templates_sr.xtb
index 86ca848..3c7d4b6 100644
--- a/components/policy/resources/policy_templates_sr.xtb
+++ b/components/policy/resources/policy_templates_sr.xtb
@@ -1355,7 +1355,7 @@
 
           Ако се ове смернице поставе на вредност false или се не поставе, кашњења у управљању напајањем и ограничење дужине сесије се покрећу одмах по покретању сесије.</translation>
 <translation id="3478024346823118645">Брисање корисничких података при одјављивању</translation>
-<translation id="3480961938508521469">У потпуности напуните батерију стандардном брзином.</translation>
+<translation id="3480961938508521469">Напуните батерију до краја стандардном брзином.</translation>
 <translation id="348495353354674884">Омогући виртуелну тастатуру</translation>
 <translation id="3487623755010328395">
         Ако подесите ове смернице, <ph name="PRODUCT_NAME" /> ће пробати да се региструје и примени повезане смернице за клауд за све профиле.
@@ -3160,7 +3160,7 @@
       Ако се ове смернице подесе на „Тачно“ или се не подесе, модел паметног затамњивања је омогућен и може да продужи време до затамњења екрана. Ако се ове смернице подесе на „Нетачно“, модел паметног затамњивања не утиче на затамњење екрана.</translation>
 <translation id="6967394885063085697">Омогућавају смернице за управљање напајањем које се тичу напредног режима пуњења батерије.
 
-          Напредни режим пуњења батерије омогућава кориснику да побољша стање батерије. У напредном режиму пуњења систем током периода неактивности користи стандардни алгоритам пуњења и друге технике да би побољшао стање батерије. Током периода рада, користи се експресно пуњење. Ово експресно пуњење омогућава брже пуњење батерије, па она брже може у потпуности да се напуни. За сваки дан се наводи период када се систем највише користи у виду времена почетка и трајања.
+          Напредни режим пуњења батерије омогућава кориснику да побољша стање батерије. У напредном режиму пуњења систем током периода неактивности користи стандардни алгоритам пуњења и друге технике да би побољшао стање батерије. Током периода рада, користи се експресно пуњење. Ово експресно пуњење омогућава брже пуњење батерије, па она брже може да се напуни до краја. За сваки дан се наводи период када се систем највише користи у виду времена почетка и трајања.
 
           Ако ове смернице подесите на Тачно и ако подесите DeviceAdvancedBatteryChargeModeDayConfig, напредни режим пуњења батерије је увек омогућен ако је подржан на уређају.
 
@@ -3250,11 +3250,11 @@
 
           Одређени уређаји имају посебан USB порт означен иконом муње или батерије који може да се користи за пуњење уређаја, попут мобилног телефона, помоћу батерије система. Ове смернице утичу на понашање овог порта при пуњењу док је систем у стању спавања и док је искључен. Ове смернице не утичу на друге USB портове и понашање при пуњењу док је систем у будном стању.
 
-          Када је систем у будном стању, USB порт увек обезбеђује напајање.
+          Када је систем у будном стању, USB порт увек пружа напајање.
 
-          Када је систем у стању спавања, ако ове смернице подесите на Тачно, напајање се обезбеђује USB порту када је уређај укључен у зидну утичницу или ако је ниво напуњености батерије изнад 50%. У супротном, напајање се не обезбеђује.
+          Када је систем у стању спавања, ако ове смернице подесите на Тачно, напајање се пружа USB порту када је уређај укључен у зидну утичницу или ако је ниво напуњености батерије изнад 50%. У супротном, напајање се не пружа.
 
-          Када је систем искључен, ако ове смернице подесите на Тачно, напајање се обезбеђује USB порту када је уређај укључен у зидну утичницу. У супротном, напајање се не обезбеђује.
+          Када је систем искључен, ако ове смернице подесите на Тачно, напајање се пружа USB порту када је уређај укључен у зидну утичницу. У супротном, напајање се не пружа.
 
           Ако не подесите ове смернице, оне су омогућене и корисник не може да их онемогући.</translation>
 <translation id="7115494316187648452">Одређују да ли се при пријављивању у ОС започиње процес у производу <ph name="PRODUCT_NAME" /> који се наставља и када се затвори последњи прозор прегледача, што омогућава позадинским апликацијама и актуелној сесији прегледања да остану активне, укључујући било какве колачиће сесија. Процес у позадини приказује икону на системској палети и увек можете да га затворите одатле.
diff --git a/components/policy/resources/policy_templates_ta.xtb b/components/policy/resources/policy_templates_ta.xtb
index 4d15917..9481c57 100644
--- a/components/policy/resources/policy_templates_ta.xtb
+++ b/components/policy/resources/policy_templates_ta.xtb
@@ -53,7 +53,7 @@
       இந்தக் கொள்கை அமைக்கப்பட்டால், உள்நுழைத் திரை எப்போதும் இந்தக் கொள்கையின் (கொள்கையானது வரவிருக்கும் பதிப்புகளுடன் இணங்கும்தன்மைக்கான பட்டியலாக வரையறுக்கப்பட்டுள்ளது) முதல் மதிப்பு வழங்கிய மொழியில் காட்டப்படும்.  இந்தக் கொள்கை அமைக்கப்படாமல் இருந்தாலோ அல்லது வெற்றுப் பட்டியலாக அமைக்கப்பட்டாலோ, கடைசியாகப் பயன்படுத்திய பயனர் அமர்வின் மொழியில் உள்நுழைவுத் திரை காட்டப்படும்.  இந்தக் கொள்கை, தவறான மொழியின் மதிப்புக்கு அமைக்கப்பட்டால், உள்நுழைவுத் திரையானது இயல்பு மொழியில் (தற்போது en-US) அமைக்கப்படும்.</translation>
 <translation id="1062011392452772310">சாதனத்திற்கான தொலைநிலைச் சான்றொப்பத்தை இயக்கு</translation>
 <translation id="1062407476771304334">மாற்றியமை</translation>
-<translation id="1079801999187584280">டெவெலப்பர் கருவிகளின் பயன்பாட்டை அனுமதிக்காதே</translation>
+<translation id="1079801999187584280">டெவெலப்பர் கருவிகளின் ஆப்ஸை அனுமதிக்காதே</translation>
 <translation id="1087437665304381368">இந்தக் கொள்கை <ph name="PRODUCT_OS_NAME" /> டெவலப்பர் பயன்முறையை மட்டும் கட்டுப்படுத்தும். Android டெவெலப்பர் விருப்பங்களுக்கான அணுகலைத் தடுக்க விரும்பினால் <ph name="DEVELOPER_TOOLS_DISABLED_POLICY_NAME" /> கொள்கையை அமைக்க வேண்டும்.</translation>
 <translation id="1093082332347834239">இந்த அமைப்பை இயக்கினால், தொலைநிலை உதவி ஹோஸ்ட்டானது <ph name="UIACCESS_PERMISSION_NAME" /> அனுமதிகளைக் கொண்ட செயல்முறையில் இயங்கும்.  இது பயனரின் டெஸ்க்டாப்பில் உயர்நிலைச் சாளரங்களை அணுக தொலைநிலைப் பயனர்களை அனுமதிக்கும்.
 
@@ -216,7 +216,7 @@
       இந்த அமைப்பு முடக்கப்பட்டாலோ உள்ளமைக்கப்படாமல் இருந்தாலோ, புகாரளிக்கப்பட்ட தளத்திற்குச் செல்லலாமா வேண்டாமா என்பதை எச்சரிக்கைக்குப் பிறகுப் பயனர்கள் தேர்வுசெய்து கொள்ளலாம்.
 
       ’பாதுகாப்பு உலாவல்’ குறித்த மேலும் தகவலுக்கு, https://developers.google.com/safe-browsing எனும் இணைப்பைப் பார்க்கவும்.</translation>
-<translation id="1413936351612032792">Linux ஆப்ஸின் பயன்பாடு குறித்த தகவல்களை அனுப்பும்</translation>
+<translation id="1413936351612032792">Linux ஆப்ஸின் ஆப்ஸ் குறித்த தகவல்களை அனுப்பும்</translation>
 <translation id="142346659686073702">Crostiniயைப் பயன்படுத்த, அதிகாரப்பூர்வமாக இணைக்கப்படாத பயனர்களை அனுமதிக்கும்</translation>
 <translation id="1426410128494586442">ஆம்</translation>
 <translation id="1427655258943162134">ப்ராக்ஸி  சேவையகத்தின் முகவரி அல்லது URL</translation>
@@ -520,7 +520,7 @@
       இந்த அமைப்பை இயக்கினால் அல்லது அதற்கென எந்தவொரு மதிப்பையும் அமைக்கவில்லை என்றால், பயனர் இடைமுகத்தில் முகவரிகளுக்கான தன்னிரப்பி அம்சத்தைப் பயனர் கட்டுப்படுத்த முடியும்.</translation>
 <translation id="1962273523772270623">WebRTC நிகழ்வுப் பதிவுகளை Google சேவைகளிலிருந்து சேகரிக்க அனுமதிக்கும்</translation>
 <translation id="1964634611280150550">மறைநிலைப் பயன்முறை முடக்கப்பட்டது</translation>
-<translation id="1964802606569741174">Android YouTube பயன்பாட்டில் இந்தக் கொள்கை எந்த மாற்றத்தையும் ஏற்படுத்தாது. YouTube இல் பாதுகாப்புப் பயன்முறையைச் செயல்படுத்த வேண்டும் எனில், Android YouTube பயன்பாட்டை நிறுவுவது அனுமதிக்கப்படாது.</translation>
+<translation id="1964802606569741174">Android YouTube பயன்பாட்டில் இந்தக் கொள்கை எந்த மாற்றத்தையும் ஏற்படுத்தாது. YouTube இல் பாதுகாப்புப் பயன்முறையைச் செயல்படுத்த வேண்டும் எனில், Android YouTube ஆப்ஸை நிறுவுவது அனுமதிக்கப்படாது.</translation>
 <translation id="1969212217917526199">தொலைநிலை அணுகல் ஹோஸ்ட்டின் பிழைத் திருத்தப் பதிப்புகளின் கொள்கைகளை மேலெழுதும்.
 
           மதிப்பானது கொள்கை மதிப்புப் பிணைப்புகளுக்கான கொள்கைப் பெயரின் JSON அகராதியாகப் பாகுபடுத்தப்படும்.</translation>
@@ -690,7 +690,7 @@
       இந்தக் கொள்கை அமைக்கப்படாமல் இருந்தால், தொடக்கத்திலே ஆன்ஸ்க்ரீன் விசைப்பலகை முடக்கப்பட்டிருக்கும், ஆனால் பயனர் இதை எப்போது வேண்டுமானாலும் இயக்கலாம். விசைப்பலகையை எப்போது காட்ட வேண்டும் என்பதற்கு விதிகளின் தொகுப்பையும் பயன்படுத்தலாம்.</translation>
 <translation id="2292084646366244343">எழுத்துப்பிழைகளைத் தீர்ப்பதற்கு உதவ <ph name="PRODUCT_NAME" /> Google இணைய சேவையைப் பயன்படுத்தலாம். இந்த அமைப்பு இயக்கப்பட்டால், இந்தச் சேவையானது எப்போதுமே பயன்படுத்தப்படும். இந்த அமைப்பு முடக்கப்பட்டால், இந்தச் சேவை ஒருபோதும் பயன்படுத்தப்படாது.
 
-      பதிவிறக்கப்பட்ட அகராதியைப் பயன்படுத்தியும் எழுத்துப்பிழை சரிபார்ப்பைச் செயல்படுத்தலாம்; இந்தக் கொள்கையானது ஆன்லைன் சேவையின் பயன்பாட்டை மட்டுமே கட்டுப்படுத்துகிறது.
+      பதிவிறக்கப்பட்ட அகராதியைப் பயன்படுத்தியும் எழுத்துப்பிழை சரிபார்ப்பைச் செயல்படுத்தலாம்; இந்தக் கொள்கையானது ஆன்லைன் சேவையின் ஆப்ஸை மட்டுமே கட்டுப்படுத்துகிறது.
 
       இந்த அமைப்பை உள்ளமைக்கவில்லையெனில், பயனர்கள் எழுத்துப்பிழைச் சரிபார்ப்பு சேவையைப் பயன்படுத்த வேண்டுமா இல்லையா என்பதைத் தேர்வுசெய்யலாம்.</translation>
 <translation id="2294283832646774959">பிரிண்டர்களின் பட்டியலை உள்ளமைக்கும்.
@@ -877,7 +877,7 @@
 <translation id="2706708761587205154">’பின்’ மூலமாக மட்டும் அச்சிடலை அனுமதிக்கும்</translation>
 <translation id="2710534340210290498">இந்தக் கொள்கை 'தவறு' என அமைக்கப்பட்டால் பயனர்களால் திரையைப் பூட்ட முடியாது (பயனர் அமர்விலிருந்து வெளியேற மட்டுமே முடியும்). இந்தக் கொள்கை 'சரி' என அமைக்கப்பட்டாலோ அமைக்கப்படாமலேயே இருந்தாலோ கடவுச்சொல்லுடன் அங்கீகரிக்கப்படும் பயனர்களால் திரையைப் பூட்ட முடியும்.</translation>
 <translation id="2731627323327011390">ARC பயன்பாடுகளில் <ph name="PRODUCT_OS_NAME" /> சான்றிதழ்களின் உபயோகத்தை முடக்கு</translation>
-<translation id="2742843273354638707">புதிய தாவல் பக்கத்திலிருந்தும், <ph name="PRODUCT_OS_NAME" /> பயன்பாட்டுத் துவக்கியிலிருந்தும், Chrome இணைய அங்காடி பயன்பாடு மற்றும் அடிக்குறிப்பு இணைப்பை மறைக்கவும்.
+<translation id="2742843273354638707">புதிய தாவல் பக்கத்திலிருந்தும், <ph name="PRODUCT_OS_NAME" /> பயன்பாட்டுத் துவக்கியிலிருந்தும், Chrome இணைய அங்காடி ஆப்ஸ் மற்றும் அடிக்குறிப்பு இணைப்பை மறைக்கவும்.
 
       இந்தக் கொள்கை சரி என அமைக்கப்படும்போது, ஐகான்கள் மறைக்கப்படும்.
 
@@ -1160,7 +1160,7 @@
 <translation id="3214164532079860003">தற்போதைய இயல்புநிலை உலாவி இயக்கத்தில் இருந்தால் முகப்புப்பக்கத்தை இறக்குமதி செய்ய இந்தக் கொள்கை தூண்டுகிறது. அது முடக்கப்பட்டால், முகப்புப்பக்கத்தை இறக்குமதி செய்ய முடியாது. இது அமைக்கப்படவில்லை எனில், இறக்குமதி செய்யலாமா என பயனரிடம் கேட்கப்படும் அல்லது தானாக இறக்குமதியாகும்.</translation>
 <translation id="3219421230122020860">மறைநிலைப் பயன்முறை உள்ளது</translation>
 <translation id="3220624000494482595">கியோஸ்க் பயன்பாடானது Android பயன்பாடாக இருந்தால், இந்தக் கொள்கையை <ph name="TRUE" /> என அமைத்திருந்தாலும் கூட, அது <ph name="PRODUCT_OS_NAME" /> பதிப்பு தொடர்பான எந்தக் கட்டுப்பாட்டையும் கொண்டிருக்காது.</translation>
-<translation id="3236046242843493070">இதிலிருந்து நீட்டிப்பு, பயன்பாடு, பயனர் ஸ்கிரிப்ட் நிறுவல்களை அனுமதிக்கும் URL கள வடிவங்கள்</translation>
+<translation id="3236046242843493070">இதிலிருந்து நீட்டிப்பு, ஆப்ஸ், பயனர் ஸ்கிரிப்ட் நிறுவல்களை அனுமதிக்கும் URL கள வடிவங்கள்</translation>
 <translation id="3240609035816615922">பிரிண்டர் உள்ளமைவு அணுகல் கொள்கை.</translation>
 <translation id="3243309373265599239">AC சக்தியில் இயங்கும்போது திரை மங்கலாகும் நேரத்தின் அளவைப் பயனரின் உள்ளீடு இல்லாமல் குறிப்பிடுகிறது.
 
@@ -1675,7 +1675,7 @@
       பயன்படுத்தக்கூடிய மாறிகளின் பட்டியலைப் பார்க்க, https://www.chromium.org/administrators/policy-list-3/user-data-directory-variables எனும் இணைப்பிற்குச் செல்லவும்.
 
       இந்தக் கொள்கை அமைக்கப்படவில்லை எனில் இயல்பு ரோமிங் சுயவிவரத் தடம் பயன்படுத்தப்படும்.</translation>
-<translation id="4239720644496144453">Android பயன்பாடுகளுக்குத் தற்காலிகச் சேமிப்பு பயன்படுத்தப்படாது. பல பயனர்கள் ஒரே Android பயன்பாட்டை நிறுவியிருந்தால், ஒவ்வொரு பயனருக்கும் அது புதியதாகப் பதிவிறக்கப்படும்.</translation>
+<translation id="4239720644496144453">Android பயன்பாடுகளுக்குத் தற்காலிகச் சேமிப்பு பயன்படுத்தப்படாது. பல பயனர்கள் ஒரே Android ஆப்ஸை நிறுவியிருந்தால், ஒவ்வொரு பயனருக்கும் அது புதியதாகப் பதிவிறக்கப்படும்.</translation>
 <translation id="4243336580717651045"><ph name="PRODUCT_NAME" /> இல், URLகளோடு சேகரிக்கப்படும் அடையாளமற்ற தரவுத் தொகுப்பை இயக்கும். மேலும் இந்த அமைப்பைப் பயனர்கள் மாற்றுவதைத் தடுக்கும்.
 
       தேடல்களையும் பயனரின் உலாவல் அனுபவத்தையும் மேம்படுத்துவதற்காக, URLகளோடு சேகரிக்கப்படும் அடையாளமற்ற தரவுத் தொகுப்பானது பயனர் பார்வையிடும் பக்கங்களின் URLகளை Googleளுக்கு அனுப்பும்.
@@ -1701,15 +1701,15 @@
 <translation id="4285674129118156176">ARCஐப் பயன்படுத்த, அதிகாரப்பூர்வமாக இணைக்கப்படாத பயனர்களை அனுமதிக்கவும்</translation>
 <translation id="4298509794364745131"><ph name="PRODUCT_OS_NAME" /> லாக் ஸ்கிரீனில், குறிப்பெடுக்கும் பயன்பாடாக இயக்கக்கூடிய பயன்பாடுகளின் பட்டியலைக் குறிப்பிடுகிறது.
 
-      தேர்ந்தெடுத்த குறிப்பெடுக்கும் பயன்பாடானது லாக் ஸ்கிரீனில் இயக்கப்பட்டால், தேர்ந்தெடுத்த குறிப்பெடுக்கும் பயன்பாட்டைத் தொடங்குவதற்கான பயனர் இடைமுக உறுப்பானது லாக் ஸ்கிரீனில் காட்டப்படும்.
-      பயன்பாட்டைத் தொடங்கும் போது, அதனால் லாக் ஸ்கிரீனின் மேற்பகுதியில் பயன்பாட்டுச் சாளரத்தை உருவாக்க முடியும். மேலும், லாக் ஸ்கிரீன் சூழலில் தரவு உருப்படிகளை (குறிப்புகளை) உருவாக்கும். அமர்வு திறக்கப்பட்டிருக்கும் போது, உருவாக்கிய குறிப்புகளைப் பயனரின் முதன்மை அமர்விற்கு, பயன்பாட்டால் இறக்க முடியும். தற்போது, Chrome இன் குறிப்பெடுக்கும் பயன்பாடுகள் மட்டுமே லாக் ஸ்கிரீனில் ஆதரிக்கப்படுகின்றன.
+      தேர்ந்தெடுத்த குறிப்பெடுக்கும் பயன்பாடானது லாக் ஸ்கிரீனில் இயக்கப்பட்டால், தேர்ந்தெடுத்த குறிப்பெடுக்கும் ஆப்ஸைத் தொடங்குவதற்கான பயனர் இடைமுக உறுப்பானது லாக் ஸ்கிரீனில் காட்டப்படும்.
+      ஆப்ஸைத் தொடங்கும் போது, அதனால் லாக் ஸ்கிரீனின் மேற்பகுதியில் பயன்பாட்டுச் சாளரத்தை உருவாக்க முடியும். மேலும், லாக் ஸ்கிரீன் சூழலில் தரவு உருப்படிகளை (குறிப்புகளை) உருவாக்கும். அமர்வு திறக்கப்பட்டிருக்கும் போது, உருவாக்கிய குறிப்புகளைப் பயனரின் முதன்மை அமர்விற்கு, பயன்பாட்டால் இறக்க முடியும். தற்போது, Chrome இன் குறிப்பெடுக்கும் பயன்பாடுகள் மட்டுமே லாக் ஸ்கிரீனில் ஆதரிக்கப்படுகின்றன.
 
-      கொள்கை அமைக்கப்பட்டால், கொள்கையின் பட்டியல் மதிப்பில் பயன்பாட்டின் நீட்டிப்பு ஐடி இருந்தால் மட்டுமே லாக் ஸ்கிரீனில் பயன்பாட்டை இயக்குவதற்கு, பயனர் அனுமதிக்கப்படுவார்.
+      கொள்கை அமைக்கப்பட்டால், கொள்கையின் பட்டியல் மதிப்பில் பயன்பாட்டின் நீட்டிப்பு ஐடி இருந்தால் மட்டுமே லாக் ஸ்கிரீனில் ஆப்ஸை இயக்குவதற்கு, பயனர் அனுமதிக்கப்படுவார்.
       அதன் விளைவாக, இந்தக் கொள்கையைக் காலிப் பட்டியலுடன் அமைத்தால், லாக் ஸ்கிரீன் முழுவதும் குறிப்பெடுக்கும் பயன்பாடுகள் முடக்கப்படும்.
-      கொள்கையில் பயன்பாட்டின் ஐடி இருப்பதாலேயே, பயனரால் ஒரு பயன்பாட்டைக் குறிப்பெடுக்கும் பயன்பாடாகப் லாக் ஸ்கிரீனில் இயக்க முடியாது. எடுத்துக்காட்டாக, Chrome 61 இல் கிடைக்கக்கூடிய பயன்பாடுகளின் தொகுப்பை இயங்குதளமானது கூடுதலாகக் கட்டுப்படுத்துகிறது.
+      கொள்கையில் பயன்பாட்டின் ஐடி இருப்பதாலேயே, பயனரால் ஒரு ஆப்ஸைக் குறிப்பெடுக்கும் பயன்பாடாகப் லாக் ஸ்கிரீனில் இயக்க முடியாது. எடுத்துக்காட்டாக, Chrome 61 இல் கிடைக்கக்கூடிய பயன்பாடுகளின் தொகுப்பை இயங்குதளமானது கூடுதலாகக் கட்டுப்படுத்துகிறது.
 
       கொள்கை அமைக்கப்படவில்லை எனில், லாக் ஸ்கிரீனில் பயனர் இயக்கக்கூடிய பயன்பாடுகளின் தொகுப்பின் மீது கொள்கை விதிக்கும் எந்தக் கட்டுப்பாடுகளும் இருக்காது.</translation>
-<translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> பதிப்பைக் கட்டுப்படுத்த, தாமதமின்றி தானாகத் துவங்கும் கியோஸ்க் பயன்பாட்டை அனுமதிக்கவும்</translation>
+<translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> பதிப்பைக் கட்டுப்படுத்த, தாமதமின்றி தானாகத் துவங்கும் கியோஸ்க் ஆப்ஸை அனுமதிக்கவும்</translation>
 <translation id="4325690621216251241">கணினி ட்ரேயில் வெளியேறு பொத்தனைச் சேர்க்கவும்</translation>
 <translation id="4332177773549877617">Android பயன்பாட்டின் நிறுவல்களுக்காக, நிகழ்வுகளைப் பதிவுசெய்</translation>
 <translation id="4335292026668105285">AC மின்சக்தியில் இயங்கும்போது எச்சரிக்கை உரையாடல் காண்பிக்கப்பட்டதற்கு பிறகு, பயனரின் உள்ளீடு இல்லாத நேரத்தின் நீளத்தைக் குறிக்கும்.
@@ -1780,7 +1780,7 @@
 <translation id="4454820008017317557"><ph name="PRODUCT_NAME" /> கருவிப்பட்டி ஐகானைக் காட்டும்</translation>
 <translation id="4467952432486360968">மூன்றாம் தரப்பு குக்கீகளைத் தடு</translation>
 <translation id="4474167089968829729">கடவுச்சொல் நிர்வாகியில் கடவுச்சொற்களைச் சேமிப்பதை இயக்கு</translation>
-<translation id="4476769083125004742">இந்தக் கொள்கையை "<ph name="BLOCK_GEOLOCATION_SETTING" />" என்பதற்கு அமைத்தால், Android பயன்பாடுகளால் இருப்பிடத் தகவலை அணுக முடியாது. இந்தக் கொள்கையை வேறு ஏதேனும் மதிப்பிற்கு அமைத்தாலோ அல்லது அமைக்காமல் விட்டலோ, இருப்பிடத் தகவலை Android பயன்பாடு அணுக விரும்பும் போது, பயனரிடம் ஒப்புதல் கேட்கப்படும்.</translation>
+<translation id="4476769083125004742">இந்தக் கொள்கையை "<ph name="BLOCK_GEOLOCATION_SETTING" />" என்பதற்கு அமைத்தால், Android ஆப்ஸ்களால் இருப்பிடத் தகவலை அணுக முடியாது. இந்தக் கொள்கையை வேறு ஏதேனும் மதிப்பிற்கு அமைத்தாலோ அல்லது அமைக்காமல் விட்டலோ, இருப்பிடத் தகவலை Android ஆப்ஸ் அணுக விரும்பும் போது, பயனரிடம் ஒப்புதல் கேட்கப்படும்.</translation>
 <translation id="4480694116501920047">பாதுகாப்புத்தேடலைச் செயலாக்கு</translation>
 <translation id="4482640907922304445"><ph name="PRODUCT_NAME" /> இன் கருவிப்பட்டியில் முகப்பு பட்டனைக் காண்பிக்கிறது. இந்த அமைப்பை இயக்கினால், முகப்பு பட்டன் எப்போதும் காண்பிக்கப்படும். இந்த அமைப்பை முடக்கினால், முகப்பு பட்டன் எப்போதும் காண்பிக்கப்படாது. இந்த அமைப்பை இயக்கினால் அல்லது முடக்கினால், <ph name="PRODUCT_NAME" /> இல் பயனர்கள் இந்த அமைப்பை மாற்றவோ அல்லது மீறவோ முடியாது. இந்தக் கொள்கையை அமைக்காமல் விடுதல், முகப்பு பட்டனை காண்பிக்க வேண்டுமா அல்லது வேண்டாமா என்பதைத் தேர்வு செய்ய பயனரை அனுமதிக்கும்.</translation>
 <translation id="4483649828988077221">தானியங்கு புதுப்பிப்பை முடக்கும்</translation>
@@ -1820,7 +1820,7 @@
       இந்தக் கொள்கை அமைக்காமல் விடப்பட்டால், இயல்பில் மேற்கூறிய அம்சம் நிறுவனத்தால் நிர்வகிக்கப்படும் பயனர்களுக்கு முடக்கப்படும், நிர்வகிக்கப்படாத பயனர்களுக்கு இயக்கப்படும்.</translation>
 <translation id="4555850956567117258">பயனருக்கான தொலைநிலைச் சான்றொப்பத்தை இயக்கு</translation>
 <translation id="4557134566541205630">இயல்புநிலை தேடல் வழங்குநர் புதிய தாவல் பக்க URL</translation>
-<translation id="4567137030726189378">டெவெலப்பர் கருவிகளின் பயன்பாட்டை அனுமதி</translation>
+<translation id="4567137030726189378">டெவெலப்பர் கருவிகளின் ஆப்ஸை அனுமதி</translation>
 <translation id="4578265298946081589">பயனர் வெளியேறும்போது மறுபடி தொடங்காது.</translation>
 <translation id="4578912515887794133">இந்த அமைப்பு இயக்கப்பட்டால் (ஹோஸ்ட்டுடன் இணைக்கப்படும்) அகப் பயனரின் பெயரும் ஹோஸ்ட் உரிமையாளராகப் பதிவு செய்யப்பட்டுள்ள Google கணக்கின் பெயரும் (அதாவது ஹோஸ்ட் "johndoe@example.com" என்ற Google கணக்கிற்குச் சொந்தமானதாக இருந்தால் உரிமையாளரின் பெயர் "johndoe" ஆகும்) தொலைநிலை அணுகல் ஹோஸ்ட் மூலம் ஒப்பிடப்படும்.  ஹோஸ்ட் உரிமையாளர் பெயரும் அந்த ஹோஸ்ட்டுடன் இணைக்கப்படும் அகப் பயனரின் பெயரும் வெவ்வேறாக இருந்தால் தொலைநிலை அணுகல் ஹோஸ்ட் தொடங்கப்படாது.  ஹோஸ்ட் உரிமையாளரின் Google கணக்கு ஒரு குறிப்பிட்ட டொமைனுடன் (எ.கா., "example.com") தொடர்புடையதாக இருப்பதையும் செயல்படுத்த, RemoteAccessHostMatchUsername கொள்கையை RemoteAccessHostDomain கொள்கையுடன் ஒன்றாகப் பயன்படுத்த வேண்டும்.
 
@@ -1831,7 +1831,7 @@
 <translation id="4617338332148204752"><ph name="PRODUCT_FRAME_NAME" /> இல் மீக்குறி பயன்படுத்துவதைத் தவிர்</translation>
 <translation id="4625915093043961294">நீட்டிப்பு நிறுவுதல் அனுமதிப் பட்டியலை உள்ளமைக்கவும்</translation>
 <translation id="4632343302005518762">பின்வரும் பட்டியலிடப்பட்ட உள்ளடக்க வகைகளைக் கையாள <ph name="PRODUCT_FRAME_NAME" /> ஐ அனுமதி</translation>
-<translation id="4632566332417930481">நிறுவனக் கொள்கையால் நிறுவப்படும் நீட்டிப்புகளில் டெவெலப்பர் கருவிகளின் பயன்பாட்டை அனுமதிக்காமல், மற்றவற்றில் அவற்றின் பயன்பாட்டை அனுமதிக்கும்</translation>
+<translation id="4632566332417930481">நிறுவனக் கொள்கையால் நிறுவப்படும் நீட்டிப்புகளில் டெவெலப்பர் கருவிகளின் ஆப்ஸை அனுமதிக்காமல், மற்றவற்றில் அவற்றின் ஆப்ஸை அனுமதிக்கும்</translation>
 <translation id="4633786464238689684">மேல் வரிசையில் உள்ள விசைகளின் இயல்புநிலை செயலைச் செயல்பாட்டு விசைகளுக்கு மாற்றுகிறது.
 
           இந்தக் கொள்கை சரி என அமைக்கப்பட்டிருந்தால் விசைப் பலகையின் மேல் வரிசையில் உள்ள விசைகள் இயல்புநிலையில் செயல்பாட்டு விசையின் கட்டளைகளைச் செயல்படுத்தும். இவற்றின் செயலை மீண்டும் மீடியா விசைகளாக மாற்ற தேடல் விசையை அழுத்த வேண்டியிருக்கும்.
@@ -2058,7 +2058,7 @@
 
           இயல்புநிலையாக எல்லா நீட்டிப்புகளுமே, அனுமதி பட்டியலில்தான் இருக்கும், ஆனால் கொள்கையின்படி எல்லா நீட்டிப்புகளும் தடுப்புப்பட்டியலில் சேர்க்கப்பட்டால், அந்த கொள்கையை மீறுவதற்கு, அனுமதி பட்டியலைப் பயன்படுத்தலாம்.</translation>
 <translation id="519247340330463721">பாதுகாப்பான உலாவல் தொடர்பான கொள்கைகளை உள்ளமைக்கலாம்.</translation>
-<translation id="5192837635164433517"><ph name="PRODUCT_NAME" /> இல் தோன்றியுள்ள மாற்றுப் பிழை பக்கங்களின் ('பக்கம் காணப்படவில்லை' போன்று)  பயன்பாட்டை செயல்படுத்துகிறது, மேலும் இந்த அமைப்பை மாற்றுவதிலிருந்து பயனர்களைத் தடுக்கிறது. இந்த அமைப்பை செயல்படுத்தினால், அதற்கு மாற்றான பிழை பக்கங்கள் பயன்படுத்தப்படும்.  நீங்கள் இந்த அமைப்பை முடக்கினால்,  அதற்கு மாற்றான பிழை பக்கங்கள் ஒருபோதும் பயன்படுத்தப்படாது. இந்த அமைப்பை நீங்கள் இயக்கினாலோ அல்லது முடக்கினாலோ, பயனர்கள் <ph name="PRODUCT_NAME" /> இல் இந்த அமைப்பை மாற்றவோ அல்லது மீறவோ  முடியாது. இந்த கொள்கையை அமைக்காமல் விட்டால், இது செயல்படுத்தப்படும் ஆனால், பயனர் அதை மாற்றலாம்.</translation>
+<translation id="5192837635164433517"><ph name="PRODUCT_NAME" /> இல் தோன்றியுள்ள மாற்றுப் பிழை பக்கங்களின் ('பக்கம் காணப்படவில்லை' போன்று)  ஆப்ஸை செயல்படுத்துகிறது, மேலும் இந்த அமைப்பை மாற்றுவதிலிருந்து பயனர்களைத் தடுக்கிறது. இந்த அமைப்பை செயல்படுத்தினால், அதற்கு மாற்றான பிழை பக்கங்கள் பயன்படுத்தப்படும்.  நீங்கள் இந்த அமைப்பை முடக்கினால்,  அதற்கு மாற்றான பிழை பக்கங்கள் ஒருபோதும் பயன்படுத்தப்படாது. இந்த அமைப்பை நீங்கள் இயக்கினாலோ அல்லது முடக்கினாலோ, பயனர்கள் <ph name="PRODUCT_NAME" /> இல் இந்த அமைப்பை மாற்றவோ அல்லது மீறவோ  முடியாது. இந்த கொள்கையை அமைக்காமல் விட்டால், இது செயல்படுத்தப்படும் ஆனால், பயனர் அதை மாற்றலாம்.</translation>
 <translation id="5196805177499964601">டெவலப்பர் பயன்முறையைத் தடுத்தல்.
 
      இந்தக் கொள்கை சரி என அமைக்கப்பட்டால், <ph name="PRODUCT_OS_NAME" /> சாதனமானது, இயக்கத்திலிருந்து டெவலப்பர் பயன்முறைக்குச் செல்வதைத் தடுக்கும். முறைமையானது தொடங்குவதைத் தடுத்து, டெவெலப்பர் இயக்கப்பட்டதும் பிழைத் திரையைக் காட்டும்.
@@ -2951,7 +2951,7 @@
 
       இந்தக் கொள்கையை  அமைக்காமல் விட்டால், 32 ஆகவுள்ள இயல்புநிலை மதிப்பு பயன்படுத்தப்படும்.</translation>
 <translation id="6943577887654905793">Mac/Linux விருப்பப் பெயர்:</translation>
-<translation id="6944167205014013774">Linux ஆப்ஸின் பயன்பாடு குறித்த தகவல்கள் சேவையகத்திற்குத் திரும்ப அனுப்பப்படும்.
+<translation id="6944167205014013774">Linux ஆப்ஸின் ஆப்ஸ் குறித்த தகவல்கள் சேவையகத்திற்குத் திரும்ப அனுப்பப்படும்.
 
       
 இந்தக் கொள்கை ‘தவறு’ என அமைக்கப்பட்டாலோ அமைக்காமலேயே விடப்பட்டாலோ பயன்பாட்டுத் தகவல் அனுப்பப்படாது. இது ‘சரி’ என அமைக்கப்பட்டால் பயன்பாட்டுத் தகவல் அனுப்பப்படும்.
@@ -3174,7 +3174,7 @@
           இந்தக் கொள்கை அமைக்கப்படாமல் இருந்தால், இயல்பான நேரத்தின் அளவு பயன்படுத்தப்படும்.
 
           கொள்கை மதிப்பை மில்லிவினாடிகளில் மட்டுமே குறிப்பிட வேண்டும். மதிப்புகள் செயலற்ற நிலைக்குக் குறைவாக அல்லது சமமாக இருக்குமாறு அமைக்கப்படும்.</translation>
-<translation id="7329968046053403405"><ph name="HTTP_NEGOTIATE" /> அங்கீகரிப்பை (எ.கா. Kerberos அங்கீகரிப்பு) ஆதரிக்கும் Android அங்கீகரிப்புப் பயன்பாட்டால் வழங்கப்படும் கணக்குகளின் கணக்கு வகையைக் குறிப்பிடும். அங்கீகரிப்புப் பயன்பாட்டை வழங்குபவரிடம் இந்தத் தகவல் கிடைக்க வேண்டும். மேலும் விவரங்களுக்கு https://goo.gl/hajyfN ஐப் பார்க்கவும்.
+<translation id="7329968046053403405"><ph name="HTTP_NEGOTIATE" /> அங்கீகரிப்பை (எ.கா. Kerberos அங்கீகரிப்பு) ஆதரிக்கும் Android அங்கீகரிப்புப் பயன்பாட்டால் வழங்கப்படும் கணக்குகளின் கணக்கு வகையைக் குறிப்பிடும். அங்கீகரிப்பு ஆப்ஸை வழங்குபவரிடம் இந்தத் தகவல் கிடைக்க வேண்டும். மேலும் விவரங்களுக்கு https://goo.gl/hajyfN ஐப் பார்க்கவும்.
 
           அமைப்பு எதுவும் அமைக்கப்படாவிட்டால், Android இல் <ph name="HTTP_NEGOTIATE" /> அங்கீகரிப்பு முடக்கப்பட்டிருக்கும்.</translation>
 <translation id="7331962793961469250">சரி என அமைக்கப்பட்டால், Chrome இணைய அங்காடி பயன்பாடுகளுக்கான விளம்பரங்கள் புதிய தாவல் பக்கத்தில் தோன்றாது. இந்த விருப்பத்தேர்வை தவறு என அமைப்பது அல்லது அமைக்காமல் இருப்பது Chrome இணைய அங்காடி பயன்பாடுகளுக்கான விளம்பரங்களை புதிய தாவல் பக்கத்தில் தோன்றும்படி செய்யும்.</translation>
@@ -3245,7 +3245,7 @@
 <translation id="7519251620064708155">இந்தத் தளங்களில் விசை உருவாக்கத்தை அனுமதி</translation>
 <translation id="7529100000224450960">பாப்அப்களைத் திறக்க அனுமதிக்கின்றன தளங்களைக் குறிக்கும் url வகைகளின் பட்டியலை அமைக்க, உங்களை அனுமதிக்கிறது. இந்தப் பாலிசி அமைக்கப்படாமல் விடப்பட்டிருந்தால் ஒட்டுமொத்த இயல்புநிலை மதிப்பானது, அமைக்கப்பட்டிருந்தால் 'DefaultPopupsSetting' கொள்கை அல்லது பயனரின் தனிப்பட்ட உள்ளமைவிலிருந்து அனைத்து தளங்களுக்கும் பயன்படுத்தப்படும்.</translation>
 <translation id="7529144158022474049">தானாகவே புதுப்பிக்கும் சிதறல் காரணி</translation>
-<translation id="7534199150025803530">இந்தக் கொள்கை Android Google இயக்ககப் பயன்பாட்டில் எந்த மாற்றத்தையும் ஏற்படுத்தாது. செல்லுலார் இணைப்புகள் மூலம் Google இயக்ககத்தின் உபயோகத்தைத் தடுக்க விரும்பினால், Android Google இயக்ககப் பயன்பாட்டை நிறுவுவதை அனுமதிக்கக்கூடாது.</translation>
+<translation id="7534199150025803530">இந்தக் கொள்கை Android Google இயக்ககப் பயன்பாட்டில் எந்த மாற்றத்தையும் ஏற்படுத்தாது. செல்லுலார் இணைப்புகள் மூலம் Google இயக்ககத்தின் உபயோகத்தைத் தடுக்க விரும்பினால், Android Google இயக்கக ஆப்ஸை நிறுவுவதை அனுமதிக்கக்கூடாது.</translation>
 <translation id="7540622499178214923">wilco டயக்னாசிஸ் &amp; டெலிமெட்ரி கண்ட்ரோலரை அனுமதிக்கும்</translation>
 <translation id="7547549430720182663">இணை</translation>
 <translation id="7553535237300701827">இந்தக் கொள்கை அமைக்கப்படும் போது, அமைப்பின் மதிப்பைப் பொறுத்து, உள்நுழைவு அங்கீகரித்தல் செயல்முறையானது பின்வரும் வழிகளில் ஒன்றில் இருக்கும்:
@@ -3426,7 +3426,7 @@
 <translation id="7902255855035461275">இந்தப் பட்டியலில் உள்ள பேட்டர்ன்கள், கோரப்படும் URLலின் பாதுகாப்பு மூலத்துடன் ஒப்பிடப்படும்.  பொருத்தம் கண்டறிப்பட்டால், எந்த அறிவிப்பும் இல்லாமல், வீடியோ எடுக்கும் சாதனங்களுக்கு அணுகல் வழங்கப்படும்.
 
       குறிப்பு: பதிப்பு 45 வரை, கியோஸ்க் பயன்முறையில் மட்டுமே இந்தக் கொள்கை ஆதரிக்கப்பட்டது.</translation>
-<translation id="7912255076272890813">அனுமதிக்கப்படும் பயன்பாடு/நீட்டிப்பு வகைகளை உள்ளமை</translation>
+<translation id="7912255076272890813">அனுமதிக்கப்படும் ஆப்ஸ்/நீட்டிப்பு வகைகளை உள்ளமை</translation>
 <translation id="7922358664346625612">கடைசித் தாவலை Chromeமில் திறந்தே வைத்திருக்கும்.</translation>
 <translation id="793134539373873765">OS புதுப்பிப்பு தரவுகளுக்கு p2p பயன்படுத்தப்பட வேண்டுமா என்பதைக் குறிப்பிடுகிறது. சரி என அமைக்கப்பட்டிருந்தால், LAN இல் புதுப்பிப்பு தரவுகளைச் சாதனங்கள் பகிரும், மேலும் பெறுவதற்கும் முயற்சிக்கும், மேலும் இது இணைய அகலக்கற்றையின் பயன்பாடு மற்றும் நெரிசலைக் குறைக்கும். LAN இல் புதுப்பிப்பு தரவு இல்லையெனில், சாதனம் புதுப்பிப்புச் சாதனத்திலிருந்து பதிவிறக்குவதைக் குறைக்கும். தவறு அல்லது உள்ளமைக்கப்படவில்லை எனில், p2p பயன்படுத்தப்படாது.</translation>
 <translation id="7933141401888114454">மேற்பார்வையிடப்படும் பயனர்களின் உருவாக்கத்தை இயக்கு</translation>
@@ -3534,7 +3534,7 @@
 <translation id="8140204717286305802">வகைகள் மற்றும் வன்பொருள் முகவரிகளுடன் கூடிய நெட்வொர்க் இடைமுகங்களின் பட்டியலைச் சேவையகத்துக்கு அறிக்கையிடவும்.
 
       கொள்கை 'தவறு' என அமைக்கப்பட்டிருந்தால், இடைமுகத்தின் பட்டியல் அறிக்கையிடப்படாது.</translation>
-<translation id="8141795997560411818">பயனர் Android Google இயக்ககப் பயன்பாட்டைப் பயன்படுத்துவதை, இந்தக் கொள்கை தடுக்காது. Google இயக்ககத்திற்கான அணுகலைத் தடுக்க விரும்பினால், நீங்கள் Android Google இயக்ககப் பயன்பாட்டை நிறுவுவதையும் அனுமதிக்கக்கூடாது.</translation>
+<translation id="8141795997560411818">பயனர் Android Google இயக்கக ஆப்ஸைப் பயன்படுத்துவதை, இந்தக் கொள்கை தடுக்காது. Google இயக்ககத்திற்கான அணுகலைத் தடுக்க விரும்பினால், நீங்கள் Android Google இயக்கக ஆப்ஸை நிறுவுவதையும் அனுமதிக்கக்கூடாது.</translation>
 <translation id="8142894094385450823">நிர்வகிக்கப்பட்ட அமர்வுக்கான பரிந்துரைக்கப்பட்ட மொழிகளை அமைக்கும்</translation>
 <translation id="8146727383888924340">Chrome OS பதிவுசெய்தல் மூலம் சலுகைகளைப் பெற பயனர்களை அனுமதிக்கவும்</translation>
 <translation id="8148785525797916822">தற்போது ஆதரிக்கப்படாத கணினியில் அல்லது இயக்க முறைமையில் <ph name="PRODUCT_NAME" /> இயங்கும் போது தோன்றும் எச்சரிக்கையை முடக்கும்.</translation>
@@ -3631,7 +3631,7 @@
           கவனத்திற்கு: <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" /> கொள்கை முடக்கப்பட்டால் இந்தக் கொள்கை புறக்கணிக்கப்படும்.
 
           இந்தக் கொள்கை அமைக்கப்படவில்லை எனில் இந்த அமைப்பு இயக்கப்படும்.</translation>
-<translation id="8382184662529825177">சாதனத்தின் உள்ளடக்கப் பாதுகாப்பிற்கான தொலைநிலைச் சான்றொப்பப் பயன்பாட்டை இயக்கவும்</translation>
+<translation id="8382184662529825177">சாதனத்தின் உள்ளடக்கப் பாதுகாப்பிற்கான தொலைநிலைச் சான்றொப்பப் ஆப்ஸை இயக்கவும்</translation>
 <translation id="838870586332499308">தரவு ரோமிங்கை இயக்கு</translation>
 <translation id="8390049129576938611"><ph name="PRODUCT_NAME" /> இல் அக PDF வியூவரை முடக்கும். அதற்குப் பதிலாக, அதைப் பதிவிறக்கமாகக் கருதி, இயல்புப் பயன்பாட்டில் PDF கோப்புகளைத் திறக்க பயனரை அனுமதிக்கும்.
 
@@ -4047,7 +4047,7 @@
 
       சாதன வால்பேப்பர் கொள்கை அமைக்கப்படவில்லை எனில், பயனரின் வால்பேப்பர் கொள்கை அமைக்கப்பட்டிருந்தால் எதைக் காட்ட வேண்டும் என்பதைப் பயனரின் வால்பேப்பர் கொள்கைதான் முடிவெடுக்க வேண்டும்.</translation>
 <translation id="9217154963008402249">கண்காணிக்கப்படும் நெட்வொர்க் பாக்கெட்டுகள் அனுப்பப்படும் கால இடைவெளி</translation>
-<translation id="922540222991413931">நீட்டிப்பு, பயன்பாடு, பயனர் ஸ்கிரிப்ட் நிறுவல் ஆதாரங்களை உள்ளமை</translation>
+<translation id="922540222991413931">நீட்டிப்பு, ஆப்ஸ், பயனர் ஸ்கிரிப்ட் நிறுவல் ஆதாரங்களை உள்ளமை</translation>
 <translation id="924557436754151212">முதல் இயக்கத்தின்போதே இயல்புநிலை உலாவலிருந்து சேமித்த கடவுச்சொற்களை இறக்குமதி செய்</translation>
 <translation id="926146562923985266">Internet Explorerரில் இருந்து மாறும் போது <ph name="PRODUCT_NAME" />ல் உள்ள URLகளைத் திறப்பதற்குப் பயன்படுத்தப்படும் கட்டளையை இந்தக் கொள்கை கட்டுப்படுத்தும்.
 
diff --git a/components/policy/resources/policy_templates_te.xtb b/components/policy/resources/policy_templates_te.xtb
index 6870370..592dee1 100644
--- a/components/policy/resources/policy_templates_te.xtb
+++ b/components/policy/resources/policy_templates_te.xtb
@@ -54,6 +54,13 @@
 <translation id="1049138910114524876"><ph name="PRODUCT_OS_NAME" /> సైన్-ఇన్ స్క్రీన్‌లో అమలు చేయాల్సిన లొకేల్‌ను కాన్ఫిగర్ చేస్తుంది.
 
       ఈ విధానాన్ని సెట్ చేస్తే, సైన్-ఇన్ స్క్రీన్ ఎప్పుడూ ఈ విధానం యొక్క మొదటి విలువ (విధానం ఫార్వర్డ్ అనుకూలత కోసం జాబితా లాగా నిర్వచించబడుతుంది) ద్వారా అందించబడే లొకేల్‌లో ప్రదర్శించబడుతుంది. ఈ విధానాన్ని సెట్ చేయకుంటే లేదా ఖాళీ జాబితాకు సెట్ చేస్తే, సైన్-ఇన్ స్క్రీన్ చివరి వినియోగదారు సెషన్ యొక్క లొకేల్‌లో ప్రదర్శించబడుతుంది. ఈ విధానాన్ని చెల్లని లొకేల్ విలువకు సెట్ చేస్తే, సైన్-ఇన్ స్క్రీన్ డిఫాల్ట్ లొకేల్‌లో (ప్రస్తుతం, en-US) ప్రదర్శించబడుతుంది.</translation>
+<translation id="1052499923181221200">SamlInSessionPasswordChangeEnabled ఎంపికను ఒప్పునకు సెట్ చేస్తే మినహా, ఈ విధానం ఎలాంటి ప్రభావం చూపదు.
+      ఆ విధానం ఒప్పు అయితే మరియు ఈ విధానాన్ని (ఉదాహరణకు) 14కు సెట్ చేస్తే, SAML వినియోగదారులకు తమ పాస్‌వర్డ్ గడువు నిర్ణీత తేదీన ముగుస్తుందని తెలిపే సందేశం గడువు ముగియడానికి 14 రోజుల ముందుగా పంపబడుతుంది.
+      ఆపై వారు దీనిపై వెంటనే చర్య తీసుకుంటూ, సెషన్ సమయంలో పాస్‌వర్డ్ మార్పును అమలు చేసి, తమ పాస్‌వర్డ్‌ను గడువు ముగియడానికి ముందే అప్‌డేట్ చేసుకోవచ్చు.
+      కానీ, పాస్‌వర్డ్ గడువు ముగింపు సమాచారం SAML లాగిన్ నిర్వహణ సమయంలో SAML గుర్తింపు ప్రదాత ద్వారా పరికరానికి పంపబడినప్పుడు మాత్రమే ఈ నోటిఫికేషన్‌లు చూపబడతాయి.
+      ఈ విధానాన్ని సున్నాకు సెట్ చేస్తే, వినియోగదారులకు ముందస్తుగా తెలియజేయబడదు - వారికి ఆ పాస్‌వర్డ్ గడువు ముగిసిపోయిన తర్వాత మాత్రమే తెలియజేయబడుతుంది.
+
+      ఈ విధానాన్ని సెట్ చేసినప్పుడు, వినియోగదారు దీనిని మార్చలేరు లేదా భర్తీ చేయలేరు.</translation>
 <translation id="1062011392452772310">పరికరం కోసం రిమోట్ ధృవీకరణను ప్రారంభించండి</translation>
 <translation id="1062407476771304334">భర్తీ చేయి</translation>
 <translation id="1079801999187584280">డెవలపర్ సాధనాల వినియోగాన్ని నిరాకరించండి</translation>
@@ -211,6 +218,7 @@
       ఒకవేళ విధానాన్ని ప్రారంభిస్తే, స్క్రీన్ సందర్భాన్ని యాక్సెస్ చేయడానికి Google అసిస్టెంట్ అనుమతించబడుతుంది.
       ఒకవేళ విధానాన్ని నిలిపివేస్తే, స్క్రీన్ సందర్భాన్ని యాక్సెస్ చేయడానికి Google అసిస్టెంట్ అనుమతించబడదు.
       ఏదీ సెట్ చేయకుంటే, స్క్రీన్ సందర్భాన్ని యాక్సెస్ చేయడానికి Google అసిస్టెంట్‌ను అనుమతించాలో లేదో వినియోగదారులు నిర్ణయించుకోవచ్చు</translation>
+<translation id="1376119291123231789">అధునాతన బ్యాటరీ ఛార్జ్ మోడ్‌ను ప్రారంభించండి</translation>
 <translation id="1383493480903114193">బ్రౌజర్ ప్రాసెస్‌లోనే అమలు చేయమని ఈ విధానం నెట్‌వర్కింగ్ కోడ్‌ను ఒత్తిడి చేస్తుంది.
 
       ఈ విధానం డిఫాల్ట్‌గా నిలిపివేయబడుతుంది, ఇది ప్రారంభించబడితే గనుక, నెట్‌వర్క్ ప్రాసెస్ శాండ్‌బాక్స్ చేసిన తర్వాత వినియోగదారు యొక్క భద్రతా సమస్యలకు బాధ్యత వహించదు.
@@ -303,6 +311,18 @@
 <translation id="1477934438414550161">TLS 1.2</translation>
 <translation id="1502843533062797703">మూడవ పక్షం సాఫ్ట్‌వేర్ చొప్పింపు బ్లాకింగ్‌ను ప్రారంభించండి</translation>
 <translation id="1504431521196476721">రిమోట్ ధృవీకరణ</translation>
+<translation id="1507382822467487898">
+          పరికరానికి ఒక డాక్‌ను కనెక్ట్ చేసినప్పుడు ఉపయోగించబడే MAC (మీడియా యాక్సెస్ కంట్రోల్) చిరునామాను కన్ఫిగర్ చేస్తుంది.
+
+          ఒక డాక్‌ను కొన్ని పరికర మోడల్‌లకు కనెక్ట్ చేసినప్పుడు, ఈథర్‌నెట్‌లో పరికరాన్ని డిఫాల్ట్‌గా గుర్తించడానికి పరికరానికి కేటాయించబడిన డాక్ MAC చిరునామా ఉపయోగించబడుతుంది. డాక్ చేసినప్పుడు, MAC చిరునామా మూలాధారాన్ని మార్చడానికి ఈ విధానం నిర్వాహకుడిని అనుమతిస్తుంది.
+
+          'DeviceDockMacAddress'ను ఎంచుకుంటే లేదా ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, పరికరానికి కేటాయించబడిన డాక్ MAC చిరునామా ఉపయోగించబడుతుంది.
+
+          'DeviceNicMacAddress'ను ఎంచుకుంటే, పరికరం యొక్క NIC (నెట్‌వర్క్ ఇంటర్‌ఫేస్ కంట్రోలర్) MAC చిరునామా ఉపయోగించబడుతుంది.
+
+          'DockNicMacAddress'ను ఎంచుకుంటే, డాక్ యొక్క NIC MAC చిరునామా ఉపయోగించబడుతుంది.
+
+          ఈ సెట్టింగ్‌ను వినియోగదారు మార్చలేరు.</translation>
 <translation id="1507957856411744193">ఈ విధానాన్ని ఒప్పు అని సెట్ చేస్తే, <ph name="PRODUCT_NAME" /> కేవలం RFC1918/RFC4913 ప్రైవేట్ చిరునామాలకు మాత్రమే కాకుండా, అన్ని IP చిరునామాలలో ఉన్న ప్రసార పరికరాలకు కనెక్ట్ చేస్తుంది.
 
           ఈ విధానాన్ని తప్పు అని సెట్ చేస్తే, <ph name="PRODUCT_NAME" /> కేవలం RFC1918/RFC4913 ప్రైవేట్ చిరునామాలలో ఉన్న, ప్రసార పరికరాలకు మాత్రమే కనెక్ట్ చేస్తుంది.
@@ -728,6 +748,17 @@
 <translation id="2303795211377219696">క్రెడిట్ కార్డ్‌ల కోసం స్వీయపూరింపును ప్రారంభించండి</translation>
 <translation id="2309390639296060546">డిఫాల్ట్ జియోస్థానం సెట్టింగ్</translation>
 <translation id="2327252517317514801">G Suite యాక్సెస్ చేయడానికి అనుమతించే డొమైన్‌లను నిర్వచించండి</translation>
+<translation id="2356878440219553005">బ్యాటరీ ఛార్జ్ మోడ్ పవర్ నిర్వహణ విధానాన్ని పేర్కొంటుంది.
+
+          బ్యాటరీపై అధిక భారం పడటం వలన బ్యాటరీ జీవిత కాలం క్షీణించే పరిస్థితిని వీలైనంత మేరకు తగ్గించడానికి బ్యాటరీ ఛార్జింగ్‌ను డైనమిక్‌గా నియంత్రిస్తుంది మరియు బ్యాటరీ జీవిత కాలాన్ని పొడిగిస్తుంది.
+
+          అనుకూల బ్యాటరీ ఛార్జ్ మోడ్‌ను ఎంచుకుంటే, ఆపై DeviceBatteryChargeCustomStartCharging మరియు DeviceBatteryChargeCustomStopChargingను తప్పక పేర్కొనాలి.
+
+          ఈ విధానాన్ని సెట్ చేస్తే, పరికరంలో మద్దతు ఉండే పక్షంలో బ్యాటరీ ఛార్జ్ మోడ్ వర్తింపజేయబడుతుంది.
+
+          ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే మరియు పరికరంలో విధానానికి మద్దతు ఉంటే, ప్రామాణిక బ్యాటరీ ఛార్జ్ మోడ్ వర్తింపజేయబడుతుంది మరియు వినియోగదారు దీన్ని మార్చలేరు.
+
+          గమనిక: దీని కంటే వేరే విధానం ఏదైనా పేర్కొని ఉంటే, <ph name="DEVICE_ADVANCED_BATTERY_CHARGE_MODE_ENABLED_NAME" /> ఈ విధానాన్ని భర్తీ చేస్తుంది.</translation>
 <translation id="237494535617297575">ప్రకటనలను ప్రదర్శించడానికి అనుమతించబడే సైట్‌లను పేర్కొనే url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఈ విధానం సెట్ చేయకుండా వదిలి పెడితే అన్ని సైట్‌లకు గ్లోబల్ డిఫాల్ట్ విలువ అనేది, 'DefaultNotificationsSetting' విధానం నుండి (సెట్ చేయబడి ఉంటే) లేదా వినియోగదారు వ్యక్తిగత కాన్ఫిగరేషన్ నుండి ఉపయోగించబడుతుంది.</translation>
 <translation id="2386362615870139244">స్క్రీన్‌ను సాధారణ స్థితికి తీసుకువచ్చే లాక్‌లను అనుమతించండి</translation>
 <translation id="2411817661175306360">పాస్‌వర్డ్ రక్షణ హెచ్చరిక ఆఫ్‌లో ఉంది</translation>
@@ -763,6 +794,7 @@
 
       ఈ విధానాన్ని తప్పునకు సెట్ చేస్తే, సున్నా-ఆలస్యపు స్వీయ-లాగిన్ (కాన్ఫిగర్ చేసి ఉంటే) తప్పించబడదు.</translation>
 <translation id="2454228136871844693">స్థిరత్వం కోసం ఆప్టిమైజ్ చేయండి.</translation>
+<translation id="2463034609187171371">TLSలో DHE సైఫర్ సూట్‌లను ప్రారంభించండి</translation>
 <translation id="2463365186486772703">అప్లికేషన్ లొకేల్</translation>
 <translation id="2466131534462628618">క్యాప్టివ్ పోర్టల్ ప్రామాణీకరణ ప్రాక్సీని విస్మరిస్తుంది</translation>
 <translation id="2482676533225429905">స్థానిక సందేశ పద్ధతి</translation>
@@ -932,6 +964,7 @@
 <translation id="2769952903507981510">రిమోట్ యాక్సెస్ హోస్ట్‌ల కోసం అవసరమైన డొమైన్ పేరును కాన్ఫిగర్ చేస్తుంది</translation>
 <translation id="2787173078141616821">Android స్థితిని గురించి సమాచారాన్ని నివేదిస్తుంది</translation>
 <translation id="2799297758492717491">URL నమూనాల వైట్‌లిస్ట్‌లో మీడియా స్వీయ ప్లేని అనుమతించండి</translation>
+<translation id="2801155097555584385">బ్యాటరీ ఛార్జ్ ఎంత శాతం వద్ద ఉన్నప్పుడు ఛార్జింగ్‌ను ప్రారంభించాలో సెట్ చేయండి</translation>
 <translation id="2801230735743888564">పరికరం ఆఫ్‌లైన్‌లో ఉన్నప్పుడు డైనోసార్ ఈస్టర్ ఎగ్ గేమ్ ఆడటానికి వినియోగదారులను అనుమతిస్తుంది.
 
       ఈ విధానాన్ని 'తప్పు'గా సెట్ చేస్తే, పరికరం ఆఫ్‌లైన్‌లో ఉన్నప్పుడు వినియోగదారులు డైనోసార్ ఈస్టర్ ఎగ్ గేమ్ ఆడలేరు. ఈ సెట్టింగ్‌ను 'ఒప్పు'గా సెట్ చేస్తే, వినియోగదారులు డైనోసార్ గేమ్‌ను ఆడటానికి అనుమతించబడతారు. ఈ విధానాన్ని సెట్ చేయకుంటే, వినియోగదారులు డైనోసార్ ఈస్టర్ ఎగ్ గేమ్‌ను నమోదు చేయబడిన Chrome OSలో ఆడటానికి అనుమతించబడరు, కానీ ఇతర పరిస్థితులలో దీనిని ఆడటానికి అనుమతించబడతారు.</translation>
@@ -1005,6 +1038,7 @@
       మీరు ఈ సెట్టింగ్‌ను నిలిపివేస్తే లేదా విలువను సెట్ చేయకపోతే, ప్రింట్ ప్రివ్యూ ఇటీవల ఉపయోగించిన ప్రింటర్‌ను డిఫాల్ట్ గమ్యస్థాన ఎంపికగా ఉపయోగిస్తుంది.
 
       మీరు ఈ సెట్టింగ్‌ను ప్రారంభిస్తే, ప్రింట్ ప్రివ్యూ OS సిస్టమ్ డిఫాల్ట్ ప్రింటర్‌ను డిఫాల్ట్ గమ్యస్థాన ఎంపికగా ఉపయోగిస్తుంది.</translation>
+<translation id="285627849510728211">అధునాతన బ్యాటరీ ఛార్జ్ మోడ్ రోజు కన్ఫిగరేషన్‌ను సెట్ చేయండి</translation>
 <translation id="2856674246949497058">OS వెర్షన్, లక్ష్యం కన్నా కొత్తదైతే, ఉపసంహరించండి మరియు లక్ష్య వెర్షన్‌లోనే ఉండండి. ప్రాసెస్ సమయంలో పవర్‌వాష్ చేయండి.</translation>
 <translation id="2872961005593481000">షట్ డౌన్ చెయ్యండి</translation>
 <translation id="2873651257716068683">డిఫాల్ట్ ముద్రణ పేజీ పరిమాణాన్ని భర్తీ చేస్తుంది. పేజీ పరిమాణం అందుబాటులో లేకపోతే ఈ విధానం విస్మరించబడుతుంది.</translation>
@@ -1134,12 +1168,26 @@
 <translation id="3072045631333522102">రిటైల్ మోడ్‌లో సైన్-ఇన్ స్క్రీన్‌లో ఉపయోగించాల్సిన స్క్రీన్ సేవర్</translation>
 <translation id="3072847235228302527">పరికరం-స్థానిక ఖాతా కోసం సేవా నిబంధనలను సెట్ చేయడం</translation>
 <translation id="3077183141551274418">ట్యాబ్‌ లైఫ్‌సైకిల్‌లను ప్రారంభించండి లేదా నిలిపివేయండి</translation>
+<translation id="3079417254871857650">ecryptfs ఎన్‌క్రిప్షన్‌తో వినియోగదారు హోమ్ డైరెక్టరీని సృష్టించినప్పుడు తీసుకోవాల్సిన చర్యను పేర్కొంటుంది.
+
+      మీరు ఈ విధానాన్ని 'DisallowArc' అని సెట్ చేస్తే, వినియోగదారు కోసం Android యాప్‌లు నిలిపివేయబడతాయి మరియు ecryptfs నుండి ext4 ఎన్‌క్రిప్షన్‌కు తరలింపు జరగదు. హోమ్ డైరెక్టరీని ఇప్పటికే ext4 ఎన్‌క్రిప్ట్ చేసినప్పుడు, Android యాప్‌లు అమలు కాకుండా నిరోధించబడవు.
+
+      మీరు ఈ విధానాన్ని 'Migrate' అని సెట్ చేస్తే, సైన్ ఇన్ చేసినప్పుడు, వినియోగదారు సమ్మతిని కోరకుండా ecryptfs ఎన్‌క్రిప్ట్ చేసిన హోమ్ డైరెక్టరీలు ఆటోమేటిక్‌గా ext4 ఎన్‌క్రిప్షన్‌కు తరలించబడతాయి.
+
+      మీరు ఈ విధానాన్ని 'Wipe' అని సెట్ చేస్తే, సైన్ ఇన్ చేసినప్పుడు ecryptfs ఎన్‌క్రిప్ట్ చేసిన హోమ్ డైరెక్టరీలు తొలగించబడతాయి, అలాగే వీటికి బదులుగా కొత్త ext4 ఎన్‌క్రిప్ట్ చేసిన హోమ్ డైరెక్టరీలు సృష్టించబడతాయి. హెచ్చరిక: ఇది వినియోగదారు స్థానిక డేటాను తీసివేస్తుంది.
+
+      మీరు ఈ విధానాన్ని 'MinimalMigrate' అని సెట్ చేస్తే, సైన్ ఇన్ చేసినప్పుడు ecryptfs ఎన్‌క్రిప్ట్ చేసిన హోమ్ డైరెక్టరీలు తొలగించబడతాయి, అలాగే వీటికి బదులుగా కొత్త ext4 ఎన్‌క్రిప్ట్ చేసిన హోమ్ డైరెక్టరీలు సృష్టించబడతాయి. అయితే, వినియోగదారు మళ్లీ సైన్ ఇన్ చేయాల్సిన అవసరం రాకుండా లాగిన్ టోకెన్‌లను నిల్వ చేయడం ప్రయత్నించబడుతుంది. హెచ్చరిక: ఇది వినియోగదారు స్థానిక డేటాను తీసివేస్తుంది.
+
+      మీరు ఈ విధానాన్ని ప్రస్తుతం మద్దతు లేని ('AskUser' లేదా 'AskForEcryptfsArcUsers') ఎంపికకు సెట్ చేస్తే, మీరు దీనికి బదులుగా 'Migrate' ఎంచుకున్నట్లే పరిగణించబడుతుంది.
+
+      కియోస్క్ వినియోగదారులకు ఈ విధానం వర్తించదు. ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, 'DisallowArc' అని ఎంచుకున్న విధంగా పరికరం ప్రవర్తిస్తుంది.</translation>
 <translation id="3086995894968271156"><ph name="PRODUCT_NAME" />లో Cast రిసీవర్‌ను కాన్ఫిగర్ చేయండి.</translation>
 <translation id="3088796212846734853">చిత్రాలను ప్రదర్శించడానికి అనుమతించబడిన సైట్‌లను పేర్కొనే url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది.
 
           ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే 'DefaultImagesSetting' విధానం సెట్ చేయబడి ఉంటే దాని నుండి లేదంటే వినియోగదారు యొక్క వ్యక్తిగత కాన్ఫిగరేషన్ నుండి గ్లోబల్ డిఫాల్ట్ విలువ అన్ని సైట్‌ల కోసం ఉపయోగించబడుతుంది.
 
           గతంలో ఈ విధానం Androidలో పొరపాటున ప్రారంభించబడింది, కానీ Androidలో దీనికి ఎప్పుడూ పూర్తి మద్దతు లేదు.</translation>
+<translation id="3091832372132789233">ప్రాథమికంగా బయటి పవర్ సోర్స్‌కు కనెక్ట్ చేయబడిన పరికరాలకు బ్యాటరీని ఛార్జ్ చేయండి.</translation>
 <translation id="3096595567015595053">ప్రారంభించబడిన ప్లగ్‌ఇన్‌ల జాబితా</translation>
 <translation id="3101501961102569744">ప్రాక్సీ సర్వర్ సెట్టింగ్‌లను ఎలా పేర్కొనాలో ఎంచుకోండి</translation>
 <translation id="3101709781009526431">తేదీ మరియు సమయం</translation>
@@ -1165,6 +1213,7 @@
 ఈ సెట్టింగ్‌ను నిలిపివేస్తే అప్పుడు <ph name="PRODUCT_NAME" /> సిస్టమ్ స్థాయిలో ఇన్‌స్టాల్ చేసిన స్థానిక సందేశ హోస్ట్‌లను మాత్రమే ఉపయోగిస్తుంది.
 
 ఈ సెట్టింగ్‌ను సెట్ చేయకుండా వదిలేస్తే <ph name="PRODUCT_NAME" /> వినియోగదారు స్థాయి స్థానిక సందేశ హోస్ట్‌ల వినియోగాన్ని అనుమతిస్తుంది.</translation>
+<translation id="3177802893484440532">స్థానిక విశ్వసనీయ యాంకర్‌ల కోసం ఆన్‌లైన్ OCSP/CRL తనిఖీలు చేయడం అవసరం</translation>
 <translation id="3185009703220253572"><ph name="SINCE_VERSION" />వ వెర్షన్ నుండి</translation>
 <translation id="3187220842205194486">Android యాప్‌లు కార్పొరేట్ కీలను యాక్సెస్ చేయలేవు. ఈ విధానం వాటిపై ఎలాంటి ప్రభావాన్ని చూపదు.</translation>
 <translation id="3205825995289802549">మొదటి అమలులో మొదటి బ్రౌజర్ విండోను గ‌రిష్ఠ స్థాయిలో విస్త‌రిస్తుంది</translation>
@@ -1174,6 +1223,7 @@
 <translation id="3220624000494482595">కియోస్క్ యాప్ కనుక Android యాప్ అయితే, ఈ విధానాన్ని <ph name="TRUE" />కు సెట్ చేసినప్పటికీ, అది <ph name="PRODUCT_OS_NAME" /> వెర్షన్‌ను నియంత్రించదు.</translation>
 <translation id="3236046242843493070">దీని నుండి ఎక్స్‌టెన్ష‌న్‌ను, యాప్‌ను మరియు వినియోగదారు స్క్రిప్ట్ ఇన్‌స్టాల్‌లను అనుమతించడానికి URL నమూనాలు</translation>
 <translation id="3240609035816615922">ప్రింటర్ కాన్ఫిగరేషన్ యాక్సెస్ విధానం.</translation>
+<translation id="3240655340884151271">డాక్ అంతర్నిర్మిత NIC MAC చిరునామా</translation>
 <translation id="3243309373265599239">AC పవర్‌తో అమలవుతున్నప్పుడు ఎంత సమయం పాటు వినియోగదారు ఇన్‌పుట్ లేకుంటే స్క్రీన్ మసకబారుతుందో పేర్కొంటుంది.
 
           ఈ విధానాన్ని సున్నా కంటే ఎక్కువ విలువకు సెట్ చేసినప్పుడు, ఇది <ph name="PRODUCT_OS_NAME" /> స్క్రీన్‌‍ను మసకబరచడానికి ముందు తప్పనిసరిగా వినియోగదారు ఎంత సమయం పాటు ఇన్‌యాక్టివ్‌గా ఉండాలో పేర్కొంటుంది.
@@ -1195,6 +1245,12 @@
       ఈ సెట్టింగ్ ప్రారంభించబడినా లేదా కాన్ఫిగర్ చేయకపోయినా, వినియోగదారులు వారి Google ఖాతాతో ప్రామాణీకరణ ద్వారా క్లౌడ్ ప్రింట్‌ ప్రాక్సీని ప్రారంభించవచ్చు.
 
       ఈ సెట్టింగ్‌ను నిలిపివేస్తే, వినియోగదారులు ప్రాక్సీని ప్రారంభించలేరు. మెషీన్ దాని ప్రింటర్‌లను <ph name="CLOUD_PRINT_NAME" />తో షేర్‌ చేయడానికి అనుమతించబడదు.</translation>
+<translation id="3312206664202507568">SAML వినియోగదారులు సెషన్‌లో ఉన్నప్పుడు తమ SAML పాస్‌వర్డ్‌లను మార్చుకోగలిగే పేజీని chrome://password-changeలో ప్రారంభిస్తుంది, అలాగే SAML పాస్‌వర్డ్, పరికర లాక్‌స్క్రీన్ పాస్‌వర్డ్ తప్పక సింక్‌లో ఉంటాయని ఇది నిర్ధారిస్తుంది.
+
+      అలాగే, SAML వినియోగదారులకు తమ SAML పాస్‌వర్డ్‌ల గడువు ముగియనున్న సమయంలో ఆ సంగతి హెచ్చరించే నోటిఫికేషన్‌లను కూడా ఈ విధానం ప్రారంభిస్తుంది, ఆపై వారు వెంటనే దానిపై చర్య తీసుకుంటూ, సెషన్ సమయంలో పాస్‌వర్డ్ మార్పును అమలు చేయగలరు.
+      కానీ, పాస్‌వర్డ్ గడువు ముగింపు సమాచారం SAML లాగిన్ నిర్వహణ సమయంలో SAML గుర్తింపు ప్రదాత ద్వారా పరికరానికి పంపబడినప్పుడు మాత్రమే ఈ నోటిఫికేషన్‌లు చూపబడతాయి.
+
+      ఈ విధానాన్ని సెట్ చేసినప్పుడు, వినియోగదారు దీనిని మార్చలేరు లేదా భర్తీ చేయలేరు.</translation>
 <translation id="3322771899429619102">కీ ఉత్పాదనను ఉపయోగించడానికి అనుమతించబడే సైట్‌లను పేర్కొనే url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఒకవేళ url నమూనా 'KeygenBlockedForUrls'లో ఉంటే, అది ఈ మినహాయింపులను భర్తీ చేస్తుంది.
 
           ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, అన్ని సైట్‌ల కోసం 'DefaultKeygenSetting' విధానం సెట్ చేసి ఉంటే దాని నుండి లేదా వినియోగదారు వ్యక్తిగత కాన్ఫిగరేషన్ నుండి గ్లోబల్ డిఫాల్ట్ విలువ ఉపయోగించబడుతుంది.</translation>
@@ -1280,6 +1336,7 @@
 
           ఈ విధానాన్ని 'తప్పు'గా సెట్ చేస్తే లేదా ఏదీ సెట్ చేయకపోతే, సెషన్ ప్రారంభమైన వెంటనే పవర్ నిర్వహణ ఆలస్యాలు మరియు సెషన్ వ్యవధి పరిమితులు అమలు కావడం ప్రారంభమవుతుంది.</translation>
 <translation id="3478024346823118645">సైన్-అవుట్‌లో వినియోగదారు డేటాను తుడిచివేయి</translation>
+<translation id="3480961938508521469">ప్రామాణిక సగటుతో బ్యాటరీ పూర్తిగా ఛార్జ్ చేయండి.</translation>
 <translation id="348495353354674884">వర్చువల్ కీబోర్డ్‌ను ప్రారంభించు</translation>
 <translation id="3487623755010328395">
         ఈ విధానాన్ని సెట్ చేస్తే, <ph name="PRODUCT_NAME" /> స్వయంగా నమోదు చేయడానికి, అన్ని ప్రొఫైల్‌లతో అనుబంధించబడిన క్లౌడ్ విధానాన్ని వర్తింపజేయడానికి ప్రయత్నిస్తుంది.
@@ -1323,6 +1380,8 @@
 <translation id="3547954654003013442">ప్రాక్సీ సెట్టింగ్‌లు</translation>
 <translation id="355118380775352753">ప్రత్యామ్నాయ బ్రౌజర్‌లో తెరిచే వెబ్‌సైట్‌లు</translation>
 <translation id="3554984410014457319">వాయిస్ యాక్టివేషన్ పదబంధాన్ని వినడానికి Google అసిస్టెంట్‌ను అనుమతించండి</translation>
+<translation id="356579196325389849">వినియోగదారులు Chrome OS విడుదల ఛానెల్‌ను కన్ఫిగర్ చేయవచ్చు</translation>
+<translation id="3575011234198230041">HTTP ప్రామాణీకరణ</translation>
 <translation id="3577251398714997599">అనుచిత ప్రకటనల సైట్‌ల కోసం ప్రకటనల సెట్టింగ్</translation>
 <translation id="357917253161699596">వినియోగదారు సర్టిఫికెట్‌లను నిర్వహించడానికి వినియోగదారులను అనుమతించండి</translation>
 <translation id="3583230441447348508">ముందుగా కాన్ఫిగర్ చేసిన నెట్‌వర్క్ ఫైల్ షేర్‌ల జాబితాను పేర్కొంటుంది.
@@ -1353,6 +1412,7 @@
 
         ఈ విధానం డెస్క్‌టాప్‌లో మెషీన్ పరిధి గల క్లౌడ్ విధాన నమోదు ద్వారా ఉపయోగించబడుతుంది, దీనిని Windowsలోని రిజిస్ట్రీ లేదా GPO, Macలోని plist మరియు Linuxలోని JSON విధాన ఫైల్ ద్వారా సెట్ చేయవచ్చు.</translation>
 <translation id="3660562134618097814">లాగిన్ సమయంలో SAML IdP కుక్కీలను బదిలీ చేస్తుంది</translation>
+<translation id="3668151900457104753">బ్లాక్‌లిస్ట్ చేసిన ఎక్స్‌టెన్షన్‌లను అన్ఇన్‌స్టాల్ చేయండి</translation>
 <translation id="3701121231485832347"><ph name="MS_AD_NAME" /> నిర్వహిత <ph name="PRODUCT_OS_NAME" /> పరికరాలకు నిర్దిష్టమైన సెట్టింగ్‌లను నియంత్రిస్తుంది.</translation>
 <translation id="3702647575225525306"><ph name="POLICY_NAME" /> (ఏక-పంక్తి ఫీల్డ్ విస్మరించబడింది, ఇది భవిష్యత్తులో తీసివేయబడుతుంది. దయచేసి కింద ఉన్న బహుళ పంక్తి వచన పెట్టెను ఉపయోగించడం ప్రారంభించండి.)</translation>
 <translation id="3709266154059827597">ఎక్స్‌టెన్ష‌న్‌ ఇన్‌స్ట‌లేష‌న్‌ బ్లాక్‌లిస్ట్‌ను కాన్ఫిగర్ చేయి</translation>
@@ -1434,6 +1494,16 @@
           ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, స్క్రీన్‌లో కీబోర్డ్ ప్రారంభంలో నిలిపివేయబడుతుంది కానీ వినియోగదారు ఎప్పుడైనా ప్రారంభించవచ్చు.</translation>
 <translation id="382476126209906314">రిమోట్ యాక్సెస్ హోస్ట్‌ల కోసం TalkGadget ఆదిప్రత్యయాన్ని కాన్ఫిగర్ చేస్తుంది</translation>
 <translation id="3824972131618513497">పవర్ నిర్వహణ, రీబూట్ సంబంధిత సెట్టింగ్‌లను నియంత్రిస్తుంది.</translation>
+<translation id="3826475866868158882">Google స్థాన సేవలు ప్రారంభించబడ్డాయి</translation>
+<translation id="3831054243924627613">ఈ విధానం Android బ్యాకప్ మరియు పునరుద్ధరణ ప్రాథమిక స్థితిని నియంత్రిస్తుంది.
+
+      ఈ విధానాన్ని కన్ఫిగర్ చేయకుంటే లేదా <ph name="BR_DISABLED" />కు సెట్ చేస్తే, Android బ్యాకప్ మరియు పునరుద్ధరణ ప్రక్రియ ప్రాథమికంగా నిలిపివేయబడుతుంది.
+
+      అలాగే, ఈ విధానాన్ని <ph name="BR_ENABLED" />కు సెట్ చేస్తే, Android బ్యాకప్ మరియు పునరుద్ధరణ ప్రాథమికంగా ప్రారంభించబడుతుంది.
+
+      ఈ విధానాన్ని <ph name="BR_UNDER_USER_CONTROL" />కు సెట్ చేస్తే, Android బ్యాకప్ మరియు పునరుద్ధరణను ఉపయోగించాలో లేదో వినియోగదారు ఎంచుకునేలా అడగబడతారు. వినియోగదారు బ్యాకప్ మరియు పునరుద్ధరణను ప్రారంభించినట్లయితే, Android యాప్ డేటా అంతా Android బ్యాకప్ సర్వర్‌లకు అప్‌లోడ్ చేయబడుతుంది, అలాగే అనుకూల యాప్‌ల కోసం యాప్ రీ-ఇన్‌స్టాలేషన్‌ల సమయంలో వాటి నుండి పునరుద్ధరించబడుతుంది.
+
+      ఈ విధానం Android బ్యాకప్ మరియు పునరుద్ధరణ స్థితిని ప్రాథమిక సెటప్ దశలో మాత్రమే నియంత్రిస్తుందని గుర్తుంచుకోండి. ఆ తర్వాత కూడా వినియోగదారు Android సెట్టింగ్‌లను తెరిచి, Android బ్యాకప్ మరియు పునరుద్ధరణను ఆన్/ఆఫ్ చేయవచ్చు.</translation>
 <translation id="3831376478177535007">ఈ సెట్టింగ్‌ను ప్రారంభించినట్లయితే, <ph name="PRODUCT_NAME" /> Symantec Corporation యొక్క Legacy PKI ఆపరేషన్స్ ద్వారా జారీ చేయబడిన సర్టిఫికెట్‌లను విశ్వసించడానికి అనుమతిస్తుంది, అయితే అవి విజయవంతంగా ధృవీకరించబడాలి మరియు CA సర్టిఫికెట్‌కు అనుబంధంగా ఉండాలి.
 
       ఆపరేటింగ్ సిస్టమ్‌ ఇప్పటికీ Symantec యొక్క లెగసీ ఇన్‌ఫ్రాస్ట్రక్చర్ జారీ చేసిన సర్టిఫికెట్‌లను గుర్తించడం పై ఈ విధానం ఆధారపడి ఉంటుందని గమనించండి. OS అప్‌డేట్ కారణంగా అటువంటి సర్టిఫికెట్‌ల OS నిర్వహణ మారినట్లయితే, ఆపై ఈ విధానం ప్రభావం చూపదు. ఆ తర్వాత, లెగసీ Symantec సర్టిఫికెట్‌ల నుండి మార్పిడి చేయడం కోసం ఎంటర్‌ప్రైజ్‌లకు మరింత సమయం ఇవ్వడం కోసం ఈ విధంగా ఒక తాత్కాలిక సేవ లాగా అందుబాటులో ఉంటుంది. 1 జనవరి 2019న లేదా కొంచెం అటుఇటుగా ఈ విధానం తీసివేయబడుతుంది.
@@ -1514,6 +1584,15 @@
 
           సెట్ చేయకపోతే లేదా తప్పున‌కు సెట్ చేస్తే, అప్పుడు వినియోగదారులు Google డిస్క్‌కు ఫైల్‌లను బదిలీ చేయగలరు.</translation>
 <translation id="3915395663995367577">ప్రాక్సీ .pac ఫైల్‌కి URL</translation>
+<translation id="3920892052017026701">బ్యాటరీ ఛార్జ్ ఎంత శాతం వద్ద ఉన్నప్పుడు ఛార్జింగ్‌ను ప్రారంభించాలో సెట్ చేయండి.
+
+          బ్యాటరీ ఛార్జ్ పేర్కొన్న ప్రారంభ ఛార్జింగ్ విలువకు చేరుకున్నప్పుడు బ్యాటరీ ఛార్జింగ్ ప్రారంభమవుతుంది.
+
+          DeviceBatteryChargeCustomStartCharging తప్పనిసరిగా DeviceBatteryChargeCustomStopCharging కంటే తక్కువగా ఉండాలి.
+
+          DeviceBatteryChargeModeను పేర్కొనబడే శాతానికి సెట్ చేసినప్పుడు మాత్రమే ఈ విధానం ఉపయోగించబడుతుంది.
+
+          ఈ విధానాన్ని కన్ఫిగర్ చేయకపోయినా లేదా సెట్ చేయకుండా వదిలేసినా, ప్రామాణిక బ్యాటరీ ఛార్జ్ మోడ్ వర్తింపజేయబడుతుంది.</translation>
 <translation id="3925377537407648234">డిస్‌ప్లే రిజల్యూషన్ మరియు ప్రమాణ అంశాన్ని సెట్ చేయండి</translation>
 <translation id="3939893074578116847">పరికరం ఆఫ్‌లైన్‌లో ఉంటే గుర్తించేందుకు సర్వర్‌ను అనుమతించడానికి, ఆన్‌లైన్ స్థితిని పర్యవేక్షించడం కోసం
       నెట్‌వర్క్ ప్యాకెట్‌లను నిర్వహణ సర్వర్‌కు పంపుతుంది.
@@ -1643,6 +1722,7 @@
 <translation id="4150201353443180367">డిస్‌ప్లే</translation>
 <translation id="4157003184375321727">OS మరియు ఫర్మ్‌వేర్ వెర్షన్‌ను నివేదించు</translation>
 <translation id="4157594634940419685">స్థానిక CUPS ప్రింటర్‌లకు యాక్సెస్‌ని అనుమతించండి</translation>
+<translation id="4160962198980004898">డాక్ చేయబడినప్పుడు పరికర MAC చిరునామా మూలాధారం</translation>
 <translation id="4163705126749612234">రిమోట్ యాక్సెస్‌ క్లయింట్‌లపై విధించబడే అవసరమైన క్లయింట్ డొమైన్ పేరును కాన్ఫిగర్ చేస్తుంది.  దాన్ని మార్చనీయకుండా వినియోగదారులను నిరోధిస్తుంది.
 
 ఈ సెట్టింగ్‌ను ప్రారంభిస్తే, అప్పుడు కేవలం నిర్దిష్ట డొమైన్‌లలో ఒకదానిలోని క్లయింట్‌లు మాత్రమే హోస్ట్‌కు కనెక్ట్ అవగలగుతాయి.
@@ -1720,6 +1800,7 @@
       విధానంలో యాప్ ID ఉండడం అనేది, లాక్ స్క్రీన్‌పై విషయ సేకరణ యాప్‌‌‌గా వినియోగదారు యాప్‌ను అరంభించగలరని అర్థం కాదని గుర్తుంచుకోండి - ఉదాహరణకు, Chrome 61లో, అందుబాటులో ఉన్న యాప్‌లు అదనంగా ప్లాట్‌ఫామ్ ద్వారా నియంత్రించబడతాయి.
 
       విధానాన్ని సెట్ చేయకపోతే, విధానం ద్వారా విధించిన లాక్ స్క్రీన్‌పై వినియోగదారు ఆరంభించగలిగే యాప్‌ల సెట్‌పై నియంత్రణలు ఉండవు.</translation>
+<translation id="4313767483634435271">పరికర నిర్దేశిత డాక్ MAC చిరునామా</translation>
 <translation id="4322842393287974810"><ph name="PRODUCT_OS_NAME" /> వెర్షన్‌ను నియంత్రించడం కోసం సున్నా జాప్యంతో ఆటోమేటిక్‌గా ప్రారంభించబడిన కియోస్క్ యాప్‌ను అనుమతించండి</translation>
 <translation id="4325690621216251241">సిస్టమ్ ట్రేకు లాగ్‌అవుట్ బటన్‌ను జోడించండి</translation>
 <translation id="4332177773549877617">Android యాప్ ఇన్‌స్టాల్‌ల కోసం ఈవెంట్‌లను లాగ్ చేయండి</translation>
@@ -1751,6 +1832,7 @@
 <translation id="4360826270668210664">ఈ విధానాన్ని సెట్ చేస్తే, రిమోట్ యాక్సెస్ హోస్ట్‌ కనెక్ట్ అయ్యే క్రమంలో క్లయింట్‌లు ఈ URL నుండి ప్రమాణీకరణ టోకెన్‌ను పొందేలా ప్రామాణీకరించడం అవసరం. ఖచ్చితంగా RemoteAccessHostTokenValidationUrlతో కలిపి ఉపయోగించాలి.
 
 ఈ ఫీచర్ ప్రస్తుతం సర్వర్ తరపున నిలిపివేయబడింది.</translation>
+<translation id="4363057787588706121">విభిన్న మూలాధారాల నుండి అందించబడే జాబితా విధానాల విలీనతను అనుమతించండి</translation>
 <translation id="436581050240847513">పరికర నెట్‌వర్క్ ఇంటర్‌ఫేస్‌లను నివేదించండి</translation>
 <translation id="4372704773119750918">బహుళప్రొఫైల్ (ప్రాథమికం లేదా రెండవది)లో భాగం కావడానికి ఎంటర్‌ప్రైజ్ వినియోగదారును అనుమతించవద్దు</translation>
 <translation id="4377599627073874279">అన్ని చిత్రాలని చూపించడానికి అన్ని సైట్‌లని అనుమతించు</translation>
@@ -1916,6 +1998,7 @@
 <translation id="4826326557828204741">బ్యాటరీ శక్తిపై అమలవుతున్న సమయంలో ఇన్‌యాక్టివ్‌ ఆలస్యాన్ని చేరుకున్నప్పుడు తీసుకోవలసిన చర్య</translation>
 <translation id="4832852360828533362">వినియోగదారు మరియు పరికర నివేదన</translation>
 <translation id="4834526953114077364">తగినంత ఖాళీ స్థలం ఏర్పడే వరకు చాలా కాలం క్రితం ఉపయోగించిన, గత 3 నెలలుగా లాగిన్ చేయని  వినియోగదారులు తీసివేయబడతారు</translation>
+<translation id="4835622243021053389">NTLMv2 ప్రామాణీకరణను ప్రారంభించండి.</translation>
 <translation id="4858735034935305895">పూర్తిస్క్రీన్ మోడ్‌ను అనుమతించండి</translation>
 <translation id="4861767323695239729">వినియోగదారు సెషన్‌లో అనుమతించబడిన ఇన్‌పుట్ పద్ధతులను కాన్ఫిగర్ చేయండి</translation>
 <translation id="487460824085252184">ఆటోమేటిక్‌గా తరలించబడుతుంది, వినియోగదారు సమ్మతి కోసం అడగదు.</translation>
@@ -2032,6 +2115,11 @@
 
       <ph name="URL_LIST_POLICY_NAME" />లాగా కాకుండా, నిబంధనలు రెండు దిశలలో వర్తిస్తాయి. అలాంటి సందర్భంలోనే Internet Explorer యాడ్-ఇన్‌ని కలిగి ఉండి, దానిని ప్రారంభించినప్పుడు, <ph name="IE_PRODUCT_NAME" /> ఈ URLలను తెరవాలో లేదో కూడా <ph name="PRODUCT_NAME" /> నియంత్రిస్తుంది.</translation>
 <translation id="5124368997194894978">AC (ఆల్టర్నేటింగ్ కరెంట్)లో బూట్‌ను ప్రారంభించండి</translation>
+<translation id="5131211790949066746">ఎక్స్‌టెన్షన్ ఇన్‌స్టాల్ జాబితా విధానాలు <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />, <ph name="EXTENSION_INSTALL_WHITELIST_POLICY_NAME" /> మరియు <ph name="EXTENSION_INSTALL_FORCELIST_POLICY_NAME" />ను ఒక్కటిగా కలపడం అనుమతిస్తుంది.
+
+      మీరు ఈ సెట్టింగ్‌ను ప్రారంభిస్తే, మెషీన్ ప్లాట్‌ఫామ్ విధానం, మెషీన్ క్లౌడ్ విధానం, అలాగే వినియోగదారు ప్లాట్‌ఫామ్ విధానంలోని విలువలు ఒకటే జాబితాగా కలపబడతాయి, ఆపై అధిక ప్రాధాన్యత ఉన్న ఒకే మూలాధారంలోని విలువలు మాత్రమే కాకుండా అన్నీ కలిపి ఉపయోగించబడతాయి.
+
+      మీరు ఈ సెట్టింగ్‌ను నిలిపివేస్తే లేదా సెట్ చేయకుండా వదిలేస్తే, అధిక ప్రాధాన్యత మూలాధారంలోని జాబితా నమోదులు మాత్రమే తీసుకోబడతాయి, మిగతా అన్ని ఇతర మూలాధారాలు వైరుధ్యాలుగా చూపబడతాయి, కానీ విస్మరించబడతాయి.</translation>
 <translation id="5141670636904227950">లాగిన్ స్క్రీన్‌లో ప్రారంభించబడే డిఫాల్ట్ స్క్రీన్ మాగ్నిఫైయర్ రకాన్ని సెట్ చేయండి</translation>
 <translation id="5142301680741828703">ఎల్లప్పుడు <ph name="PRODUCT_FRAME_NAME" />లో ఈ క్రింది URL విధానాలాని రెండర్ చెయ్యి</translation>
 <translation id="5148753489738115745"><ph name="PRODUCT_FRAME_NAME" /> <ph name="PRODUCT_NAME" />ను ప్రారంభించినప్పుడు ఉపయోగించే అదనపు పారామీటర్‌లను పేర్కొనడానికి మిమ్మల్ని అనుమతిస్తుంది.
@@ -2143,6 +2231,7 @@
 
       విధానాన్ని సెట్ చేయకపోతే, లేదంటే ఖాళీ స్ట్రింగ్ లేదా చెల్లని పోర్ట్ పరిధికి సెట్ చేస్తే, WebRTC అందుబాటులో ఉన్న ఏదైనా UDP పోర్ట్‌ను ఉపయోగించడానికి అనుమతించబడుతుంది.</translation>
 <translation id="5290940294294002042">వినియోగదారు ప్రారంభించగల లేదా ఆపివేయగల ప్లగ్‌ఇన్‌ల జాబితాను పేర్కొను</translation>
+<translation id="5306186200045823863">Symantec Corporationకు సంబంధించిన Legacy PKI Infrastructureలో విశ్వసనీయతను ప్రారంభించండి</translation>
 <translation id="5307432759655324440">అజ్ఞాత మోడ్ అందుబాటు</translation>
 <translation id="5318185076587284965">రిమోట్ యాక్సెస్ హోస్ట్ ద్వారా రిలే సర్వర్‌ల వినియోగాన్ని ప్రారంభించండి</translation>
 <translation id="5323128137188992869"><ph name="PRODUCT_NAME" /> ఉపయోగించి పరికరానికి కంటెంట్‌ను ప్రసారం చేయడానికి అనుమతిస్తుంది.
@@ -2236,6 +2325,7 @@
       నిబంధనలు ఒకదానికొకటి పరస్పర విరుద్ధంగా ఉంటే, <ph name="PRODUCT_NAME" /> అత్యంత నిర్దిష్టమైన నిబంధనను ఉపయోగిస్తుంది.</translation>
 <translation id="5475361623548884387">ముద్రించడాన్ని ప్రారంభించు</translation>
 <translation id="547601067149622666">అనుచిత ప్రకటనల సైట్‌లలో ప్రకటనలను అనుమతించవద్దు</translation>
+<translation id="5483065054530244863">స్థానిక విశ్వసనీయ యాంకర్‌ల ద్వారా మంజూరు చేయబడిన SHA-1 సంతకం గల సర్టిఫికెట్‌లను అనుమతించండి</translation>
 <translation id="5483777239978559943">ఈ విధానం నిలిపివేయబడింది. Flash ప్లగిన్ అందుబాటును నియంత్రించడానికి <ph name="DEFAULT_PLUGINS_SETTING_POLICY_NAME" /> మరియు PDF ఫైల్‌లను తెరిచేందుకు ఏకీకరించిన PDF వ్యూయర్‌ను ఉపయోగించాలా లేదా అనేది నియంత్రించడానికి, దయచేసి <ph name="ALWAYS_OPEN_PDF_EXTERNALLY_POLICY_NAME" />ను ఉపయోగించండి.
 
 <ph name="PRODUCT_NAME" />లో వినియోగదారులు ప్రారంభించగల లేదా ఆపివేయగల ప్లగిన్‌ల జాబితాను పేర్కొంటుంది.
@@ -2350,6 +2440,17 @@
           మీరు ఈ సెట్టింగ్‌ను ప్రారంభిస్తే లేదా విధానాన్ని సెట్ చేయకపోతే, వినియోగదారులు పాస్‌వర్డ్ మేనేజర్‌లో వారి పాస్‌వర్డ్‌లను స్పష్టమైన వచనంలా వీక్షించగలరు.</translation>
 <translation id="5620392548325769024">OS అప్‌గ్రేడ్ చేసిన అనంతరం మొదటిసారి బ్రౌజర్‌ను ప్రారంభించినప్పుడు స్వాగత పేజీని చూపడం ప్రారంభిస్తుంది</translation>
 <translation id="5630352020869108293">చివరి సెషన్‌ను పునరుద్ధరించు</translation>
+<translation id="5643906875497889108">ఇన్‌స్టాల్ చేయడానికి అనుమతించబడే యాప్/ఎక్స్‌టెన్షన్ రకాలను నియంత్రిస్తుంది, అలాగే అమలు సమయం యాక్సెస్‌ను పరిమితం చేస్తుంది.
+
+          ఈ సెట్టింగ్ <ph name="PRODUCT_NAME" />లో ఇన్‌స్టాల్ చేయడానికి అనుమతించబడే ఎక్స్‌టెన్షన్/యాప్‌ల రకాలను, అలాగే వారు ఇంటరాక్ట్ కావచ్చనే హోస్ట్‌లను వైట్‌లిస్ట్ చేస్తుంది. విలువలో వాక్యాల జాబితా ఉంచబడుతుంది, వాటిలో ప్రతి ఒక్కటీ కింది వాటిలో ఒక విధంగా ఉండాలి: "ఎక్స్‌టెన్షన్", "థీమ్", "user_script", "hosted_app", "legacy_packaged_app", "platform_app". ఈ రకాల గురించి మరింత సమాచారం కోసం <ph name="PRODUCT_NAME" /> ఎక్స్‌టెన్షన్‌లకు సంబంధించిన పత్రాలను చూడండి.
+
+          అలాగే, ఈ విధానం ExtensionInstallForcelist ద్వారా నిర్బంధంగా ఇన్‌స్టాల్ చేయబడే ఎక్ట్‌టెన్షన్‌లు, యాప్‌లపై కూడా ప్రభావం చూపుతుంది.
+
+          ఈ సెట్టింగ్‌ను కన్ఫిగర్ చేస్తే, జాబితాలో లేని రకమైన ఎక్స్‌టెన్షన్‌లు/యాప్‌లు ఇన్‌స్టాల్ చేయబడవు.
+
+          ఈ సెట్టింగ్‌ను కన్ఫిగర్ చేయకుండా వదిలేస్తే, ఆమోదించబడే ఎక్స్‌టెన్షన్/యాప్ రకాలపై ఎటువంటి పరిమితులు అమలు చేయబడవు.
+
+          వెర్షన్ 75 కంటే పాత వాటిలో బహుళ కామాలతో వేరు చేసి అందించే ఎక్స్‌టెన్షన్ IDల వినియోగానికి మద్దతు ఉండదు, అవి దాటవేయబడతాయి. మిగతా విధానం అంతా వర్తింపజేయడం కొనసాగుతుంది.</translation>
 <translation id="5645779841392247734">ఈ సైట్‌లలో కుక్కీలని అనుమతించు</translation>
 <translation id="5689430183304951538">డిఫాల్ట్ ముద్రణ పేజీ పరిమాణం</translation>
 <translation id="5693469654327063861">డేటా బదిలీని అనుమతించండి</translation>
@@ -2389,6 +2490,7 @@
 <translation id="5765780083710877561">వివరణ:</translation>
 <translation id="5770738360657678870">అభివృద్దిలో ఉన్న ఛానెల్ (అస్థిరంగా ఉండవచ్చు)</translation>
 <translation id="5774856474228476867">డిఫాల్ట్ శోధన ప్రదాత శోధన URL</translation>
+<translation id="5775235485119094648">బ్యాటరీ శక్తి నిశ్చిత పరిధిలో ఉన్నప్పుడు మాత్రమే ఛార్జ్ చేయండి.</translation>
 <translation id="5776485039795852974">ఏదైనా ఒక సైట్, డెస్క్‌టాప్ ప్రకటనలను చూపించాలని కోరిన ప్రతిసారి, అడగాలి</translation>
 <translation id="5781412041848781654">HTTP ప్రామాణీకరణ కోసం ఉపయోగించాల్సిన GSSAPI లైబ్రరీని పేర్కొంటుంది. మీరు కేవలం లైబ్రరీ పేరును, లేదంటే పూర్తి పాత్‌ను సెట్ చేయవచ్చు.
 
@@ -2450,6 +2552,7 @@
 <translation id="5893553533827140852">ఈ సెట్టింగ్ ప్రారంభించబడితే, gnubby ప్రామాణీకరణ అభ్యర్థనలు రిమోట్ హోస్ట్ కనెక్షన్‌లో ప్రాక్సీ చేయబడతాయి.
 
           ఈ సెట్టింగ్ నిలిపివేయబడితే లేదా కాన్ఫిగర్ చేయబడకపోతే, gnubby ప్రామాణీకరణ అభ్యర్థనలు ప్రాక్సీ చేయబడవు.</translation>
+<translation id="5897913798715600338">ఫాస్ట్ ఛార్జింగ్ సాంకేతికతను ఉపయోగించి బ్యాటరీని ఛార్జ్ చేయండి.</translation>
 <translation id="5898486742390981550">అనేకమంది వినియోగదారులు లాగిన్ అయినప్పుడు, ప్రాథమిక వినియోగదారు మాత్రమే Android యాప్‌లను ఉపయోగించగలరు.</translation>
 <translation id="5900196529149231477">
       ఈ విధానం సైన్-ఇన్ స్క్రీన్‌కు వర్తిస్తుంది. అలాగే దయచేసి వినియోగదారు సెషన్‌కు వర్తించే <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> విధానాన్ని కూడా చూడండి. రెండు విధానాలను ఒకే విలువకు సెట్ చేయాల్సిందిగా సిఫార్సు చేయడమైనది. విలువలు సరిపోలకపోతే, వినియోగదారు సెషన్‌లోకి ప్రవేశించేటప్పుడు, వినియోగదారు విధానం ద్వారా పేర్కొన్న విలువని వర్తింపజేయడం వల్ల ఆలస్యం జరగవచ్చు.
@@ -2458,12 +2561,14 @@
     ఒకవేళ విధానాన్ని కాన్ఫిగర్ చేయకపోతే, సైన్-ఇన్ స్క్రీన్ కోసం ప్లాట్‌ఫామ్ డిఫాల్ట్‌ సైట్‌ను వేరుపరిచే సెట్టింగ్‌లు ఉపయోగించబడతాయి.
       </translation>
 <translation id="5901427587865226597">డూప్లెక్స్ ముద్రణ మాత్రమే</translation>
+<translation id="5905473632148429217">ఆన్‌లైన్ OCSP/CRL తనిఖీలను ప్రారంభించండి</translation>
 <translation id="5906199912611534122">నెట్‌వర్క్ కుదింపును ప్రారంభించడాన్ని లేదా నిలిపివేయడాన్ని అనుమతిస్తుంది.
       ఇది అందరు వినియోగదారులకు మరియు పరికరంలోని అన్ని ఇంటర్‌ఫేస్‌లకు వర్తిస్తుంది. ఒకసారి సెట్
       చేసాక, కుదింపును నిలిపివేసేలా విధానం మార్చబడే వరకు అది అలాగే కొనసాగుతుంది.
 
       'తప్పు'గా సెట్ చేస్తే, కుదింపు ఉండదు.
       'ఒప్పు'గా సెట్ చేస్తే, అందించబడిన అప్‌లోడ్ మరియు డౌన్‌లోడ్ రేట్‌లను (kbits/sలో) చేరుకోవడానికి సిస్టమ్ కుదించబడుతుంది.</translation>
+<translation id="591088232153082363">బ్యాటరీ వినియోగ పద్ధతి ఆధారంగా అనుకూల రీతిలో బ్యాటరీ ఛార్జింగ్.</translation>
 <translation id="5921713479449475707">స్వీయ నవీకరణ డౌన్‌లోడ్‌లను HTTP ద్వారా అనుమతించండి</translation>
 <translation id="5921888683953999946">లాగిన్ స్క్రీన్‌లో పెద్ద కర్సర్ యాక్సెస్ ఫీచర్ యొక్క డిఫాల్ట్ స్థితిని సెట్ చేయండి.
 
@@ -2485,6 +2590,7 @@
 <translation id="5950205771952201658">ఒకవేళ సాఫ్ట్-వైఫల్యం సంభవిస్తే, ఆన్‌లైన్ ఉపసంహరణ తనిఖీలు ఎలాంటి ప్రభావవంతమైన భద్రతా ప్రయోజనాన్ని అందించవు, అవి <ph name="PRODUCT_NAME" /> వెర్షన్ 19 మరియు దాని తర్వాతి వాటిలో డిఫాల్ట్‌గా నిలిపివేయబడతాయి. ఈ విధానాన్ని 'ఒప్పు'గా సెట్ చేస్తే, తద్వారా మునుపటి ప్రవర్తన పునరుద్ధరించబడుతుంది, ఆన్‌లైన్ OCSP/CRL తనిఖీలు అమలు చేయబడతాయి.
 
       విధానాన్ని సెట్ చేయకపోయినా లేదా 'తప్పు'గా సెట్ చేసినా, అప్పుడు <ph name="PRODUCT_NAME" /> 19వ వెర్షన్ మరియు దాని తర్వాతి వెర్షన్‌లలో <ph name="PRODUCT_NAME" /> ఆన్‌లైన్ ఉపసంహరణ తనిఖీలను అమలు చేయదు.</translation>
+<translation id="5961137303188584693">పరికర అంతర్నిర్మిత NIC MAC చిరునామా</translation>
 <translation id="5966615072639944554">రిమోట్ ధృవీకరణ APIని ఉపయోగించడానికి అనుమతించబడిన ఎక్స్‌టెన్షన్‌లు</translation>
 <translation id="5983708779415553259">ఏ కంటెంట్ ప్యాక్‌లో లేని సైట్‌ల కోసం డిఫాల్ట్ స్వభావం</translation>
 <translation id="5997543603646547632">డిఫాల్ట్‌గా 24 గంటల గడియారాన్ని ఉపయోగించండి</translation>
@@ -2575,6 +2681,17 @@
 <translation id="6111936128861357925">డైనోసార్ ఈస్టర్ ఎగ్ గేమ్‌ను అనుమతించండి</translation>
 <translation id="6114416803310251055">తగ్గిన విలువ</translation>
 <translation id="6133088669883929098">కీ ఉత్పాదనను ఉపయోగించడానికి అన్ని సైట్‌లను అనుమతించు</translation>
+<translation id="6136537398661737682">ఈ విధానం Google స్థాన సేవల ప్రాథమిక స్థితిని నియంత్రిస్తుంది.
+
+      ఈ విధానాన్ని కన్ఫిగర్ చేయకుంటే లేదా <ph name="GLS_DISABLED" />కు సెట్ చేస్తే, Google స్థాన సేవలు ప్రాథమికంగా నిలిపివేయబడతాయి.
+
+      ఈ విధానాన్ని <ph name="GLS_ENABLED" />కు సెట్ చేస్తే, Google స్థాన సేవలు ప్రాథమికంగా ప్రారంభించబడతాయి.
+
+      ఈ విధానాన్ని <ph name="GLS_UNDER_USER_CONTROL" />కు సెట్ చేస్తే, Google స్థాన సేవలను ఉపయోగించాలో లేదో వినియోగదారు ఎంచుకునేలా అడగబడతారు. ఇది పరికర స్థానాన్ని అడగడానికి సేవలను ఉపయోగించేందుకు Android యాప్‌లను అనుమతిస్తుంది, అలాగే అజ్ఞాతీకరించిన స్థాన డేటాను Googleకు సమర్పించడం కూడా ప్రారంభిస్తుంది.
+
+      ఈ విధానం Google స్థాన సేవల స్థితిని ప్రాథమిక సెటప్ దశలో మాత్రమే నియంత్రిస్తుందని గుర్తుంచుకోండి. ఆ తర్వాత కూడా వినియోగదారు Android సెట్టింగ్‌లను తెరిచి, Google స్థాన సేవలను ఆన్/ఆఫ్ చేయవచ్చు.
+
+      <ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" /> విధానాన్ని <ph name="BLOCK_GEOLOCATION_SETTING" />కు సెట్ చేసినప్పుడు, ఈ విధానం విస్మరించబడుతుందని, అలాగే ఎల్లప్పుడూ Google స్థాన సేవలు నిలిపివేయబడతాయని గుర్తుంచుకోండి.</translation>
 <translation id="6141402445226505817">ఎల్లప్పుడూ స్థూల సమయ మండలి గుర్తింపును ఉపయోగించండి</translation>
 <translation id="6145799962557135888">JavaScriptను అమలు చేయడానికి అనుమతించబడే సైట్‌లను పేర్కొనే url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే అన్ని సైట్‌లకు గ్లోబల్ డిఫాల్ట్ విలువ ఇది సెట్ చేయబడి ఉంటే 'DefaultJavaScriptSetting' విధానం నుండి లేదా చేయబడకపోతే వినియోగదారు వ్యక్తిగత కాన్ఫిగరేషన్ నుండి ఉపయోగించబడుతుంది.</translation>
 <translation id="614662973812186053">అలాగే Androidలో వినియోగం మరియు విశ్లేషణ డేటా సేకరణను కూడా ఈ విధానం నియంత్రిస్తుంది.</translation>
@@ -2648,9 +2765,17 @@
       నిలిపివేయబడితే, స్వీయ పూరింపు ఫారమ్ డేటా దిగుమతి చేయబడదు.
 
       దీనిని సెట్ చేయకపోతే, వినియోగదారును దిగుమతి చేయాలా వద్దా అని అడగవచ్చు లేదా ఆటోమేటిక్‌గా దిగుమతి చేయవచ్చు.</translation>
+<translation id="6221175752766085998">subjectAlternativeName ఎక్స్‌టెన్షన్ లేని స్థానిక విశ్వసనీయ యాంకర్‌ల ద్వారా మంజూరు చేయబడిన సర్టిఫికెట్‌లను అనుమతించండి</translation>
 <translation id="6224304369267200483">URLలు/ డొమైన్‌లు ప్రత్యక్ష భద్రతా కీ ధృవీకరణకు అనుమతిస్తాయి</translation>
 <translation id="6233173491898450179">డౌన్‌లోడ్ డైరెక్టరీని సెట్ చేయి</translation>
 <translation id="6244210204546589761">స్టార్ట్‌అప్‌లో తెరవడానికి URLలు</translation>
+<translation id="6255387031094435995">వివిధ మూలాధారాల నుండి నిర్దిష్ట విధానాలు ఒకే పరిధులు, స్థాయిలతో అందించబడినప్పుడు ఒక్కటిగా కలపడానికి అనుమతించబడతాయి.
+
+        ఒకవేళ విధానం ఒక జాబితాలో ఉంటే, అలాగే ఈ రెండు మూలాధారాల మధ్య వైరుధ్యం ఉంటే, వాటి రెండింటికీ ఒకే పరిధులు, స్థాయి ఉండే పక్షంలో ఆ విలువలు కొత్త విధాన జాబితాలోకి కలపబడతాయి.
+
+        ఒకవేళ విధానం ఒక జాబితాలో ఉంటే, అలాగే ఈ రెండు మూలాధారాల మధ్య వైరుధ్యం ఉంటే, అలాగే వాటి పరిధులు మరియు/లేదా స్థాయి కూడా వేటికవే భిన్నంగా ఉంటే, అధిక ప్రాధాన్యత ఉన్న విధానం వర్తింపజేయబడుతుంది.
+
+        ఒకవేళ విధానం ఒక జాబితాలో లేకుంటే, అలాగే మూలధారాలు, పరిధులు మరియు/లేదా స్థాయి మధ్య ఏదైనా వైరుధ్యం ఉంటే, అధిక ప్రాధాన్యత గల విధానం వర్తింపజేయబడుతుంది.</translation>
 <translation id="6258193603492867656">జ‌న‌రేట్ అయిన‌ Kerberos SPN అప్రామాణిక పోర్ట్‌ను కలిగి ఉండాలా? లేదా? అనే దాన్ని పేర్కొంటుంది. మీరు ఈ సెట్టింగ్‌ను ప్రారంభిస్తే, అప్రామాణిక పోర్ట్ (అంటే, 80 లేదా 443 కాకుండా, మరొక పోర్ట్) నమోదు చేయబడుతుంది. ఇది జ‌న‌రేట్ అయిన‌ Kerberos SPNలో చేర్చబడుతుంది. మీరు ఈ సెట్టింగ్‌ను నిలిపివేసినా లేదా సెట్ చేయకుండా వదిలి వేసినా, ఏదైనప్పటికీ జ‌న‌రేట్ అయిన‌ Kerberos SPN పోర్ట్‌ను కలిగి ఉండదు.</translation>
 <translation id="6261643884958898336">మెషిన్ గుర్తింపు సమాచారాన్ని నివేదించండి</translation>
 <translation id="6281043242780654992">స్థానిక సందేశ పద్ధతి కోసం విధానాలను కాన్ఫిగర్ చేస్తుంది. నిరోధిత జాబితాలో ఉన్న స్థానిక సందేశ పద్ధతి హోస్ట్‌లు అనుమతి జాబితాలోకి చేర్చకపోతే అనుమతించబడవు.</translation>
@@ -2847,6 +2972,7 @@
 <translation id="6757438632136860443"><ph name="FLASH_PLUGIN_NAME" /> ప్లగిన్‌ను అమలు చేయడానికి అనుమతి ఉన్న సైట్‌లను పేర్కొనడం కోసం url నమూనాల జాబితాను సెట్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది.
 
           ఈ విధానాన్ని సెట్ చేయకుంటే, 'DefaultPluginsSetting' విధానం సెట్ చేయబడి ఉంటే దాని నుండి లేదా వినియోగదారు యొక్క వ్యక్తిగత కాన్ఫిగరేషన్ నుండి గ్లోబల్ డిఫాల్ట్ విలువ సైట్‌ల కోసం ఉపయోగించబడుతుంది.</translation>
+<translation id="6757613329154374267">బ్యాకప్ మరియు పునరుద్ధరణ ప్రారంభించబడింది</translation>
 <translation id="6762235610019366960"><ph name="PRODUCT_NAME" />లోని పూర్తి-ట్యాబ్ ప్రచార మరియు/లేదా విద్యా విషయాల ప్రదర్శనను నియంత్రించడానికి అనుమతిస్తుంది.
 కాన్ఫిగర్ చేయబడకుంటే లేక ప్రారంభించబడితే (ఒప్పుగా సెట్ చేసి ఉంటే) <ph name="PRODUCT_NAME" /> ఉత్పత్తి సమాచారం అందించడం కోసం వినియోగదారులకు పూర్తి-ట్యాబ్ కంటెంట్‌ను చూపించవచ్చు.
 నిలిపివేస్తే (తప్పుకు సెట్ చేసి ఉంటే) <ph name="PRODUCT_NAME" /> ఉత్పత్తి సమాచారం అందించడం కోసం వినియోగదారులకు పూర్తి-ట్యాబ్ కంటెంట్‌ను చూపించదు.
@@ -2866,6 +2992,7 @@
       వాక్యంలో ${ASSET_ID}, ${SERIAL_NUM}, ${MAC_ADDR}, ${MACHINE_NAME} అనే వేరియబుల్‌లు కలిగి ఉంటాయి, అవి హోస్ట్ పేరుగా ఉపయోగించే ముందు పరికరంలో విలువలతో భర్తీ చేయబడతాయి. ఫలితంగా, ప్రత్యామ్నాయం చెల్లుబాటు అయ్యే హోస్ట్‌పేరు అయి ఉండాలి (RFC 1035 ప్రకారం, సెక్షన్ 3.1).
 
       ఈ విధానాన్ని సెట్ చేసి ఉండకపోతే లేదా ప్రత్యామ్నాయ విలువ చెల్లుబాటు అయ్యే హోస్ట్‌పేరు కానప్పుడు, హోస్ట్ పేరు DHCP అభ్యర్ధనలో సెట్ చేయబడదు. </translation>
+<translation id="6833988859168635883">ప్రారంభం, హోమ్ పేజీ మరియు కొత్త ట్యాబ్ పేజీ</translation>
 <translation id="6835883744948188639">పునఃప్రారంభ సిఫార్సును సూచించే పునరావృత ప్రాంప్ట్‌ను వినియోగదారుకు చూపండి</translation>
 <translation id="6837480141980366278">అంతర్నిర్మిత DNS క్లయింట్‌ని <ph name="PRODUCT_NAME" />లో ఉపయోగించాలో లేదో నియంత్రిస్తుంది.
 
@@ -2976,6 +3103,17 @@
 
       స్క్రీన్ ఎప్పుడైతే మసకబారే పరిస్థితిలో ఉంటుందో, అప్పుడు స్మార్ట్ కాంతివిహీనత మోడల్‌ అనేది స్క్రీన్‌ని మసకబారేలా చేయాలా లేక వాయిదా వేయాలా అనే విషయాలను అంచ‌నా వేస్తుంది. ఒకవేళ స్మార్ట్ కాంతివిహీనత మోడల్‌ అనేది స్క్రీన్‌ను మసకబారేలా చేయకూడదు అనుకుంటే మాత్రం, అది సమర్థవంతంగా స్క్రీన్‌ మసకబారే సమయాన్ని పెంచుతుంది. ఇలాంటి  సందర్భంలో, స్క్రీన్ ఆపివేత, స్క్రీన్ లాక్ మరియు నిష్క్రియ ఆలస్యాలు వాస్తవంగా కాన్ఫిగర్ చేయబడిన విధంగానే స్క్రీన్ కాంతివిహీనత ఆలస్యంతో ఒకే రకమైన వ్యత్యాసాన్ని కలిగి ఉండేలా సర్దుబాటు చేయబడతాయి.
       ఒకవేళ ఈ విధానాన్ని ఒప్పుగా సెట్ చేసినా లేదా అసలు సెట్ చేయకుండా వదిలేసినా, ఈ స్మార్ట్ కాంతివిహీనత మోడల్‌ ప్రారంభించబడుతుంది అలాగే స్క్రీన్ మసకబారేంత వరకు సమయాన్ని పెంచుకునేలా అనుమతిస్తుంది. ఒకవేళ ఈ విధానాన్ని తప్పుకు సెట్ చేస్తే, స్మార్ట్ కాంతివిహీనత మోడల్‌ అనేది స్క్రీన్‌ను మసకబారేలా చేయడంలో ఎలాంటి ప్రభావం చూపదు.</translation>
+<translation id="6967394885063085697">అధునాతన బ్యాటరీ ఛార్జ్ మోడ్ పవర్ నిర్వహణ విధానాన్ని ప్రారంభించండి.
+
+          అధునాతన బ్యాటరీ ఛార్జింగ్ మోడ్ ద్వారా వినియోగదారు బ్యాటరీ శక్తిని వీలైనంతగా పెంచడానికి అనుమతించబడతారు. అధునాతన ఛార్జింగ్ మోడ్‌లో, బ్యాటరీ శక్తిని వీలైనంతగా పెంచడానికి సిస్టమ్ పని చేయని వేళలలో ప్రామాణిక ఛార్జింగ్ అల్గారిథమ్‌ను మరియు ఇతర సాంకేతిక పద్ధతులను ఉపయోగిస్తుంది. పని వేళలలో, ఎక్స్‌ప్రెస్ ఛార్జ్ ఉపయోగించబడుతుంది. ఈ ఎక్స్‌ప్రెస్ ఛార్జ్ ద్వారా బ్యాటరీ వేగంగా ఛార్జ్ చేయబడటానికి అనుమతించబడుతుంది; కనుక, బ్యాటరీ చాలా త్వరగా పూర్తిగా ఛార్జ్ అవుతుంది. ప్రతి రోజూ సిస్టమ్ అత్యధికంగా వినియోగించబడే సమయం గురించి ప్రారంభ సమయం మరియు వ్యవధి ద్వారా పేర్కొనబడుతుంది.
+
+          ఈ విధానాన్ని ఒప్పునకు సెట్ చేస్తే మరియు DeviceAdvancedBatteryChargeModeDayConfigను సెట్ చేస్తే, పరికరంలో మద్దతు ఉండే పక్షంలో అధునాతన బ్యాటరీ ఛార్జ్ మోడ్ ఎల్లప్పుడూ ప్రారంభించబడుతుంది.
+
+          ఈ విధానాన్ని తప్పునకు సెట్ చేస్తే, అధునాతన బ్యాటరీ ఛార్జ్ మోడ్ ఎల్లప్పుడూ నిలిపివేయబడుతుంది.
+
+          మీరు ఈ విధానాన్ని సెట్ చేస్తే, దీనిని వినియోగదారులు మార్చలేరు లేదా భర్తీ చేయలేరు.
+
+          ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, అధునాతన బ్యాటరీ ఛార్జ్ మోడ్ నిలిపివేయబడుతుంది మరియు వినియోగదారు దీనిని ప్రారంభించలేరు.</translation>
 <translation id="6972540544240464302">టాస్క్ షెడ్యూలర్ కాన్ఫిగరేషన్‌ను ఎంచుకోండి</translation>
 <translation id="6979158407327259162">Google డిస్క్</translation>
 <translation id="6994082778848658360">రెండో ద‌శ‌ ప్రామాణీకరణ ఈ ఫీచర్‌కు అనుకూలంగా ఉంటే దానిని అందించడానికి ఆన్-బోర్డ్ భద్రతా మూలకం హార్డ్‌వేర్‌ను ఎలా ఉపయోగించవచ్చో పేర్కొంటుంది. వినియోగదారు భౌగోళిక స్థానాన్ని గుర్తించడానికి యంత్ర శక్తి బటన్ ఉపయోగించబడుతుంది.
@@ -3041,6 +3179,17 @@
       మీరు ఈ సెట్టింగ్‌ను ప్రారంభించినా నిలిపివేసినా, వినియోగదారులు దీనిని మార్చలేరు లేదా భర్తీ చేయలేరు.
 
       ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, పరికరాన్ని అన్‌లాక్ చేయడానికి పాస్‌వర్డ్‌ను అడగాలో, లేదో వినియోగదారు ఎంచుకోగలరు.</translation>
+<translation id="7107148737865880402">USB పవర్ షేర్ పవర్ నిర్వహణ విధానాన్ని ప్రారంభించండి.
+
+          మెరుపు సూచిక గుర్తు లేదా బ్యాటరీ చిహ్నం గల నిర్దిష్ట USB పోర్ట్‌ను కలిగి ఉండే కొన్ని రకాల పరికరాలను ఉపయోగించడం ద్వారా మొబైల్ ఫోన్ లాంటి పరికరాలను సిస్టమ్ బ్యాటరీతో ఛార్జ్ చేయవచ్చు. సిస్టమ్ స్లీప్ మరియు షట్ డౌన్ మోడ్‌లలో ఉన్నప్పుడు ఈ పోర్ట్ ఛార్జింగ్ ప్రవర్తనను ఈ విధానం ప్రభావితం చేస్తుంది. అయితే ఇతర USB పోర్ట్‌లను గానీ, సిస్టమ్ యాక్టివ్‌గా ఉన్నప్పుడు ఛార్జింగ్ ప్రవర్తనను గానీ ఈ విధానం ప్రభావితం చేయదు.
+
+          యాక్టివ్‌లో ఉన్నప్పుడు, USB పోర్ట్ ఎల్లప్పుడూ పవర్‌ను అందిస్తుంది.
+
+          స్లీపింగ్ మోడ్‌లో ఉన్నప్పుడు, ఒకవేళ ఈ విధానాన్ని ఒప్పునకు సెట్ చేస్తే, పరికరాన్ని వాల్ ఛార్జర్‌కు ప్లగ్ఇన్ చేసినప్పుడు లేదా బ్యాటరీ స్థాయి &gt; 50% ఉన్నప్పుడు USB పోర్ట్‌కు పవర్ సరఫరా చేయబడుతుంది. లేదంటే, పవర్ ఏదీ సరఫరా చేయబడదు.
+
+          షట్ డౌన్ చేసి ఉన్నప్పుడు, ఒకవేళ ఈ విధానాన్ని ఒప్పునకు సెట్ చేస్తే, పరికరాన్ని వాల్ ఛార్జర్‌కు ప్లగ్ఇన్ చేసినప్పుడు USB పోర్ట్‌కు పవర్ సరఫరా చేయబడుతుంది. లేదంటే, పవర్ ఏదీ సరఫరా చేయబడదు.
+
+          ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, విధానం ప్రారంభించబడుతుంది, అలాగే దీనిని వినియోగదారు నిలిపివేయలేరు.</translation>
 <translation id="7115494316187648452"><ph name="PRODUCT_NAME" /> ప్రాసెస్‌ను OS లాగిన్‌లో ప్రారంభించాలో లేదో మరియు చివరి బ్రౌజర్ విండోను మూసివేసినప్పటికీ ఏవైనా సెషన్ కుక్కీలతో సహా, నేపథ్య యాప్‌లు మరియు ప్రస్తుత బ్రౌజింగ్ సెషన్‌ను అలాగే యాక్టివ్‌గా ఉంచడాన్ని అనుమతిస్తూ అమలులో ఉంచడం కొనసాగించాలో లేదో నిర్ణయిస్తుంది. నేపథ్య ప్రాసెస్ ఏదైనా ఉంటే సిస్టమ్ ట్రేలో దాని చిహ్నం ప్రదర్శించబడుతుంది, దానిని అక్కడి నుండి ఎప్పుడైనా మూసివేయవచ్చు.
 
       ఈ విధానాన్ని 'ఒప్పు'గా సెట్ చేస్తే, నేపథ్య మోడ్ ప్రారంభించబడుతుంది, దీనిని బ్రౌజర్ సెట్టింగ్‌లలో వినియోగదారు నియంత్రించలేరు.
@@ -3090,6 +3239,7 @@
           ఈ విధానాన్ని ఒప్పు అని సెట్ చేస్తే లేదా సెట్ చేయకపోతే, AllowWakeLocksని తప్పు అని సెట్ చేసినప్పుడు మినహా, స్క్రీన్‌ను సాధారణ స్థితికి తీసుకువచ్చే లాక్‌లు పవర్ నిర్వహణ కోసం ఆమోదించబడతాయి.
 
           ఈ విధానాన్ని తప్పు అని సెట్ చేస్తే, స్క్రీన్‌ను సాధారణ స్థితికి తీసుకువచ్చే లాక్ అభ్యర్థనలు సిస్టమ్‌ను సాధారణ స్థితికి తీసుకువచ్చే లాక్ అభ్యర్థనలుగా స్థాయి తగ్గించబడతాయి.</translation>
+<translation id="7177857088692019405">త్వరిత అన్‌లాక్</translation>
 <translation id="7185078796915954712">TLS 1.3</translation>
 <translation id="718956142899066210">నవీకరణల కోసం కనెక్షన్ రకాలు అనుమతించబడతాయి</translation>
 <translation id="7194407337890404814">డిఫాల్ట్ శోధన ప్రదాత పేరు</translation>
@@ -3152,6 +3302,7 @@
 <translation id="7273823081800296768">ఈ సెట్టింగ్‌ను ప్రారంభిస్తే లేదా కాన్ఫిగర్ చేయకపోతే, ఆపై వినియోగదారులు ప్రతిసారి PINని నమోదు చేయవలసిన అవసరం లేకుండా క్లయింట్‌లతో జత కావచ్చు మరియు కనెక్షన్ సమయంలో నిర్వహించవచ్చు.
 
           ఈ సెట్టింగ్‌ను నిలిపివేస్తే, ఆపై ఈ లక్షణం అందుబాటులో ఉండదు.</translation>
+<translation id="7274077256421167535">USB పవర్ షేర్‌ను ప్రారంభించండి</translation>
 <translation id="7275334191706090484">నిర్వహించబడిన బుక్‌మార్క్‌లు</translation>
 <translation id="7291084543582732020">మీరు ఈ సెట్టింగ్‌ను ప్రారంభిస్తే, వినియోగదారులు Smart Lock ఉపయోగించడానికి అనుమతించబడతారు, అయితే పరికరాలు ఈ ఫీచర్ ఆవశ్యకాలకు అనుకూలంగా ఉండాలి.
 
@@ -3287,6 +3438,15 @@
       ఈ విధానం విలువ 0 అయితే, డిఫాల్ట్ కాష్ పరిమాణం ఉపయోగించబడుతుంది, వినియోగదారు దీనిని మార్చలేరు.
 
       ఈ విధానాన్ని సెట్ చేయకపోతే డిఫాల్ట్ పరిమాణం ఉపయోగించబడుతుంది మరియు వినియోగదారు దీనిని --disk-cache-size ఫ్లాగ్‌తో భర్తీ చేయగలుగుతారు.</translation>
+<translation id="759389052790680884">బ్యాటరీ ఛార్జింగ్ ఎంత శాతం ఛార్జ్ అయ్యాక నిలిపివేయాలో సెట్ చేయండి.
+
+          పేర్కొన్న నిలిపివేత ఛార్జింగ్ విలువను చేరుకున్నప్పుడు బ్యాటరీ ఛార్జింగ్ ఆపివేయబడుతుంది.
+
+          DeviceBatteryChargeCustomStartCharging తప్పనిసరిగా DeviceBatteryChargeCustomStopCharging కంటే తక్కువగా ఉండాలి.
+
+          DeviceBatteryChargeModeను పేర్కొనబడే శాతానికి సెట్ చేసినప్పుడు మాత్రమే ఈ విధానం ఉపయోగించబడుతుంది.
+
+          ఈ విధానాన్ని కన్ఫిగర్ చేయకపోయినా లేదా సెట్ చేయకుండా వదిలేసినా, ప్రామాణిక బ్యాటరీ ఛార్జ్ మోడ్ వర్తింపజేయబడుతుంది.</translation>
 <translation id="759957074386651883">సురక్షిత బ్రౌజింగ్‌ సెట్టింగ్‌లు</translation>
 <translation id="7604169113182304895">Android అనువర్తనాలు ఈ జాబితాకి ప్రాధాన్యత ఇవ్వడానికి స్వచ్ఛందంగా ఎంచుకోగలవు. మీరు దానికి ప్రాధాన్యత ఇవ్వడానికి వాటిని నిర్బంధం చేయలేరు.</translation>
 <translation id="7612157962821894603"><ph name="PRODUCT_NAME" /> స్టార్ట్-అప్ సమయంలో వర్తింపజేయాల్సిన సిస్టమ్ విస్తృత ఫ్లాగ్‌లు</translation>
@@ -3362,6 +3522,15 @@
 <translation id="7712109699186360774">సైట్ కెమెరా మరియు/లేదా మైక్రోఫోన్‌ను యాక్సెస్ చేయాలనుకునే ప్రతి సారీ అడగాలి</translation>
 <translation id="7713608076604149344">డౌన్‌లోడ్ పరిమితులు</translation>
 <translation id="7715711044277116530">ప్రెజెంటేషన్ మోడ్‌లో స్క్రీన్ కాంతివిహీనత ఆలస్యాన్ని లెక్కించే శాతం</translation>
+<translation id="7716781462866245042">అధునాతన బ్యాటరీ ఛార్జ్ మోడ్ రోజు కన్ఫిగరేషన్‌ను సెట్ చేయండి.
+
+          DeviceAdvancedBatteryChargeModeEnabledని ఒప్పునకు సెట్ చేసినప్పుడు మాత్రమే ఈ విధానం ఉపయోగించబడుతుంది.
+
+          ఈ విధానాన్ని కన్ఫిగర్ చేయకుంటే లేదా సెట్ చేయకుండా వదిలేస్తే, అధునాతన బ్యాటరీ ఛార్జ్ మోడ్ ఎల్లప్పుడూ నిలిపివేయబడుతుంది.
+
+          గమనిక: <ph name="CHARGE_START_TIME_FIELD_NAME" /> తప్పనిసరిగా <ph name="CHARGE_END_TIME_FIELD_NAME" /> కంటే తక్కువ ఉండాలి.
+
+          గమనిక: <ph name="CHARGE_START_TIME_FIELD_NAME" /> మరియు <ph name="CHARGE_END_TIME_FIELD_NAME" />లో <ph name="MINUTE_FIELD_NAME" /> ఫీల్డ్‌లో అనుమతించబడే విలువలు 0, 15, 30, 45.</translation>
 <translation id="7717938661004793600"><ph name="PRODUCT_OS_NAME" /> యాక్సెస్‌ ఫీచ‌ర్‌ల‌ను కాన్ఫిగర్ చేయండి.</translation>
 <translation id="7724994675283793633">ఈ విధానం HTTP కోసం 80 మరియు HTTPS కోసం 443 మినహా మిగిలిన పోర్ట్‌లలో HTTP/0.9ని ప్రారంభిస్తుంది.
 
@@ -3437,6 +3606,7 @@
       సైన్-ఇన్ స్క్రీన్‌లో స్క్రీన్ సేవర్‌గా ఉపయోగించబడే ఎక్స్‌టెన్షన్ idని నిర్ధారిస్తుంది. ఎక్స్‌టెన్షన్ తప్పనిసరిగా DeviceAppPack విధానం ద్వారా ఈ డొమైన్ కోసం కాన్ఫిగర్ చేయబడిన AppPackలో భాగంగా ఉండాలి.</translation>
 <translation id="7882857838942884046">Google సింక్‌ను నిలిపివేయడం వ‌ల్ల‌ Android బ్యాకప్ మరియు పునరుద్ధరణ సరిగ్గా పనిచేయవు.</translation>
 <translation id="7882890448959833986">OSకి మద్దతు లేదు హెచ్చరికను ఆపివేయి</translation>
+<translation id="7895553628261067384">రిమోట్ యాక్సెస్</translation>
 <translation id="7902255855035461275">ఈ జాబితాలోని ఆకృతులు అభ్యర్థిస్తున్న URL భద్రతా మూలాధారంతో సరిపోల్చబడతాయి. సరిపోలినది కనుగొనబడితే, ఎలాంటి ప్రేరేపణ లేకుండా, వీడియోను కాప్చర్ చేసే పరికరాలకు యాక్సెస్ మంజూరు చేయబడుతుంది.
 
 గమనిక: వెర్షన్ 45 వరకు, ఈ విధానానికి కియోస్క్ మోడ్‌లో మాత్రమే మద్దతు ఇవ్వబడింది.</translation>
@@ -3448,6 +3618,11 @@
 <translation id="7937491150792971922">బహుళ మూలాధారాలలోని ఎక్స్‌టెన్షన్ ఇన్‌స్టాల్ జాబితా విధానాలను ఒక్కటిగా కలపండి</translation>
 <translation id="7937766917976512374">వీడియో క్యాప్చర్‌ను అనుమతించడం లేదా తిరస్కరించడం</translation>
 <translation id="7941975817681987555">ఏ నెట్‌వర్క్ కనెక్షన్‌లోనూ నెట్‌వర్క్ చర్యలను అంచనా వేయవద్దు</translation>
+<translation id="7952007677054834789"><ph name="PRODUCT_NAME" />లో ప్రారంభ సమయంలో లోడ్ చేయాల్సిన పేజీలు, డిఫాల్ట్ హోమ్ పేజీ మరియు డిఫాల్ట్ కొత్త ట్యాబ్ పేజీని కన్ఫిగర్ చేస్తుంది, అలాగే వినియోగదారులు వాటిని మార్చకుండా నిరోధిస్తుంది.
+
+      కొత్త‌ ట్యాబ్ పేజీగా హోమ్ పేజీని ఎంచుకున్నప్పుడు లేదా దాన్ని URLగా సెట్ చేసి, హోమ్ పేజీ URLను పేర్కొన్నప్పుడు మాత్రమే, వినియోగదారు హోమ్ పేజీ సెట్టింగ్‌లు పూర్తిగా లాక్ చేయ‌బడతాయి. మీరు హోమ్ పేజీ URLను పేర్కొనకపోతే, 'chrome://newtab'ను పేర్కొనడం ద్వారా వినియోగదారు ఇప్పటికీ హోమ్ పేజీని కొత్త ట్యాబ్ పేజీగా సెట్ చేయగలుగుతారు.
+
+      'ప్రారంభ సమయంలో తీసుకోవాల్సిన చర్య' ఎంపికలో, మీరు 'జాబితాలోని URLలను తెరువు' ఎంచుకోకపోతే, 'ప్రారంభ సమయంలో తెరవాల్సిన URLలు' విధానం విస్మరించబడుతుంది.</translation>
 <translation id="7952958573604504839"><ph name="NETWORK_PREDICTION_OPTIONS_POLICY_NAME" />కు ప్రాధాన్యతనిస్తూ ఈ విధానం M48లో విస్మరించబడింది, M54లో తీసివేయబడింది.
 
 <ph name="PRODUCT_NAME" />లో నెట్‌వర్క్ సూచనను ప్రారంభిస్తుంది, ఈ సెట్టింగ్‌ను మార్చకుండా వినియోగదారులను నిరోధిస్తుంది.
@@ -3587,6 +3762,7 @@
 <translation id="8176035528522326671">ఎంటర్‌ప్రైజ్ వినియోగదారు కేవలం ప్రాథమిక బహుళ ప్రొఫైల్ వినియోగదారుగా ఉండేలా అనుమతించండి (ఎంటర్‌ప్రైజ్-నిర్వాహిత‌ వినియోగదారుల కోసం డిఫాల్ట్ ప్రవర్తన)</translation>
 <translation id="8214600119442850823">పాస్‌వర్డ్ నిర్వాహికిని కాన్ఫిగర్ చేస్తుంది.</translation>
 <translation id="8217516105848565518">ఈ విధానం నిలిపివేయబడింది. బదులుగా, దయచేసి RemoteAccessHostDomainListను ఉపయోగించండి.</translation>
+<translation id="8244171102276095471">TLSలో RC4 సైఫర్ సూట్‌లను ప్రారంభించండి</translation>
 <translation id="8244525275280476362">విధాన అప్రామాణీకరణ తర్వాత పొందడంలో గరిష్ట ఆలస్యం</translation>
 <translation id="8256688113167012935">సంబంధిత పరికర-స్థానిక ఖాతాకు లాగిన్ స్క్రీన్‌పై <ph name="PRODUCT_OS_NAME" /> చూపే ఖాతా పేరును నియంత్రిస్తుంది.
 
@@ -3627,6 +3803,7 @@
 <translation id="8312129124898414409">కీ ఉత్పాదనను ఉపయోగించడానికి వెబ్‌సైట్‌లను అనుమతించాలో లేదో నిర్ణయించడానికి మిమ్మల్ని అనుమతిస్తుంది. కీ ఉత్పాదనను ఉపయోగించడం అన్ని వెబ్‌సైట్‌లకు అనుమతించబడుతుంది లేదా అన్ని వెబ్‌సైట్‌లకు తిరస్కరించబడుతుంది.
 
           ఈ విధానాన్ని సెట్ చేయకుండా వదిలేస్తే, 'BlockKeygen' ఉపయోగించబడుతుంది, వినియోగదారు దీనిని మార్చగలుగుతారు.</translation>
+<translation id="8320149248919453401">బ్యాటరీ ఛార్జ్ మోడ్</translation>
 <translation id="8329984337216493753">ఈ విధానం రిటైల్ మోడ్‌‌లో మాత్రమే యాక్టివ్‌గా ఉంటుంది.
 
       DeviceIdleLogoutTimeout పేర్కొనబడినప్పుడు ఈ విధానం లాగ్ అవుట్ అమలు చేయబడటానికి ముందు వినియోగదారుకు చూపించిన కౌంట్ డౌన్ టైమర్‌తో హెచ్చరిక పెట్టె యొక్క వ్యవధిని నిర్వచిస్తుంది.
@@ -3796,6 +3973,7 @@
       సెట్ చేయకపోతే, డిఫాల్ట్ సమయం <ph name="PRODUCT_OS_NAME" /> పరికరాలకు 345600000 మిల్లీసెకన్లు (నాలుగు రోజులు) , అలాగే <ph name="PRODUCT_NAME" />కు 604800000 మిల్లీసెకన్లు (ఒక వారం) ఉపయోగించబడుతుంది.</translation>
 <translation id="8685024486845674965">పాస్‌వర్డ్‌ని తిరిగి ఉపయోగించినప్పుడు పాస్‌వర్డ్ రక్షణ హెచ్చరిక సక్రియం చేయబడుతుంది</translation>
 <translation id="8693243869659262736">అంత‌ర్గ‌త‌ DNS క్లయింట్‌ను ఉపయోగించండి</translation>
+<translation id="8698286761337647563">SAML వినియోగదారులకు తమ పాస్‌వర్డ్ గడువు ముగియడానికి ఎన్ని రోజుల ముందుగా వారికి తెలియజేయాలి</translation>
 <translation id="8703488928438047864">బోర్డ్ పరిస్థితిని నివేదించు</translation>
 <translation id="8703872185032220081">గరిష్ఠ పవర్ షిఫ్ట్ డే కాన్ఫిగరేషన్‌ను సెట్ చేయండి.
 
@@ -3840,6 +4018,7 @@
       ఈ సెట్టింగ్‌ను నిలిపివేసినా లేదా సెట్ చేయకపోయినా, ఆపై పాస్‌వర్డ్ రక్షణ సేవ వినియోగదారులను వారి పాస్‌వర్డ్ మార్చుకోవడానికి https://myaccounts.google.comకి పంపుతుంది.
       ఈ విధానం <ph name="MS_AD_NAME" /> డొమైన్‌తో అనుబంధితమైన Windows సందర్భాలు లేదా పరికర నిర్వహణ కోసం నమోదైన Windows 10 Pro లేదా Enterprise సందర్భాలలో మాత్రమే అందుబాటులో ఉంటుంది.</translation>
 <translation id="8798099450830957504">డిఫాల్ట్</translation>
+<translation id="8800453707696044281">బ్యాటరీ ఛార్జింగ్ ఎంత శాతం ఛార్జ్ అయ్యాక నిలిపివేయాలో సెట్ చేయండి</translation>
 <translation id="8801680448782904838">బ్రౌజర్ రీలాంచ్ లేదా పరికరం పునఃప్రారంభం సిఫార్సు చేస్తున్నట్లు లేదా అవసరమని వినియోగదారుకు తెలియజేస్తుంది</translation>
 <translation id="8818173863808665831">పరికరం యొక్క భౌగోళిక స్థానాన్ని నివేదించండి.
 
@@ -3971,6 +4150,11 @@
 ఈ విధానం SAMLను ఉపయోగించి ప్రామాణీకరించబడిన వినియోగదారులను మాత్రమే ప్రభావితం చేస్తుంది.
 
 విధానం విలువను సెకన్లలో పేర్కొనాలి.</translation>
+<translation id="9018338365267278833">ఇది <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />లో కనిపించే ఎక్స్‌టెన్షన్‌లు లేదా <ph name="EXTENSION_SETTINGS_POLICY_NAME" />లో కనిపించే ఎక్స్‌టెన్షన్‌లలో ఇన్‌స్టాలేషన్ మోడ్ బ్లాక్ చేయబడింది ఎంపికకు సెట్ చేయబడిన వాటిని తీసివేస్తుంది, దానితో పాటు గల స్థానిక వినియోగదారు డేటాను పూర్తిగా తొలగిస్తుంది.  స్థానికంగా నిల్వ చేయని వినియోగదారు డేటా పరిస్థితి ఏమి కాగలదో తెలుసుకోవడానికి ఎక్స్‌టెన్షన్‌ల గోప్యతా విధానాన్ని లేదా డేటా నిల్వ కొనసాగింపు విధానాన్ని చూడండి.
+
+      ఈ విధానాన్ని ప్రారంభించబడింది ఎంపికకు సెట్ చేసినప్పుడు, పైన పేర్కొన్న జాబితాలలోకి వచ్చే ఎక్స్‌టెన్షన్‌లు (ఇప్పటికే మెషీన్‌లో ఇన్‌స్టాల్ చేసి ఉంటే) ఆ మెషీన్ నుండి (స్థానిక వినియోగదారు డేటాతో సహా) పూర్తిగా తొలగించబడతాయి.
+
+      ఈ విధానాన్ని నిలిపివేయబడింది ఎంపికకు సెట్ చేస్తే లేదా సెట్ చేయకుండా వదిలేస్తే, పైన పేర్కొన్న జాబితాలలోకి వచ్చే ఎక్స్‌టెన్షన్‌లు (ఇప్పటికే మెషీన్‌లో ఇన్‌స్టాల్ చేసి ఉంటే మరియు బ్లాక్‌లిస్ట్ <ph name="EXTENSION_INSTALL_BLACKLIST_POLICY_NAME" />లో ప్రస్తుతం ఉంటే) మెషీన్‌లో నిలిపివేయబడతాయి మరియు ఇవి అన్ఇన్‌స్టాల్ చేయబడవు.</translation>
 <translation id="9027787254195333560">ఈ విధానం లాగిన్ స్క్రీన్‌లో వినియోగదారును సూచించే అవతార్ చిత్రాన్ని కాన్ఫిగర్ చేయడానికి మిమ్మల్ని అనుమతిస్తుంది. <ph name="PRODUCT_OS_NAME" /> అవతార్ చిత్రాన్ని ఏ URL నుండి డౌన్‌లోడ్ చేయాలో పేర్కొనడం ద్వారా విధానం సెట్ చేయబడుతుంది మరియు డౌన్‌లోడ్ సమగ్రతను ధృవీకరించడానికి క్రిప్టోగ్రాఫిక్ హాష్ ఉపయోగించబడుతుంది. చిత్రం తప్పనిసరిగా JPEG ఫార్మాట్‌లో ఉండాలి, దీని పరిమాణం 512kB మించకూడదు. URL తప్పనిసరిగా ఎటువంటి ప్రమాణీకరణ లేకుండానే యాక్సెస్ చేయగలిగేలా ఉండాలి.
 
 అవతార్ చిత్రం డౌన్‌లోడ్ చేయబడి, కాష్ చేయబడుతుంది. URL లేదా హాష్ మారిన ప్రతిసారి ఇది మళ్లీ డౌన్‌లోడ్ చేయబడుతుంది.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index 3a291b4..87238402 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -1523,9 +1523,9 @@
 
       Якщо це правило не налаштовано або має значення <ph name="BR_DISABLED" />, резервне копіювання й відновлення Android вимкнено.
 
-      Якщо цього для правила вибрано значення <ph name="BR_ENABLED" />, резервне копіювання й відновлення Android увімкнено.
+      Якщо для цього правила вибрано значення <ph name="BR_ENABLED" />, резервне копіювання й відновлення Android увімкнено.
 
-      Якщо цього для правила вибрано значення <ph name="BR_UNDER_USER_CONTROL" />, користувач вирішує, чи вмикати резервне копіювання й відновлення Android. Якщо ввімкнути цю функцію, дані додатків Android завантажуються на резервні сервери Android і відновлюються під час перевстановлення сумісних додатків.
+      Якщо для цього правила вибрано значення <ph name="BR_UNDER_USER_CONTROL" />, користувач вирішує, чи вмикати резервне копіювання й відновлення Android. Якщо ввімкнути цю функцію, дані додатків Android завантажуються на резервні сервери Android і відновлюються під час перевстановлення сумісних додатків.
 
       Зауважте, що це правило контролює стан резервного копіювання й відновлення Android лише під час початкового налаштування. Пізніше користувач може ввімкнути або вимкнути резервне копіювання й відновлення Android у налаштуваннях.</translation>
 <translation id="3831376478177535007">Якщо це налаштування ввімкнено, <ph name="PRODUCT_NAME" /> дозволяє вважати сертифікати, видані застарілими операціями PKI корпорації Symantec, надійними, якщо їх підтверджено та приєднано до визнаних сертифікатів центру сертифікації (ЦС).
diff --git a/components/safe_browsing/features.cc b/components/safe_browsing/features.cc
index 2d323f5..555863ecc 100644
--- a/components/safe_browsing/features.cc
+++ b/components/safe_browsing/features.cc
@@ -58,9 +58,6 @@
 const base::Feature kUseLocalBlacklistsV2{"SafeBrowsingUseLocalBlacklistsV2",
                                           base::FEATURE_DISABLED_BY_DEFAULT};
 
-const base::Feature kInspectRarContentFeature{"InspectRarContent",
-                                              base::FEATURE_ENABLED_BY_DEFAULT};
-
 const base::Feature kUseAPDownloadProtection{"UseAPDownloadProtection",
                                              base::FEATURE_DISABLED_BY_DEFAULT};
 
diff --git a/components/safe_browsing/features.h b/components/safe_browsing/features.h
index 12f7430..85606da 100644
--- a/components/safe_browsing/features.h
+++ b/components/safe_browsing/features.h
@@ -62,10 +62,6 @@
 // Controls whether Chrome on Android uses locally cached blacklists.
 extern const base::Feature kUseLocalBlacklistsV2;
 
-// Controls whether we inspect the content of RAR files, or just report the
-// filenames contained in the archive.
-extern const base::Feature kInspectRarContentFeature;
-
 // Controls whether we use AP download protection.
 extern const base::Feature kUseAPDownloadProtection;
 
diff --git a/components/strings/components_strings_es.xtb b/components/strings/components_strings_es.xtb
index 5f5352d..b9c3509 100644
--- a/components/strings/components_strings_es.xtb
+++ b/components/strings/components_strings_es.xtb
@@ -1,6 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="es">
+<translation id="1001338328714563407">Como administrador de tu dispositivo y de tu cuenta, <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="1008557486741366299">Ahora no</translation>
 <translation id="1010200102790553230">Cargar la página más tarde</translation>
 <translation id="1015730422737071372">Proporciónanos más detalles</translation>
@@ -300,6 +301,7 @@
 <translation id="2586657967955657006">Portapapeles</translation>
 <translation id="2587730715158995865">De <ph name="ARTICLE_PUBLISHER" />. Lee este y <ph name="OTHER_ARTICLE_COUNT" /> artículos más.</translation>
 <translation id="2587841377698384444">ID de la API del directorio:</translation>
+<translation id="2595719060046994702">Este dispositivo y esta cuenta no están administrados por ninguna empresa ni organización.</translation>
 <translation id="2597378329261239068">Este documento está protegido por contraseña. Introduce una contraseña.</translation>
 <translation id="2609632851001447353">Variaciones</translation>
 <translation id="2618023639789766142">C10 (sobre)</translation>
@@ -334,6 +336,7 @@
 <translation id="2781692009645368755">Google Pay</translation>
 <translation id="2784949926578158345">Se ha restablecido la conexión.</translation>
 <translation id="2788784517760473862">Tarjetas de crédito aceptadas</translation>
+<translation id="2792012897584536778">Los administradores de este dispositivo han configurado certificados de seguridad que pueden permitirles ver el contenido de los sitios web que visitas.</translation>
 <translation id="2794233252405721443">Sito web bloqueado</translation>
 <translation id="2799020568854403057">El sitio web al que vas a acceder contiene aplicaciones dañinas</translation>
 <translation id="2799223571221894425">Reiniciar</translation>
@@ -350,6 +353,7 @@
 <translation id="2903493209154104877">Direcciones</translation>
 <translation id="290376772003165898">¿La página no está en <ph name="LANGUAGE" />?</translation>
 <translation id="2909946352844186028">Se ha detectado un cambio de red.</translation>
+<translation id="2910133103376701357"><ph name="ENROLLMENT_DOMAIN" /> gestiona tu dispositivo y tu cuenta.</translation>
 <translation id="2916038427272391327">Cierra otros programas</translation>
 <translation id="2922350208395188000">No es posible comprobar el certificado del servidor.</translation>
 <translation id="2925673989565098301">Método de entrega</translation>
@@ -360,6 +364,7 @@
 <translation id="2948083400971632585">Puedes inhabilitar los servidores proxy configurados para una conexión en la página de configuración.</translation>
 <translation id="2955913368246107853">Cerrar la barra de búsqueda</translation>
 <translation id="2969319727213777354">Para establecer una conexión segura, el reloj debe estar configurado correctamente. Esto se debe a que los certificados que utilizan los sitios web para identificarse solo son válidos para períodos de tiempo específicos. Como el reloj de tu dispositivo no está configurado correctamente, Google Chrome no puede verificar estos certificados.</translation>
+<translation id="2970515157925768593">Puede cambiar la configuración de tu dispositivo y de tu cuenta de forma remota.</translation>
 <translation id="2972581237482394796">&amp;Rehacer</translation>
 <translation id="2977665033722899841"><ph name="ROW_NAME" />, opción seleccionada actualmente. <ph name="ROW_CONTENT" /></translation>
 <translation id="2982481275546140226">Borrar datos</translation>
@@ -371,6 +376,7 @@
 <translation id="3005723025932146533">Mostrar copia guardada</translation>
 <translation id="3008447029300691911">Introduce el código CVC de la tarjeta <ph name="CREDIT_CARD" />. Cuando la confirmes, su información se compartirá con este sitio web.</translation>
 <translation id="3010559122411665027">Entrada de lista "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
+<translation id="3014389611820813634">Como administrador de este dispositivo, <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="301521992641321250">Bloqueado automáticamente</translation>
 <translation id="3023071826883856138">You4 (sobre)</translation>
 <translation id="3024663005179499861">Tipo de política incorrecto</translation>
@@ -416,6 +422,7 @@
 <translation id="3287510313208355388">Descargar cuando haya conexión</translation>
 <translation id="3293642807462928945">Más información sobre la política <ph name="POLICY_NAME" /></translation>
 <translation id="3303855915957856445">No se han encontrado resultados de búsqueda</translation>
+<translation id="3311730110465560799">Puede cambiar la configuración de tu dispositivo de forma remota.</translation>
 <translation id="3320021301628644560">Añadir dirección de facturación</translation>
 <translation id="3324983252691184275">Carmesí</translation>
 <translation id="3338095232262050444">Es seguro</translation>
@@ -510,6 +517,7 @@
 <translation id="3761718714832595332">Ocultar estado</translation>
 <translation id="3765032636089507299">La página Navegación Segura está en construcción.</translation>
 <translation id="3778403066972421603">¿Quieres guardar esta tarjeta en tu cuenta de Google y en este dispositivo?</translation>
+<translation id="3779973883630527594">La empresa, el centro educativo o la organización que gestiona esta cuenta:</translation>
 <translation id="3781428340399460090">Rosa fucsia</translation>
 <translation id="3783418713923659662">Mastercard</translation>
 <translation id="3787705759683870569">Vencimiento: <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
@@ -549,6 +557,7 @@
 <translation id="4072486802667267160">Se ha producido un error al procesar el pedido. Vuelve a intentarlo.</translation>
 <translation id="4075732493274867456">El cliente y el servidor no son compatibles con la misma versión de protocolo SSL o de cifrado.</translation>
 <translation id="4079302484614802869">Se ha configurado el proxy para que use una URL de secuencia de comandos .pac, en lugar de servidores proxy fijos.</translation>
+<translation id="4082393374666368382">Configuración - Administración</translation>
 <translation id="4092411512356034591">¿Quieres ir a <ph name="DOMAIN" />?</translation>
 <translation id="4098354747657067197">El sitio web al que vas a acceder es engañoso</translation>
 <translation id="4103249731201008433">El número de serie del dispositivo no es válido.</translation>
@@ -679,6 +688,7 @@
 <translation id="4758311279753947758">Añadir información de contacto</translation>
 <translation id="4764776831041365478">Es posible que la página web <ph name="URL" /> esté temporalmente inactiva o que se haya trasladado definitivamente a otra dirección.</translation>
 <translation id="4771973620359291008">Se ha producido un error desconocido.</translation>
+<translation id="4780900888022378816"><ph name="ENROLLMENT_DOMAIN" /> gestiona tu dispositivo y <ph name="ACCOUNT_DOMAIN" /> gestiona tu cuenta.</translation>
 <translation id="4785689107224900852">Cambiar a esta pestaña</translation>
 <translation id="4798078619018708837">Introduce la fecha de vencimiento y el CVC de <ph name="CREDIT_CARD" /> para actualizar la información de tu tarjeta. Una vez que confirmes esta acción, la información de la tarjeta de tu cuenta de Google se compartirá con este sitio web.</translation>
 <translation id="4800132727771399293">Comprueba la fecha de caducidad y el código CVC, y vuelve a intentarlo</translation>
@@ -704,6 +714,7 @@
 <translation id="4926159001844873046"><ph name="SITE" /> dice</translation>
 <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation>
 <translation id="4943872375798546930">Sin resultados</translation>
+<translation id="4945672369594656571">Controla cómo se gestionan los datos de tu dispositivo y de tu cuenta. Google trata los datos de tu dispositivo y de tu cuenta exclusivamente bajo la dirección del administrador de tu dispositivo y de tu cuenta, y solo para los fines especificados por el administrador de tu dispositivo y de tu cuenta.</translation>
 <translation id="4950898438188848926">Botón de cambio de pestaña; pulsa Intro para cambiar a la pestaña abierta, <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" /></translation>
 <translation id="495170559598752135">Acciones</translation>
 <translation id="4955242332710481440">A5-Extra</translation>
@@ -717,6 +728,7 @@
 <translation id="5017554619425969104">Texto copiado</translation>
 <translation id="5018422839182700155">No se puede abrir esta página</translation>
 <translation id="5019198164206649151">El almacén secundario está en mal estado.</translation>
+<translation id="5020154601324912079">Controla cómo se gestionan los datos de tu dispositivo. Google trata los datos de tu dispositivo exclusivamente bajo la dirección del administrador de tu dispositivo y solo para los fines especificados por el administrador de tu dispositivo.</translation>
 <translation id="5023310440958281426">Consulta las políticas del administrador</translation>
 <translation id="5029568752722684782">Borrar copia</translation>
 <translation id="503069730517007720">Se necesita un certificado raíz para "<ph name="SOFTWARE_NAME" />", pero no está instalado. El administrador de TI debe comprobar las instrucciones de configuración de "<ph name="SOFTWARE_NAME" />" para solucionar este problema. <ph name="FURTHER_EXPLANATION" /></translation>
@@ -874,6 +886,7 @@
 <translation id="5838278095973806738">No deberías introducir información confidencial en este sitio web (por ejemplo, contraseñas o tarjetas de crédito) porque los atacantes podrían robarla.</translation>
 <translation id="5860033963881614850">No</translation>
 <translation id="5863847714970149516">Es posible que la página a la que vas a acceder intente aplicar algún cargo</translation>
+<translation id="5865951947699094510">Puede cambiar la configuración de tu cuenta de forma remota.</translation>
 <translation id="5866257070973731571">Añade un número de teléfono</translation>
 <translation id="5869405914158311789">No se puede acceder a este sitio web</translation>
 <translation id="5869522115854928033">Contraseñas guardadas</translation>
@@ -893,6 +906,7 @@
 <translation id="5975083100439434680">Reducir</translation>
 <translation id="5980920751713728343">Index-3x5</translation>
 <translation id="598637245381783098">No se ha podido abrir la aplicación de pago</translation>
+<translation id="5988826871883769516">Tu dispositivo está administrado por <ph name="ENROLLMENT_DOMAIN" />.</translation>
 <translation id="5989320800837274978">No se han especificado servidores proxy fijos ni una URL de secuencia de comandos .pac.</translation>
 <translation id="5990559369517809815">Una extensión ha bloqueado el envío de solicitudes al servidor.</translation>
 <translation id="6008256403891681546">JCB</translation>
@@ -910,6 +924,7 @@
 <translation id="6047233362582046994">Si entiendes los riesgos para tu seguridad, puedes <ph name="BEGIN_LINK" />acceder a este sitio web<ph name="END_LINK" /> antes de que se hayan eliminado las aplicaciones dañinas.</translation>
 <translation id="6047927260846328439">Es posible que este contenido intente engañarte para que instales software o reveles información personal. <ph name="BEGIN_LINK" />Mostrar de todos modos<ph name="END_LINK" /></translation>
 <translation id="6051221802930200923">No puedes acceder a <ph name="SITE" /> en este momento porque el sitio web utiliza la fijación de certificados. Los ataques y los errores de red suelen ser temporales, por lo que es probable que esta página funcione más tarde.</translation>
+<translation id="6052284303005792909">•</translation>
 <translation id="6058977677006700226">¿Quieres usar las tarjetas en todos tus dispositivos?</translation>
 <translation id="6059925163896151826">Dispositivos USB</translation>
 <translation id="6080696365213338172">Has accedido al contenido mediante un certificado proporcionado por el administrador. Los datos que proporciones a <ph name="DOMAIN" /> pueden ser interceptados por tu administrador.</translation>
@@ -979,6 +994,7 @@
 <translation id="6508722015517270189">Reinicia Chrome</translation>
 <translation id="6529602333819889595">&amp;Rehacer eliminación</translation>
 <translation id="6534179046333460208">Sugerencias de la Web física</translation>
+<translation id="6554795675067793129"><ph name="ENROLLMENT_DOMAIN" /> administra tu cuenta.</translation>
 <translation id="6556866813142980365">Rehacer</translation>
 <translation id="6563469144985748109">Tu administrador aún no la ha aprobado</translation>
 <translation id="6569060085658103619">Estas viendo la página de una extensión</translation>
@@ -1061,6 +1077,7 @@
 <translation id="7062635574500127092">Turquesa</translation>
 <translation id="7064851114919012435">Información de contacto</translation>
 <translation id="7079718277001814089">Este sitio web contiene software malicioso</translation>
+<translation id="7081564429925484109">Advertencia: Esta política no se ha combinado tal como se especifica en la política PolicyListMultipleSourceMergeList porque no es una lista.</translation>
 <translation id="7087282848513945231">Condado</translation>
 <translation id="7090678807593890770">Busca <ph name="LINK" /> en Google</translation>
 <translation id="7108338896283013870">Ocultar</translation>
@@ -1134,6 +1151,7 @@
 <translation id="741007362987735528">Wide-Format</translation>
 <translation id="7416351320495623771">Gestionar contraseñas…</translation>
 <translation id="7419106976560586862">Ruta del perfil</translation>
+<translation id="7424427397225027541">Controla cómo se gestionan los datos de tu cuenta. Google trata los datos de tu cuenta exclusivamente bajo la dirección del administrador de tu cuenta y solo para los fines especificados por el administrador de tu cuenta.</translation>
 <translation id="7437289804838430631">Añade la información de contacto</translation>
 <translation id="7440140511386898319">Contenido sin conexión</translation>
 <translation id="7441627299479586546">Asunto de política incorrecto</translation>
@@ -1220,6 +1238,7 @@
 <translation id="780301667611848630">No, gracias</translation>
 <translation id="7805768142964895445">Estado</translation>
 <translation id="7806344367022510803">Cambia la configuración del motor de búsqueda en Chrome</translation>
+<translation id="7810209002420871817">Como administrador de tu cuenta, <ph name="ACCOUNT_DOMAIN" />:</translation>
 <translation id="7812922009395017822">Mir</translation>
 <translation id="7813600968533626083">¿Eliminar sugerencia de formulario de Chrome?</translation>
 <translation id="7815407501681723534">Se han encontrado <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> de <ph name="SEARCH_STRING" /></translation>
diff --git a/components/strings/components_strings_fil.xtb b/components/strings/components_strings_fil.xtb
index f25ab08..945c6ce4 100644
--- a/components/strings/components_strings_fil.xtb
+++ b/components/strings/components_strings_fil.xtb
@@ -1,6 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="fil">
+<translation id="1001338328714563407">Bilang manager ng iyong device at account, <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="1008557486741366299">Hindi Ngayon</translation>
 <translation id="1010200102790553230">I-load ang page sa ibang pagkakataon</translation>
 <translation id="1015730422737071372">Magbigay ng mga karagdagang detalye</translation>
@@ -308,6 +309,7 @@
 <translation id="2586657967955657006">Clipboard</translation>
 <translation id="2587730715158995865">Mula sa <ph name="ARTICLE_PUBLISHER" />. Basahin ito at ang <ph name="OTHER_ARTICLE_COUNT" /> (na) iba pang kwento.</translation>
 <translation id="2587841377698384444">Directory API ID:</translation>
+<translation id="2595719060046994702">Ang device at account na ito ay hindi pinapamahalaan ng kumpanya o iba pang organisasyon.</translation>
 <translation id="2597378329261239068">Protektado ng password ang dokumentong ito.  Mangyaring magpasok ng password.</translation>
 <translation id="2609632851001447353">Mga Pagkakaiba-iba</translation>
 <translation id="2618023639789766142">C10 (Envelope)</translation>
@@ -342,6 +344,7 @@
 <translation id="2781692009645368755">Google Pay</translation>
 <translation id="2784949926578158345">Na-reset ang koneksyon.</translation>
 <translation id="2788784517760473862">Mga tinatanggap na credit card</translation>
+<translation id="2792012897584536778">Nag-set up ang mga administrator ng device na ito ng mga certificate ng seguridad na puwedeng magbigay-daan sa kanilang matingnan ang content ng mga website na binibisita mo.</translation>
 <translation id="2794233252405721443">Naka-block ang site</translation>
 <translation id="2799020568854403057">Naglalaman ng mga mapaminsalang app ang pupuntahang site</translation>
 <translation id="2799223571221894425">Ilunsad Muli</translation>
@@ -358,6 +361,7 @@
 <translation id="2903493209154104877">Mga Address</translation>
 <translation id="290376772003165898">Hindi nakasalin ang page sa <ph name="LANGUAGE" />?</translation>
 <translation id="2909946352844186028">May nakitang pagbabago sa network.</translation>
+<translation id="2910133103376701357">Ang iyong device at account ay pinapamahalaan ng <ph name="ENROLLMENT_DOMAIN" />.</translation>
 <translation id="2916038427272391327">Isara ang iba pang program</translation>
 <translation id="2922350208395188000">Hindi masuri ang certificate ng server.</translation>
 <translation id="2925673989565098301">Paraan ng Paghahatid</translation>
@@ -368,6 +372,7 @@
 <translation id="2948083400971632585">Maaari mong i-disable ang anumang mga proxy na naka-configure para sa isang koneksyon mula sa pahina ng mga setting.</translation>
 <translation id="2955913368246107853">Isara ang bar sa paghahanap</translation>
 <translation id="2969319727213777354">Upang makapagtatag ng secure na koneksyon, kailangang itakda nang tama ang iyong orasan. Ito ay dahil sa may-bisa lang ang mga certificate na ginagamit ng mga website upang tukuyin ang mga sarili ng mga ito sa loob ng mga partikular na tagal ng panahon. Dahil mali ang orasan ng iyong device, hindi ma-verify ng Google Chrome ang mga certificate na ito.</translation>
+<translation id="2970515157925768593">Puwedeng baguhin ang pag-set up ng iyong device at account nang malayuan.</translation>
 <translation id="2972581237482394796">&amp;I-redo</translation>
 <translation id="2977665033722899841">Kasalukuyang napili ang <ph name="ROW_NAME" />. <ph name="ROW_CONTENT" /></translation>
 <translation id="2982481275546140226">I-clear ang Data</translation>
@@ -379,6 +384,7 @@
 <translation id="3005723025932146533">Ipakita ang naka-save na kopya</translation>
 <translation id="3008447029300691911">Ilagay ang CVC para sa <ph name="CREDIT_CARD" />. Kapag nagkumpirma ka na, ibabahagi ang mga detalye ng iyong card sa site na ito.</translation>
 <translation id="3010559122411665027">Listahan ng entry na "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
+<translation id="3014389611820813634">Bilang manager ng device na ito, <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="301521992641321250">Awtomatikong na-block</translation>
 <translation id="3023071826883856138">You4 (Envelope)</translation>
 <translation id="3024663005179499861">Maling uri ng patakaran</translation>
@@ -424,6 +430,7 @@
 <translation id="3287510313208355388">I-download kapag online</translation>
 <translation id="3293642807462928945">Matuto pa tungkol sa patakarang <ph name="POLICY_NAME" /></translation>
 <translation id="3303855915957856445">Walang nakitang resulta ng paghahanap</translation>
+<translation id="3311730110465560799">Puwedeng malayuang baguhin ang setup ng iyong device.</translation>
 <translation id="3320021301628644560">Magdagdag ng billing address</translation>
 <translation id="3324983252691184275">Crimson</translation>
 <translation id="3338095232262050444">Secure</translation>
@@ -518,6 +525,7 @@
 <translation id="3761718714832595332">Itago ang status</translation>
 <translation id="3765032636089507299">Kasalukuyang ginagawa ang Ligtas na Pag-browse.</translation>
 <translation id="3778403066972421603">Gusto mo bang i-save ang card na ito sa iyong Google Account at sa device na ito?</translation>
+<translation id="3779973883630527594">Ang kumpanya, paaralan, o organisasyong namamahala sa account na ito:</translation>
 <translation id="3781428340399460090">Hot Pink</translation>
 <translation id="3783418713923659662">Mastercard</translation>
 <translation id="3787705759683870569">Mag-e-expire sa <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
@@ -557,6 +565,7 @@
 <translation id="4072486802667267160">Nagkaroon ng error sa pagproseso ng iyong order. Pakisubukang muli.</translation>
 <translation id="4075732493274867456">Hindi sinusuportahan ng client at server ang isang karaniwang bersyon o cipher suite ng SSL protocol.</translation>
 <translation id="4079302484614802869">Nakatakda ang configuration ng proxy upang gumamit ng isang .pac script URL, hindi ng mga hindi nababagong proxy server.</translation>
+<translation id="4082393374666368382">Mga Setting - Pamamahala</translation>
 <translation id="4092411512356034591">Magpatuloy sa <ph name="DOMAIN" />?</translation>
 <translation id="4098354747657067197">Mapupunta sa nakakapanlinlang na site</translation>
 <translation id="4103249731201008433">Di-wasto ang serial number ng device</translation>
@@ -687,6 +696,7 @@
 <translation id="4758311279753947758">Magdagdag ng impormasyon sa pakikipag-ugnayan</translation>
 <translation id="4764776831041365478">Ang webpage sa <ph name="URL" /> ay maaaring pansamantalang hindi gumagana o maaaring permanente itong inilipat sa isang bagong web address.</translation>
 <translation id="4771973620359291008">Isang hindi alam na error ang nangyari.</translation>
+<translation id="4780900888022378816">Pinapamahalaan ng <ph name="ENROLLMENT_DOMAIN" /> ang iyong device at pinapamahalaan ng <ph name="ACCOUNT_DOMAIN" /> ang account mo.</translation>
 <translation id="4785689107224900852">Lumipat sa tab na ito</translation>
 <translation id="4798078619018708837">Ilagay ang petsa ng pag-expire at CVC para sa <ph name="CREDIT_CARD" /> para i-update ang mga detalye ng iyong card. Pagkatapos mong magkumpirma, ibabahagi sa site na ito ang mga detalye ng card mula sa iyong Google Account.</translation>
 <translation id="4800132727771399293">Tingnan ang iyong petsa ng pag-expire at CVC at subukang muli</translation>
@@ -712,6 +722,7 @@
 <translation id="4926159001844873046">Isinasaad ng <ph name="SITE" /> na</translation>
 <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation>
 <translation id="4943872375798546930">Walang mga resulta</translation>
+<translation id="4945672369594656571">Kinokontrol kung paano pinapamahalaan ang data ng iyong device at account. Pinoproseso ng Google ang data ng iyong device at account nang eksklusibo sa ilalim ng direksyon ng device at account manager mo at para lang sa mga layuning tinukoy ng iyong device at account manager.</translation>
 <translation id="4950898438188848926">Button sa paglipat ng tab, pindutin ang Enter para lumipat sa nakabukas na tab, na <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" /></translation>
 <translation id="495170559598752135">Mga Pagkilos</translation>
 <translation id="4955242332710481440">A5-Extra</translation>
@@ -725,6 +736,7 @@
 <translation id="5017554619425969104">Text na kinopya mo</translation>
 <translation id="5018422839182700155">Hindi mabuksan ang page na ito</translation>
 <translation id="5019198164206649151">Hindi maganda ang katayuan ng backing store</translation>
+<translation id="5020154601324912079">Kinokontrol kung paano pinapangasiwaan ang data ng iyong device. Pinoproseso ng Google ang data ng iyong device nang eksklusibo sa ilalim ng direksyon ng device manager mo at para lang sa mga layuning tinukoy ng iyong device manager.</translation>
 <translation id="5023310440958281426">Suriin ang mga patakaran ng iyong administrator</translation>
 <translation id="5029568752722684782">I-clear ang kopya</translation>
 <translation id="503069730517007720">Kinakailangan ang root certificate para sa "<ph name="SOFTWARE_NAME" />" ngunit hindi ito naka-install. Dapat tingnan ng IT administrator ang mga tagubilin sa pag-configure para sa "<ph name="SOFTWARE_NAME" />" upang maayos ang problemang ito. <ph name="FURTHER_EXPLANATION" /></translation>
@@ -882,6 +894,7 @@
 <translation id="5838278095973806738">Hindi ka dapat maglagay ng anumang sensitibong impormasyon sa site na ito (halimbawa, mga password o credit card), dahil maaari itong nakawin ng mga umaatake.</translation>
 <translation id="5860033963881614850">Naka-off</translation>
 <translation id="5863847714970149516">Maaari kang singilin sa susunod na page</translation>
+<translation id="5865951947699094510">Puwedeng baguhin nang malayuan ang pag-set up ng iyong account.</translation>
 <translation id="5866257070973731571">Magdagdag ng Numero ng Telepono</translation>
 <translation id="5869405914158311789">Hindi makakonekta sa site na ito</translation>
 <translation id="5869522115854928033">Mga naka-save na password</translation>
@@ -901,6 +914,7 @@
 <translation id="5975083100439434680">Mag-zoom out</translation>
 <translation id="5980920751713728343">Index-3x5</translation>
 <translation id="598637245381783098">Hindi mabuksan ang app sa pagbabayad</translation>
+<translation id="5988826871883769516">Pinapamahalaan ng <ph name="ENROLLMENT_DOMAIN" /> ang iyong device.</translation>
 <translation id="5989320800837274978">Hindi tunukoy ang alinman sa mga hindi nababagong proxy server o isang .pac script URL.</translation>
 <translation id="5990559369517809815">Na-block ng isang extension ang mga kahilingan sa server.</translation>
 <translation id="6008256403891681546">JCB</translation>
@@ -918,6 +932,7 @@
 <translation id="6047233362582046994">Kung nauunawaan mo ang mga panganib sa iyong seguridad, maaari mong <ph name="BEGIN_LINK" />bisitahin ang site na ito<ph name="END_LINK" /> bago maalis ang mga mapaminsalang app.</translation>
 <translation id="6047927260846328439">Maaaring subukan ng content na ito na linlangin kang mag-install ng software o maghayag ng personal na impormasyon. <ph name="BEGIN_LINK" />Ipakita pa rin<ph name="END_LINK" /></translation>
 <translation id="6051221802930200923">Hindi mo maaaring bisitahin ang <ph name="SITE" /> sa ngayon dahil gumagamit ng pag-pin ng certificate ang website. Karaniwang pansamantala lang ang mga error at pag-atake sa network, kaya malamang na gagana ang page na ito sa ibang pagkakataon.</translation>
+<translation id="6052284303005792909">•</translation>
 <translation id="6058977677006700226">Gamitin ang iyong mga card sa lahat ng device mo?</translation>
 <translation id="6059925163896151826">Mga USB device</translation>
 <translation id="6080696365213338172">Nag-access ka ng nilalaman gamit ang isang certificate na ibinigay ng administrator. Maaaring harangin ng iyong administrator ang data na ibibigay mo sa <ph name="DOMAIN" />.</translation>
@@ -987,6 +1002,7 @@
 <translation id="6508722015517270189">I-restart ang Chrome</translation>
 <translation id="6529602333819889595">&amp;Gawing Muli ang Pagtanggal</translation>
 <translation id="6534179046333460208">Mga suhestyon sa Pisikal na Web</translation>
+<translation id="6554795675067793129">Pinapamahalaan ng <ph name="ENROLLMENT_DOMAIN" /> ang iyong account.</translation>
 <translation id="6556866813142980365">Redo</translation>
 <translation id="6563469144985748109">Hindi pa ito inaaprubahan ng iyong manager</translation>
 <translation id="6569060085658103619">Isang page ng extension ang tinitingnan mo</translation>
@@ -1069,6 +1085,7 @@
 <translation id="7062635574500127092">Teal</translation>
 <translation id="7064851114919012435">Impormasyon sa pakikipag-ugnayan</translation>
 <translation id="7079718277001814089">Naglalaman ng malware ang site na ito</translation>
+<translation id="7081564429925484109">Babala: Hindi na-merge ang patakarang ito gaya ng tinukoy sa patakarang PolicyListMultipleSourceMergeList dahil hindi ito isang listahan.</translation>
 <translation id="7087282848513945231">Lalawigan</translation>
 <translation id="7090678807593890770">Hanapin sa Google ang <ph name="LINK" /></translation>
 <translation id="7108338896283013870">Itago</translation>
@@ -1145,6 +1162,7 @@
 <translation id="741007362987735528">Wide-Format</translation>
 <translation id="7416351320495623771">Pamahalaan ang Mga Password...</translation>
 <translation id="7419106976560586862">Path ng Profile</translation>
+<translation id="7424427397225027541">Kinokontrol kung paano pinapangasiwaan ang data ng iyong account. Pinoproseso ng Google ang data ng iyong account nang eksklusibo sa ilalim ng direksyon ng account manager mo at para lang sa mga layuning tinukoy ng iyong account manager.</translation>
 <translation id="7437289804838430631">Magdagdag ng Impormasyon ng Contact</translation>
 <translation id="7440140511386898319">Mag-explore habang offline</translation>
 <translation id="7441627299479586546">Maling paksa ng patakaran</translation>
@@ -1231,6 +1249,7 @@
 <translation id="780301667611848630">Hindi salamat</translation>
 <translation id="7805768142964895445">Katayuan</translation>
 <translation id="7806344367022510803">Baguhin ang mga setting ng Search Engine sa Chrome</translation>
+<translation id="7810209002420871817">Bilang manager ng iyong account, <ph name="ACCOUNT_DOMAIN" />:</translation>
 <translation id="7812922009395017822">Mir</translation>
 <translation id="7813600968533626083">Alisin ang suhestyon sa Chrome?</translation>
 <translation id="7815407501681723534">Nakakita ng <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> para sa '<ph name="SEARCH_STRING" />'</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb
index 64890df..9274201 100644
--- a/components/strings/components_strings_hi.xtb
+++ b/components/strings/components_strings_hi.xtb
@@ -204,7 +204,7 @@
     कि उसके सभी अनुरोधों पर सुरक्षा नीति लागू की जाए. लेकिन अब इसने
     अमान्य नीति लागू कर दी है, जिस वजह से
     ब्राउज़र <ph name="SITE" /> के लिए आपका अनुरोध पूरा नहीं कर पा रहा है.</translation>
-<translation id="2025186561304664664">प्रॉक्‍सी स्‍वत: कॉन्‍फ़‍िगर पर सेट है.</translation>
+<translation id="2025186561304664664">प्रॉक्‍सी अपने-आप कॉन्‍फ़‍िगर पर सेट है.</translation>
 <translation id="2030481566774242610">क्या आप मतलब <ph name="LINK" /> से है?</translation>
 <translation id="2032962459168915086"><ph name="BEGIN_LINK" />प्रॉक्सी और फायरवॉल की जाँच करें<ph name="END_LINK" /></translation>
 <translation id="2053111141626950936"><ph name="LANGUAGE" /> भाषा के पेजों का अनुवाद नहीं किया जाएगा.</translation>
@@ -492,7 +492,7 @@
 <translation id="3615877443314183785">खत्म होने की मान्य तारीख डालें</translation>
 <translation id="36224234498066874">ब्राउज़िंग डेटा साफ़ करें...</translation>
 <translation id="362276910939193118">पूरा इतिहास दिखाएं</translation>
-<translation id="3630155396527302611">यदि वह नेटवर्क एक्सेस करने की अनुमति पाए हुए प्रोग्राम के रूप में पहले से ही सूची में शामिल है, तो
+<translation id="3630155396527302611">अगर वह नेटवर्क एक्सेस करने की अनुमति पाए हुए प्रोग्राम के रूप में पहले से ही सूची में शामिल है, तो
       उसे सूची से हटाने और फिर से जोड़ने की कोशिश करें..</translation>
 <translation id="3640766068866876100">इंडेक्स-4x6-एक्स्ट्रा</translation>
 <translation id="3650584904733503804">मान्यकरण सफल</translation>
diff --git a/components/strings/components_strings_ml.xtb b/components/strings/components_strings_ml.xtb
index aa68c04..54d04fc 100644
--- a/components/strings/components_strings_ml.xtb
+++ b/components/strings/components_strings_ml.xtb
@@ -1,6 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ml">
+<translation id="1001338328714563407">നിങ്ങളുടെ ഉപകരണത്തിന്റെയും അക്കൗണ്ടിന്റെയും മാനേജരെന്ന നിലയിൽ, <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="1008557486741366299">ഇപ്പോഴല്ല</translation>
 <translation id="1010200102790553230">പേജ് പിന്നീട് ലോഡ് ചെയ്യുക</translation>
 <translation id="1015730422737071372">കൂടുതൽ വിശദാംശങ്ങൾ നൽകുക</translation>
@@ -300,6 +301,7 @@
 <translation id="2586657967955657006">ക്ലിപ്പ്ബോർഡ്</translation>
 <translation id="2587730715158995865"><ph name="ARTICLE_PUBLISHER" /> എന്നയാളുടെ ലേഖനം. ഇതും മറ്റ് <ph name="OTHER_ARTICLE_COUNT" /> ലേഖനങ്ങളും വായിക്കുക.</translation>
 <translation id="2587841377698384444">ഡയറക്‌ടറി API ഐഡി:</translation>
+<translation id="2595719060046994702">ഏതെങ്കിലും കമ്പനിയോ മറ്റ് സ്ഥാപനങ്ങളോ മാനേജ് ചെയ്യുന്നതല്ല ഈ ഉപകരണവും അക്കൗണ്ടും.</translation>
 <translation id="2597378329261239068">ഈ പ്രമാണം പാസ്‌വേഡ് പരിരക്ഷിതമാണ്.  ദയവായി ഒരു പാസ്‌വേഡ് നല്‍‌കുക.</translation>
 <translation id="2609632851001447353">വേരിയേഷനുകൾ</translation>
 <translation id="2618023639789766142">C10 (എൻവലപ്പ്)</translation>
@@ -334,6 +336,7 @@
 <translation id="2781692009645368755">Google Pay</translation>
 <translation id="2784949926578158345">കണക്ഷന്‍ പുനഃസജ്ജമാക്കിയതാണ്.</translation>
 <translation id="2788784517760473862">ക്രെഡിറ്റ് കാർഡുകൾ സ്വീകരിക്കുന്നു</translation>
+<translation id="2792012897584536778">ഈ ഉപകരണത്തിന്റെ അഡ്‌മിന്മാർ സുരക്ഷാ സർട്ടിഫിക്കറ്റുകൾ സജ്ജീകരിച്ചിട്ടുണ്ട്, നിങ്ങൾ സന്ദർശിക്കുന്ന വെബ്‌സൈറ്റുകളുടെ ഉള്ളടക്കം കാണാൻ അവ അവരെ അനുവദിച്ചേക്കാം.</translation>
 <translation id="2794233252405721443">സൈറ്റ് ബ്ലോക്കുചെയ്‌തു</translation>
 <translation id="2799020568854403057">നിങ്ങൾ പോകുന്ന സൈറ്റിൽ ദോഷകരമായ ആപ്പുകളുണ്ട്</translation>
 <translation id="2799223571221894425">വീണ്ടും സമാരംഭിക്കുക</translation>
@@ -350,6 +353,7 @@
 <translation id="2903493209154104877">വിലാസങ്ങള്‍‌</translation>
 <translation id="290376772003165898">പേജ് <ph name="LANGUAGE" /> ഭാഷയിലല്ലേ?</translation>
 <translation id="2909946352844186028">ഒരു നെറ്റ്‌വർക്ക് മാറ്റം കണ്ടെത്തി.</translation>
+<translation id="2910133103376701357">നിങ്ങളുടെ ഉപകരണവും അക്കൗണ്ടും <ph name="ENROLLMENT_DOMAIN" /> മാനേജ് ചെയ്യുന്നു.</translation>
 <translation id="2916038427272391327">മറ്റ് പ്രോഗ്രാമുകൾ അടയ്‌ക്കുക</translation>
 <translation id="2922350208395188000">സെര്‍വറിന്‍റെ സര്‍ട്ടിഫിക്കറ്റ് പരിശോധിക്കാന്‍ കഴിയില്ല.</translation>
 <translation id="2925673989565098301">ഡെലിവറി രീതി</translation>
@@ -360,6 +364,7 @@
 <translation id="2948083400971632585">കണക്ഷനായി കോൺഫിഗർ ചെയ്‌ത ഏതൊരു പ്രോക്‌സികളും ക്രമീകരണങ്ങൾ പേജിൽ നിന്ന് നിങ്ങൾക്ക് പ്രവർത്തനരഹിതമാക്കാനാകും.</translation>
 <translation id="2955913368246107853">ഫൈന്‍ഡ് ബാര്‍ അടയ്ക്കുക</translation>
 <translation id="2969319727213777354">ഒരു സുരക്ഷിത കണക്ഷൻ സ്ഥാപിക്കുന്നതിന്, നിങ്ങളുടെ ക്ലോക്ക് ശരിയായി സജ്ജീകരിക്കേണ്ടതുണ്ട്. വെബ്‌സൈറ്റുകൾ സ്വയം തിരിച്ചറിയുന്നതിന് ഉപയോഗിക്കുന്ന സർട്ടിഫിക്കറ്റുകൾ, നിർദ്ദിഷ്‌ട സമയ പരിധിയിൽ മാത്രം സാധുതയുള്ളതിനാലാണിത്. നിങ്ങളുടെ ഉപകരണത്തിന്റെ ക്ലോക്ക് തെറ്റായിരിക്കുന്നതിനാൽ, Google Chrome-ന് ഈ സർട്ടിഫിക്കറ്റുകൾ പരിശോധിച്ചുറപ്പിക്കാനാവില്ല.</translation>
+<translation id="2970515157925768593">നിങ്ങളുടെ ഉപകരണ, അക്കൗണ്ട് സജ്ജീകരണം റിമോട്ടായി മാറ്റാനാവും.</translation>
 <translation id="2972581237482394796">&amp;വീണ്ടും ചെയ്യുക</translation>
 <translation id="2977665033722899841"><ph name="ROW_NAME" />, നിലവിൽ തിരഞ്ഞെടുത്തു. <ph name="ROW_CONTENT" /></translation>
 <translation id="2982481275546140226">ഡാറ്റ മായ്‌ക്കുക</translation>
@@ -371,6 +376,7 @@
 <translation id="3005723025932146533">സംരക്ഷിച്ച പകർപ്പ് കാണിക്കുക</translation>
 <translation id="3008447029300691911"><ph name="CREDIT_CARD" />-ന്‍റെ CVC നൽകുക. സ്ഥിരീകരിച്ച് കഴിഞ്ഞാൽ, നിങ്ങളുടെ കാർഡ് വിശദാംശങ്ങൾ ഈ സൈറ്റുമായി പങ്കിടും.</translation>
 <translation id="3010559122411665027">ലിസ്റ്റ് എൻട്രി "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
+<translation id="3014389611820813634">ഈ ഉപകരണത്തിന്റെ മാനേജരെന്ന നിലയിൽ, <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="301521992641321250">സ്വയമേവ ബ്ലോക്കുചെയ്‌തു</translation>
 <translation id="3023071826883856138">You4 (എൻവലപ്പ്)</translation>
 <translation id="3024663005179499861">തെറ്റായ നയ തരം</translation>
@@ -415,6 +421,7 @@
 <translation id="3287510313208355388">ഓൺലൈൻ ആയിരിക്കുന്ന സമയത്ത് ഡൗൺലോഡുചെയ്യുക</translation>
 <translation id="3293642807462928945"><ph name="POLICY_NAME" /> നയത്തെ കുറിച്ച് കൂടുതലറിയുക</translation>
 <translation id="3303855915957856445">തിരയൽ ഫലങ്ങളൊന്നും കണ്ടെത്തിയില്ല</translation>
+<translation id="3311730110465560799">നിങ്ങളുടെ ഉപകരണ സജ്ജീകരണം റിമോട്ട് ആയി മാറ്റാം.</translation>
 <translation id="3320021301628644560">ബില്ലിംഗ് വിലാസം ചേർക്കുക</translation>
 <translation id="3324983252691184275">ക്രിംസൺ</translation>
 <translation id="3338095232262050444">സുരക്ഷിതം</translation>
@@ -509,6 +516,7 @@
 <translation id="3761718714832595332">സ്‌റ്റാറ്റസ് മറയ്ക്കുക</translation>
 <translation id="3765032636089507299">സുരക്ഷിത ബ്രൗസിംഗ് പേജ് നിർമ്മാണത്തിലാണ്.</translation>
 <translation id="3778403066972421603">ഈ കാർഡ് നിങ്ങളുടെ Google അക്കൗണ്ടിലും ഈ ഉപകരണത്തിലും സംരക്ഷിക്കണോ?</translation>
+<translation id="3779973883630527594">ഈ അക്കൗണ്ട് മാനേജ് ചെയ്യുന്ന കമ്പനി, സ്‌കൂൾ അല്ലെങ്കിൽ സ്ഥാപനം:</translation>
 <translation id="3781428340399460090">ഹോട്ട് പിങ്ക്</translation>
 <translation id="3783418713923659662">Mastercard</translation>
 <translation id="3787705759683870569"><ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" />-ൽ അവസാനിക്കുന്നു</translation>
@@ -548,6 +556,7 @@
 <translation id="4072486802667267160">നിങ്ങളുടെ ഓർഡർ പ്രോസസ്സ് ചെയ്യുന്നതിൽ ഒരു പിശകുണ്ടായി. വീണ്ടും ശ്രമിച്ചുനോക്കൂ.</translation>
 <translation id="4075732493274867456">ഒരു സാധാരണ SSL പ്രോട്ടോക്കോൾ പതിപ്പിനെയോ സൈഫർ സ്യൂട്ടിനെയോ ക്ലയന്‍റും സെർവറും പിന്തുണയ്‌ക്കില്ല.</translation>
 <translation id="4079302484614802869">പ്രോക്‌സി കോൺഫിഗറേഷൻ .pac സ്‌ക്രിപ്റ്റ് URL ഉപയോഗിക്കുന്നതിനായി സജ്ജീകരിച്ചിരിക്കുന്നു, സ്ഥിരമായ പ്രോക്‌സി സെർവറുകൾ ഉപയോഗിക്കുന്നതിനായല്ല.</translation>
+<translation id="4082393374666368382">ക്രമീകരണം - മാനേജ്‌മെന്റ്</translation>
 <translation id="4092411512356034591"><ph name="DOMAIN" /> എന്നതിലേക്ക് പോകണോ?</translation>
 <translation id="4098354747657067197">വഞ്ചനാപരമായ സൈറ്റ് ഉണ്ട്</translation>
 <translation id="4103249731201008433">ഉപകരണ സീരിയൽ നമ്പർ അസാധുവാണ്</translation>
@@ -678,6 +687,7 @@
 <translation id="4758311279753947758">കോൺടാക്റ്റ് വിവരങ്ങൾ ചേർക്കുക</translation>
 <translation id="4764776831041365478"><ph name="URL" /> ലെ വെബ്‌പേജ് താല്‍‌ക്കാലികമായി പ്രവര്‍‌ത്തനരഹിതമായിരിക്കാം, അല്ലെങ്കില്‍‌ ഒരു പുതിയ വെബ് വിലാസത്തിലേക്ക് ശാശ്വതമായി നീക്കംചെയ്യപ്പെട്ടിരിക്കാം.</translation>
 <translation id="4771973620359291008">ഒരു അജ്ഞാത പിശക് സംഭവിച്ചു.</translation>
+<translation id="4780900888022378816">നിങ്ങളുടെ ഉപകരണം <ph name="ENROLLMENT_DOMAIN" />-ഉം അക്കൗണ്ട് <ph name="ACCOUNT_DOMAIN" />-ഉം മാനേജ് ചെയ്യുന്നു.</translation>
 <translation id="4785689107224900852">ഈ ടാബിലേക്ക് സ്വിച്ച് ചെയ്യുക</translation>
 <translation id="4798078619018708837">നിങ്ങളുടെ കാർഡ് വിശദാംശങ്ങൾ അപ്‌ഡേറ്റ് ചെയ്യാൻ <ph name="CREDIT_CARD" />-ന്‍റെ കാലാവധി തീരുന്ന തീയതിയും CVC-യും നൽകുക. സ്ഥിരീകരിച്ച് കഴിഞ്ഞാൽ, നിങ്ങളുടെ Google അക്കൗണ്ടിൽ നിന്നുള്ള കാർഡ് വിശദാംശങ്ങൾ ഈ സൈറ്റുമായി പങ്കിടും.</translation>
 <translation id="4800132727771399293">നിങ്ങളുടെ കാലഹരണ തീയതിയും CVC യും പരിശോധിച്ച് വീണ്ടും ശ്രമിക്കുക</translation>
@@ -703,6 +713,7 @@
 <translation id="4926159001844873046"><ph name="SITE" /> പറയുന്നത്:</translation>
 <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation>
 <translation id="4943872375798546930">ഫലങ്ങളൊന്നുമില്ല</translation>
+<translation id="4945672369594656571">നിങ്ങളുടെ ഉപകരണവും അക്കൗണ്ടും എങ്ങനെ കൈകാര്യം ചെയ്യുന്നു എന്നതിനെ നിയന്ത്രിക്കുന്നു. നിങ്ങളുടെ ഉപകരണ, അക്കൗണ്ട് മാനേജർ നൽകുന്ന നിർദ്ദേശങ്ങളുടെ മാത്രം അടിസ്ഥാനത്തിലും ഉപകരണ, അക്കൗണ്ട് മാനേജർ വ്യക്തമാക്കിയ ഉദ്ദേശ്യത്തിന് വേണ്ടി മാത്രവും Google നിങ്ങളുടെ ഉപകരണ ഡാറ്റ പ്രോസസ് ചെയ്യുന്നു.</translation>
 <translation id="4950898438188848926">ടാബ് മാറാനുള്ള ബട്ടൺ, തുറന്നിരിക്കുന്ന ടാബായ <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" /> എന്നതിലേക്ക് മാറാൻ എൻ്റർ അമർത്തുക</translation>
 <translation id="495170559598752135">പ്രവര്‍ത്തനങ്ങള്‍</translation>
 <translation id="4955242332710481440">A5-അധികം</translation>
@@ -716,6 +727,7 @@
 <translation id="5017554619425969104">നിങ്ങൾ പകർത്തിയ ടെക്‌സ്‌റ്റ്</translation>
 <translation id="5018422839182700155">ഈ പേജ് തുറക്കാനായില്ല</translation>
 <translation id="5019198164206649151">ബാക്കിംഗ് സംഭരണം മോശം അവസ്ഥയിലാണ്</translation>
+<translation id="5020154601324912079">നിങ്ങളുടെ ഉപകരണ ഡാറ്റ എങ്ങനെ കൈകാര്യം ചെയ്യുന്നു എന്നതിനെ നിയന്തിക്കുന്നു. നിങ്ങളുടെ ഉപകരണ മാനേജർ നൽകിയ നിർദ്ദേശങ്ങളുടെ മാത്രം അടിസ്ഥാനത്തിലും ഉപകരണ മാനേജർ വ്യക്തമാക്കിയ ഉദ്ദേശ്യത്തിന് വേണ്ടി മാത്രവും Google നിങ്ങളുടെ ഉപകരണ ഡാറ്റ പ്രോസസ് ചെയ്യുന്നു.</translation>
 <translation id="5023310440958281426">നിങ്ങളുടെ അഡ്‌മിനിസ്ട്രേറ്ററുടെ നയങ്ങൾ പരിശോധിക്കുക.</translation>
 <translation id="5029568752722684782">പകർപ്പ് മായ്‌ക്കുക</translation>
 <translation id="503069730517007720">"<ph name="SOFTWARE_NAME" />" സോഫ്റ്റ്‌വെയറിന് ഒരു റൂട്ട് സർട്ടിഫിക്കറ്റ് ആവശ്യമാണ്, എന്നാൽ അത് ഇൻസ്‌റ്റാൾ ചെയ്‌‌തിട്ടില്ല. ഈ പ്രശ്‌നം പരിഹരിക്കാൻ, "<ph name="SOFTWARE_NAME" />" സോഫ്റ്റ്‌വെയറിനുള്ള കോൺഫിഗറേഷൻ നിർദ്ദേശങ്ങൾ ഐടി അഡ്‌മിനിസ്‌ട്രേറ്റർ പരിശോധിക്കേണ്ടതുണ്ട്. <ph name="FURTHER_EXPLANATION" /></translation>
@@ -873,6 +885,7 @@
 <translation id="5838278095973806738">അക്രമകാരികൾ മോഷ്‌ടിക്കാൻ സാധ്യതയുള്ളതിനാൽ ഈ സൈറ്റിൽ നിങ്ങളുടെ രഹസ്യ വിവരങ്ങളൊന്നും (ഉദാഹരണത്തിന്, പാസ്‌വേഡുകളോ ക്രെഡിറ്റ് കാർഡുകളോ പോലുള്ളവ) നൽകരുത്.</translation>
 <translation id="5860033963881614850">ഓഫാക്കുക</translation>
 <translation id="5863847714970149516">മുമ്പോട്ടുള്ള പേജ് നിങ്ങളിൽ നിന്ന് പണമീടാക്കാൻ ശ്രമിച്ചേക്കാം</translation>
+<translation id="5865951947699094510">നിങ്ങളുടെ അക്കൗണ്ട് സജ്ജീകരണം റിമോട്ട് ആയി മാറ്റാം.</translation>
 <translation id="5866257070973731571">ഫോണ്‍ നമ്പര്‍ ചേര്‍ക്കുക</translation>
 <translation id="5869405914158311789">ഈ സൈറ്റ് ലഭ്യമാക്കാനാകുന്നില്ല</translation>
 <translation id="5869522115854928033">സംരക്ഷിച്ച പാസ്‌വേഡുകള്‍</translation>
@@ -892,6 +905,7 @@
 <translation id="5975083100439434680">സൂം ഔട്ട്</translation>
 <translation id="5980920751713728343">സൂചിക-3x5</translation>
 <translation id="598637245381783098">പേയ്‌മെന്‍റ് ആപ്പ് തുറക്കാനായില്ല</translation>
+<translation id="5988826871883769516">നിങ്ങളുടെ ഉപകരണം മാനേജ് ചെയ്യുന്നത് <ph name="ENROLLMENT_DOMAIN" /> ആണ്.</translation>
 <translation id="5989320800837274978">ഒരു സ്ഥിരമായ പ്രോക്സി സെർവർ അല്ലെങ്കിൽ ഒരു .pac സ്‌ക്രിപ്റ്റ് URL വ്യക്തമാക്കിയിട്ടില്ല.</translation>
 <translation id="5990559369517809815">സെർവറിലേക്കുള്ള അഭ്യർത്ഥനകൾ ഒരു വിപുലീകരണം തടഞ്ഞു.</translation>
 <translation id="6008256403891681546">JCB</translation>
@@ -909,6 +923,7 @@
 <translation id="6047233362582046994">നിങ്ങളുടെ സുരക്ഷയെ ബാധിക്കാനിടയുണ്ടെന്ന് മനസ്സിലാക്കുകയാണെങ്കിൽ, ദോഷകരമായ ആപ്പുകൾ നീക്കംചെയ്യുന്നതിനു മുമ്പ് <ph name="BEGIN_LINK" />ഈ സൈറ്റ് സന്ദർശിക്കുക<ph name="END_LINK" />.</translation>
 <translation id="6047927260846328439">സോഫ്‌റ്റ്‌വെയർ ഇൻസ്‌റ്റാൾ ചെയ്യുന്നതിലേക്കോ വ്യക്തിഗത വിവരങ്ങൾ വെളിപ്പെടുത്തുന്നതിലേക്കോ നിങ്ങളെ തന്ത്രപൂർവ്വം നയിച്ചുകൊണ്ട്, ഈ ഉള്ളടക്കം നിങ്ങളെ കബളിപ്പിക്കാൻ ശ്രമിച്ചേക്കാം. <ph name="BEGIN_LINK" />എന്തായാലും കാണിക്കുക<ph name="END_LINK" /></translation>
 <translation id="6051221802930200923"><ph name="SITE" /> എന്ന വെബ്‌സൈറ്റ് സർട്ടിഫിക്കറ്റ് പിന്നിംഗ് ഉപയോഗിക്കുന്നതിനാൽ നിങ്ങൾക്കിപ്പോൾ അത് സന്ദർശിക്കാനാകില്ല. നെറ്റ്‌വർക്ക് പിശകുകളും ആക്രമണങ്ങളും സാധാരണയായി താൽക്കാലികമായിരിക്കും, അതിനാൽ ഈ പേജ് മിക്കവാറും പിന്നീട് പ്രവർത്തിക്കും.</translation>
+<translation id="6052284303005792909">•</translation>
 <translation id="6058977677006700226">നിങ്ങളുടെ എല്ലാ ഉപകരണങ്ങളിലും നിങ്ങളുടെ കാർഡുകൾ ഉപയോഗിക്കണോ?</translation>
 <translation id="6059925163896151826">USB ഉപകരണങ്ങൾ</translation>
 <translation id="6080696365213338172">അഡ്‌മിനിസ്‌ട്രേറ്റർ നൽകിയ സർട്ടിഫിക്കറ്റ് ഉപയോഗിച്ച് നിങ്ങൾ ഉള്ളടക്കം ആക്‌സസ്സ് ചെയ്‌തു. നിങ്ങൾ <ph name="DOMAIN" /> എന്നതിലേക്ക് നൽകുന്ന ഡാറ്റ അഡ്‌മിനിസ്‌ട്രേറ്റർക്ക് തടയാനാവും.</translation>
@@ -977,6 +992,7 @@
 <translation id="6508722015517270189">Chrome റീസ്‌റ്റാർട്ടുചെയ്യുക</translation>
 <translation id="6529602333819889595">&amp;ഇല്ലാതാക്കുന്നത് വീണ്ടും ചെയ്യുക</translation>
 <translation id="6534179046333460208">ഫിസിക്കൽ വെബ് നിർദ്ദേശങ്ങൾ</translation>
+<translation id="6554795675067793129">നിങ്ങളുടെ അക്കൗണ്ട് മാനേജ് ചെയ്യുന്നത് <ph name="ENROLLMENT_DOMAIN" /> ആണ്.</translation>
 <translation id="6556866813142980365">വീണ്ടുംചെയ്യുക</translation>
 <translation id="6563469144985748109">നിങ്ങളുടെ മാനേജർ ഇതുവരെ അംഗീകാരം നൽകിയിട്ടില്ല</translation>
 <translation id="6569060085658103619">നിങ്ങൾ ഒരു വിപുലീകരണ പേജാണ് കാണുന്നത്</translation>
@@ -1059,6 +1075,7 @@
 <translation id="7062635574500127092">ടീൽ നിറം</translation>
 <translation id="7064851114919012435">കോണ്‍ടാക്റ്റ് വിവരം</translation>
 <translation id="7079718277001814089">ഈ സൈറ്റിൽ മാൽവെയർ അടങ്ങിയിരിക്കുന്നു</translation>
+<translation id="7081564429925484109">മുന്നറിയിപ്പ്: ഈ നയം ഒരു ലിസ്‌റ്റ് അല്ലാത്തതിനാൽ PolicyListMultipleSourceMergeList എന്നതിൽ വ്യക്തമാക്കിയിരിക്കുന്നത് പോലെ ഇത് ലയിപ്പിച്ചിട്ടില്ല.</translation>
 <translation id="7087282848513945231">രാജ്യം</translation>
 <translation id="7090678807593890770">Google-ൽ <ph name="LINK" /> തിരയുക</translation>
 <translation id="7108338896283013870">മറയ്ക്കുക</translation>
@@ -1130,6 +1147,7 @@
 <translation id="741007362987735528">വിസ്‌തൃത-ഫോർമാറ്റ്</translation>
 <translation id="7416351320495623771">പാസ്‌വേഡുകൾ മാനേജ് ചെയ്യുക…</translation>
 <translation id="7419106976560586862">പ്രൊഫൈൽ പാത</translation>
+<translation id="7424427397225027541">നിങ്ങളുടെ അക്കൗണ്ട് ഡാറ്റ കൈകാര്യം ചെയ്യുന്നത് എങ്ങനെയെന്നത് നിയന്ത്രിക്കുന്നു. നിങ്ങളുടെ അക്കൗണ്ട് മാനേജർ നൽകുന്ന നിർദ്ദേശങ്ങളുടെ മാത്രം അടിസ്ഥാനത്തിലും അക്കൗണ്ട് മാനേജർ വ്യക്തമാക്കിയ ഉദ്ദേശ്യത്തിന് വേണ്ടി മാത്രവും Google നിങ്ങളുടെ ഉപകരണ ഡാറ്റ പ്രോസസ് ചെയ്യുന്നു.</translation>
 <translation id="7437289804838430631">ബന്ധപ്പെടാനുള്ള വിവരങ്ങൾ ചേർക്കുക</translation>
 <translation id="7440140511386898319">ഓഫ്‌ലൈനായിരിക്കുമ്പോൾ ഉള്ളടക്കം അടുത്തറിയുക</translation>
 <translation id="7441627299479586546">തെറ്റായ നയ വിഷയം</translation>
@@ -1216,6 +1234,7 @@
 <translation id="780301667611848630">വേണ്ട നന്ദി</translation>
 <translation id="7805768142964895445">നില</translation>
 <translation id="7806344367022510803">Chrome-ൽ തിരയല്‍ യന്ത്ര ക്രമീകരണം മാറ്റുക</translation>
+<translation id="7810209002420871817">നിങ്ങളുടെ അക്കൗണ്ടിന്റെ മാനേജരെന്ന നിലയിൽ, <ph name="ACCOUNT_DOMAIN" />:</translation>
 <translation id="7812922009395017822">Mir</translation>
 <translation id="7813600968533626083">Chrome-ൽ നിന്നുള്ള നിർദ്ദേശം നീക്കംചെയ്യണോ?</translation>
 <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />' എന്നതിന്റെ <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> കണ്ടു</translation>
diff --git a/components/strings/components_strings_no.xtb b/components/strings/components_strings_no.xtb
index 3e37298..2c68437 100644
--- a/components/strings/components_strings_no.xtb
+++ b/components/strings/components_strings_no.xtb
@@ -1,6 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="no">
+<translation id="1001338328714563407"><ph name="ENROLLMENT_DOMAIN" />, som administrator for enheten og kontoen din:</translation>
 <translation id="1008557486741366299">Ikke nå</translation>
 <translation id="1010200102790553230">Last inn siden senere</translation>
 <translation id="1015730422737071372">Oppgi flere detaljer</translation>
@@ -308,6 +309,7 @@
 <translation id="2586657967955657006">Utklippstavle</translation>
 <translation id="2587730715158995865">Fra <ph name="ARTICLE_PUBLISHER" />. Les denne og <ph name="OTHER_ARTICLE_COUNT" /> andre nyhetssaker.</translation>
 <translation id="2587841377698384444">ID for katalog-API:</translation>
+<translation id="2595719060046994702">Denne enheten og kontoen administreres ikke av et selskap eller en annen organisasjon.</translation>
 <translation id="2597378329261239068">Dette dokumentet er passordbeskyttet. Skriv inn et passord.</translation>
 <translation id="2609632851001447353">Varianter</translation>
 <translation id="2618023639789766142">C10 (konvolutt)</translation>
@@ -342,6 +344,7 @@
 <translation id="2781692009645368755">Google Pay</translation>
 <translation id="2784949926578158345">Tilkoblingen ble tilbakestilt.</translation>
 <translation id="2788784517760473862">Godkjente kredittkort</translation>
+<translation id="2792012897584536778">Enhetsadministratorene har satt opp sikkerhetssertifikater som kan gjøre det mulig for dem å se innholdet på nettsteder du besøker.</translation>
 <translation id="2794233252405721443">Nettstedet er blokkert</translation>
 <translation id="2799020568854403057">Nettstedet du er på vei til, inneholder skadelige apper</translation>
 <translation id="2799223571221894425">Start på nytt</translation>
@@ -358,6 +361,7 @@
 <translation id="2903493209154104877">Adresser</translation>
 <translation id="290376772003165898">Er ikke siden på <ph name="LANGUAGE" />?</translation>
 <translation id="2909946352844186028">En nettverksendring ble oppdaget.</translation>
+<translation id="2910133103376701357">Enheten og kontoen din administreres av <ph name="ENROLLMENT_DOMAIN" />.</translation>
 <translation id="2916038427272391327">Lukk andre programmer</translation>
 <translation id="2922350208395188000">Tjenerens sertifikat kan ikke kontrolleres.</translation>
 <translation id="2925673989565098301">Leveringsmåte</translation>
@@ -368,6 +372,7 @@
 <translation id="2948083400971632585">På innstillingssiden kan du deaktivere eventuelle mellomtjenere for tilkoblinger.</translation>
 <translation id="2955913368246107853">Lukk søkefelt</translation>
 <translation id="2969319727213777354">Klokken må være riktig stilt før du kan opprette sikre tilkoblinger. Grunnen til dette er at sertifikatene nettsteder identifiserer seg med, bare er gyldige i visse tidsperioder. Ettersom klokken på enheten din er feil, kan ikke Google Chrome bekrefte disse sertifikatene.</translation>
+<translation id="2970515157925768593">kan endre enhets- og kontooppsettet eksternt</translation>
 <translation id="2972581237482394796">Gjø&amp;r om</translation>
 <translation id="2977665033722899841"><ph name="ROW_NAME" />, for øyeblikket valgt. <ph name="ROW_CONTENT" /></translation>
 <translation id="2982481275546140226">Fjern data</translation>
@@ -379,6 +384,7 @@
 <translation id="3005723025932146533">Vis lagret kopi</translation>
 <translation id="3008447029300691911">Skriv inn verifiseringskoden for <ph name="CREDIT_CARD" />. Når du bekrefter, deles kortinformasjonen din med dette nettstedet.</translation>
 <translation id="3010559122411665027">Listeoppføring «<ph name="ENTRY_INDEX" />»: <ph name="ERROR" /></translation>
+<translation id="3014389611820813634"><ph name="ENROLLMENT_DOMAIN" />, som administrator for denne enheten:</translation>
 <translation id="301521992641321250">Automatisk blokkert</translation>
 <translation id="3023071826883856138">You4 (konvolutt)</translation>
 <translation id="3024663005179499861">Feil type enhetsinnstillinger</translation>
@@ -424,6 +430,7 @@
 <translation id="3287510313208355388">Last ned når du er koblet til Internett</translation>
 <translation id="3293642807462928945">Finn ut mer om regelen <ph name="POLICY_NAME" /></translation>
 <translation id="3303855915957856445">Søket ga ingen treff</translation>
+<translation id="3311730110465560799">kan endre enhetsoppsettet eksternt</translation>
 <translation id="3320021301628644560">Legg til faktureringsadresse</translation>
 <translation id="3324983252691184275">Karmosinrød</translation>
 <translation id="3338095232262050444">Sikker</translation>
@@ -518,6 +525,7 @@
 <translation id="3761718714832595332">Skjul statusen</translation>
 <translation id="3765032636089507299">Safe Browsing-siden er under utvikling.</translation>
 <translation id="3778403066972421603">Vil du lagre dette kortet i Google-kontoen din og på denne enheten?</translation>
+<translation id="3779973883630527594">Selskapet, skolen eller organisasjonen som administrerer denne kontoen:</translation>
 <translation id="3781428340399460090">Knallrosa</translation>
 <translation id="3783418713923659662">Mastercard</translation>
 <translation id="3787705759683870569">Utløper <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
@@ -557,6 +565,7 @@
 <translation id="4072486802667267160">Det oppsto en feil under behandlingen av bestillingen din. Prøv på nytt.</translation>
 <translation id="4075732493274867456">Klienten og tjeneren støtter ingen felles SSL-protokollversjon eller -chifferserie.</translation>
 <translation id="4079302484614802869">Konfigurasjonen av proxytjeneren er angitt til å bruke en nettadresse med .pac-skript, ikke statiske proxytjenere.</translation>
+<translation id="4082393374666368382">Innstillinger – Administrasjon</translation>
 <translation id="4092411512356034591">Vil du fortsette til <ph name="DOMAIN" />?</translation>
 <translation id="4098354747657067197">Villedende nettsted i sikte</translation>
 <translation id="4103249731201008433">Enhetens serienummer er ugyldig</translation>
@@ -687,6 +696,7 @@
 <translation id="4758311279753947758">Legg til kontaktinformasjon</translation>
 <translation id="4764776831041365478">Det kan hende at nettsiden på <ph name="URL" /> er midlertidig nede eller flyttet permanent til en ny nettadresse.</translation>
 <translation id="4771973620359291008">Det har oppstått en ukjent feil.</translation>
+<translation id="4780900888022378816">Enheten administreres av <ph name="ENROLLMENT_DOMAIN" />, og kontoen administreres av <ph name="ACCOUNT_DOMAIN" />.</translation>
 <translation id="4785689107224900852">Bytt til denne fanen</translation>
 <translation id="4798078619018708837">Skriv inn utløpsdatoen og verifiseringskoden for <ph name="CREDIT_CARD" /> for å oppdatere kortopplysningene dine. Etter at du har bekreftet, deles kortopplysningene fra Google-kontoen din med dette nettstedet.</translation>
 <translation id="4800132727771399293">Kontrollér utløpsdatoen og CVC-koden, og prøv igjen.</translation>
@@ -712,6 +722,7 @@
 <translation id="4926159001844873046">På <ph name="SITE" /> står det</translation>
 <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation>
 <translation id="4943872375798546930">Ingen resultater</translation>
+<translation id="4945672369594656571">styrer hvordan enhets- og kontodataene dine håndteres. Google behandler enhets- og kontodataene dine utelukkende etter anvisning fra enhets- og kontoadministratoren og kun for de formålene som enhets- og kontoadministratoren har angitt.</translation>
 <translation id="4950898438188848926">Knappen for å bytte fane – trykk på Enter for å bytte til den åpne fanen, <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" /></translation>
 <translation id="495170559598752135">Handlinger</translation>
 <translation id="4955242332710481440">A5-Extra</translation>
@@ -725,6 +736,7 @@
 <translation id="5017554619425969104">Teksten du kopierte</translation>
 <translation id="5018422839182700155">Kan ikke åpne denne siden</translation>
 <translation id="5019198164206649151">Ugyldig funksjonalitet for sikkerhetskopiering</translation>
+<translation id="5020154601324912079">styrer hvordan enhetsdataene dine håndteres. Google behandler enhetsdataene dine utelukkende etter anvisning fra enhetsadministratoren og kun for de formålene som enhetsadministratoren har angitt.</translation>
 <translation id="5023310440958281426">Kontrollér retningslinjene til administratoren din</translation>
 <translation id="5029568752722684782">Slett kopi</translation>
 <translation id="503069730517007720">Et rotsertifikat for «<ph name="SOFTWARE_NAME" />» kreves, men er ikke installert. IT-administratoren din bør se på konfigurasjonsveiledningen for «<ph name="SOFTWARE_NAME" />» for å løse dette problemet. <ph name="FURTHER_EXPLANATION" /></translation>
@@ -882,6 +894,7 @@
 <translation id="5838278095973806738">Du bør ikke oppgi sensitiv informasjon på dette nettstedet (for eksempel passord eller kredittkort) fordi den kan bli stjålet av angripere.</translation>
 <translation id="5860033963881614850">Av</translation>
 <translation id="5863847714970149516">Den neste siden kan prøve å belaste deg for penger</translation>
+<translation id="5865951947699094510">kan endre kontooppsettet eksternt</translation>
 <translation id="5866257070973731571">Legg til telefonnummer</translation>
 <translation id="5869405914158311789">Dette nettstedet er ikke tilgjengelig</translation>
 <translation id="5869522115854928033">Lagrede passord</translation>
@@ -901,6 +914,7 @@
 <translation id="5975083100439434680">Zoom ut</translation>
 <translation id="5980920751713728343">Index-3x5</translation>
 <translation id="598637245381783098">Kan ikke åpne betalingsappen</translation>
+<translation id="5988826871883769516">Enheten administreres av <ph name="ENROLLMENT_DOMAIN" />.</translation>
 <translation id="5989320800837274978">Verken statiske proxytjenere eller en nettadresse med .pac-skript er angitt.</translation>
 <translation id="5990559369517809815">Forespørsler til tjeneren har blitt blokkert av en utvidelse.</translation>
 <translation id="6008256403891681546">JCB</translation>
@@ -918,6 +932,7 @@
 <translation id="6047233362582046994">Hvis du forstår sikkerhetsrisikoen, kan du <ph name="BEGIN_LINK" />gå til dette nettstedet<ph name="END_LINK" /> før de skadelige appene er fjernet.</translation>
 <translation id="6047927260846328439">Dette innholdet kan prøve å lure deg til å installere programvare eller oppgi personopplysninger. <ph name="BEGIN_LINK" />Vis det likevel<ph name="END_LINK" /></translation>
 <translation id="6051221802930200923">Du kan ikke gå til <ph name="SITE" /> akkurat nå, siden nettstedet bruker sertifikatfesting. Nettverksfeil og -angrep er vanligvis midlertidige, så denne siden fungerer sannsynligvis senere.</translation>
+<translation id="6052284303005792909">•</translation>
 <translation id="6058977677006700226">Vil du bruke kortene på alle enhetene dine?</translation>
 <translation id="6059925163896151826">USB-enheter</translation>
 <translation id="6080696365213338172">Du har åpnet innhold via et administratorlevert sertifikat. Data du sender til <ph name="DOMAIN" /> kan stoppes av administratoren din.</translation>
@@ -987,6 +1002,7 @@
 <translation id="6508722015517270189">Start Chrome på nytt</translation>
 <translation id="6529602333819889595">&amp;Slett likevel</translation>
 <translation id="6534179046333460208">Fysisk nett-forslag</translation>
+<translation id="6554795675067793129">Kontoen din administreres av <ph name="ENROLLMENT_DOMAIN" />.</translation>
 <translation id="6556866813142980365">Gjør om</translation>
 <translation id="6563469144985748109">Administratoren din har ikke godkjent det ennå</translation>
 <translation id="6569060085658103619">Du ser på en utvidelsesside</translation>
@@ -1069,6 +1085,7 @@
 <translation id="7062635574500127092">Blågrønn</translation>
 <translation id="7064851114919012435">Kontaktinformasjon</translation>
 <translation id="7079718277001814089">Dette nettstedet inneholder skadelig programvare</translation>
+<translation id="7081564429925484109">Advarsel: Denne regelen ble ikke sammenslått som angitt i PolicyListMultipleSourceMergeList-regelen fordi den ikke er en liste.</translation>
 <translation id="7087282848513945231">Fylke</translation>
 <translation id="7090678807593890770">Søk på Google etter <ph name="LINK" /></translation>
 <translation id="7108338896283013870">Skjul</translation>
@@ -1144,6 +1161,7 @@
 <translation id="741007362987735528">Wide-Format</translation>
 <translation id="7416351320495623771">Administrer passord…</translation>
 <translation id="7419106976560586862">Profilbane</translation>
+<translation id="7424427397225027541">styrer hvordan kontodataene dine håndteres. Google behandler kontodataene dine utelukkende etter anvisning fra kontoadministratoren og kun for de formålene som kontoadministratoren har angitt.</translation>
 <translation id="7437289804838430631">Legg til kontaktinformasjon</translation>
 <translation id="7440140511386898319">Utforsk uten nett</translation>
 <translation id="7441627299479586546">Feil emne for innstillinger</translation>
@@ -1230,6 +1248,7 @@
 <translation id="780301667611848630">Nei takk</translation>
 <translation id="7805768142964895445">Status</translation>
 <translation id="7806344367022510803">Endre innstillingene for søkemotor i Chrome</translation>
+<translation id="7810209002420871817"><ph name="ACCOUNT_DOMAIN" />, som administrator for kontoen din:</translation>
 <translation id="7812922009395017822">Mir</translation>
 <translation id="7813600968533626083">Vil du fjerne skjemaforslaget fra Chrome?</translation>
 <translation id="7815407501681723534">Fant <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> for «<ph name="SEARCH_STRING" />»</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb
index 2642d5b..4a393eb 100644
--- a/components/strings/components_strings_ru.xtb
+++ b/components/strings/components_strings_ru.xtb
@@ -1,6 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="ru">
+<translation id="1001338328714563407">Как администратор устройства и аккаунта домен <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="1008557486741366299">Не сейчас</translation>
 <translation id="1010200102790553230">Загрузить страницу позже</translation>
 <translation id="1015730422737071372">Сообщить дополнительную информацию</translation>
@@ -300,6 +301,7 @@
 <translation id="2586657967955657006">Буфер обмена</translation>
 <translation id="2587730715158995865">Источник: <ph name="ARTICLE_PUBLISHER" />. Доступно ещё несколько статей (<ph name="OTHER_ARTICLE_COUNT" />).</translation>
 <translation id="2587841377698384444">Идентификатор Directory API:</translation>
+<translation id="2595719060046994702">Это устройство и аккаунт не находятся под управлением компании или организации.</translation>
 <translation id="2597378329261239068">Документ защищен паролем. Введите пароль.</translation>
 <translation id="2609632851001447353">Варианты</translation>
 <translation id="2618023639789766142">C10 (конверт)</translation>
@@ -334,6 +336,7 @@
 <translation id="2781692009645368755">Google Pay</translation>
 <translation id="2784949926578158345">Соединение сброшено.</translation>
 <translation id="2788784517760473862">Кредитные карты, которые принимаются к оплате</translation>
+<translation id="2792012897584536778">Администраторы этого устройства настроили сертификаты безопасности, которые дают возможность просматривать контент посещаемых вами сайтов.</translation>
 <translation id="2794233252405721443">Сайт заблокирован</translation>
 <translation id="2799020568854403057">Сайт содержит вредоносные приложения</translation>
 <translation id="2799223571221894425">Перезапустить</translation>
@@ -350,6 +353,7 @@
 <translation id="2903493209154104877">Адреса</translation>
 <translation id="290376772003165898">Язык страницы не <ph name="LANGUAGE" />?</translation>
 <translation id="2909946352844186028">Похоже, вы подключились к другой сети.</translation>
+<translation id="2910133103376701357">Ваше устройство и аккаунт находятся под управлением домена <ph name="ENROLLMENT_DOMAIN" />.</translation>
 <translation id="2916038427272391327">Закройте другие программы.</translation>
 <translation id="2922350208395188000">Не удается проверить сертификат сервера.</translation>
 <translation id="2925673989565098301">Способ доставки</translation>
@@ -360,6 +364,7 @@
 <translation id="2948083400971632585">Прокси-серверы, используемые для соединения, можно отключить на странице настроек.</translation>
 <translation id="2955913368246107853">Закрыть панель поиска</translation>
 <translation id="2969319727213777354">Для создания безопасного подключения необходимо, чтобы показания системных часов были верны. Причина в том, что сертификаты для идентификации сайтов имеют ограниченный срок действия. Если часы на устройстве неточны, Chrome не может проверить актуальность этих сертификатов.</translation>
+<translation id="2970515157925768593">может удаленно менять конфигурацию устройства и аккаунта;</translation>
 <translation id="2972581237482394796">&amp;Повторить</translation>
 <translation id="2977665033722899841">Сейчас выбрано – <ph name="ROW_NAME" />. <ph name="ROW_CONTENT" />.</translation>
 <translation id="2982481275546140226">Удалить данные</translation>
@@ -371,6 +376,7 @@
 <translation id="3005723025932146533">Открыть сохраненную копию</translation>
 <translation id="3008447029300691911">Введите CVC-код карты <ph name="CREDIT_CARD" />. После этого ее данные будут переданы сайту.</translation>
 <translation id="3010559122411665027">Элемент списка "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
+<translation id="3014389611820813634">Как администратор этого устройства домен <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="301521992641321250">Заблокировано автоматически</translation>
 <translation id="3023071826883856138">You4 (конверт)</translation>
 <translation id="3024663005179499861">Неверный тип политики</translation>
@@ -415,6 +421,7 @@
 <translation id="3287510313208355388">Скачать при подключении к Интернету</translation>
 <translation id="3293642807462928945">Подробнее о политике <ph name="POLICY_NAME" />…</translation>
 <translation id="3303855915957856445">Ничего не найдено</translation>
+<translation id="3311730110465560799">Может удаленно менять конфигурацию устройства.</translation>
 <translation id="3320021301628644560">Добавьте платежный адрес</translation>
 <translation id="3324983252691184275">Малиновый</translation>
 <translation id="3338095232262050444">Защищено</translation>
@@ -509,6 +516,7 @@
 <translation id="3761718714832595332">Скрыть статус</translation>
 <translation id="3765032636089507299">Страница безопасного просмотра находится в разработке.</translation>
 <translation id="3778403066972421603">Хотите сохранить карту в аккаунте Google и на этом устройстве?</translation>
+<translation id="3779973883630527594">Компания, организация или учебное заведение, которое управляет этим аккаунтом:</translation>
 <translation id="3781428340399460090">Ярко-розовый</translation>
 <translation id="3783418713923659662">Mastercard</translation>
 <translation id="3787705759683870569">Срок действия: до <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
@@ -548,6 +556,7 @@
 <translation id="4072486802667267160">При обработке заказа произошла ошибка. Повторите попытку.</translation>
 <translation id="4075732493274867456">Клиент и сервер поддерживают разные версии протокола SSL или набора шифров.</translation>
 <translation id="4079302484614802869">Конфигурация прокси-сервера предусматривает использование URL PAC-скриптов вместо фиксированных прокси-серверов.</translation>
+<translation id="4082393374666368382">Настройки – Управление</translation>
 <translation id="4092411512356034591">Открыть <ph name="DOMAIN" />?</translation>
 <translation id="4098354747657067197">Осторожно, поддельный сайт!</translation>
 <translation id="4103249731201008433">Серийный номер устройства недействителен</translation>
@@ -678,6 +687,7 @@
 <translation id="4758311279753947758">Добавить контактные данные</translation>
 <translation id="4764776831041365478">Веб-страница по адресу <ph name="URL" />, возможно, временно недоступна или постоянно перемещена по новому адресу.</translation>
 <translation id="4771973620359291008">Произошла неизвестная ошибка.</translation>
+<translation id="4780900888022378816">Ваше устройство находится под управлением домена <ph name="ENROLLMENT_DOMAIN" />, а аккаунт – <ph name="ACCOUNT_DOMAIN" />.</translation>
 <translation id="4785689107224900852">Переключиться на эту вкладку</translation>
 <translation id="4798078619018708837">Введите срок действия и CVC-код карты <ph name="CREDIT_CARD" />. После этого ее реквизиты из аккаунта Google будут переданы сайту.</translation>
 <translation id="4800132727771399293">Проверьте срок действия и CVC-код, а затем повторите попытку</translation>
@@ -703,6 +713,7 @@
 <translation id="4926159001844873046">Подтвердите действие на странице <ph name="SITE" /></translation>
 <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation>
 <translation id="4943872375798546930">Нет результатов</translation>
+<translation id="4945672369594656571">определяет, как обрабатываются данные вашего аккаунта и устройства (Google обрабатывает данные вашего аккаунта и устройства только под руководством управляющего ими администратора и только в указанных им целях);</translation>
 <translation id="4950898438188848926">Кнопка переключения между вкладками. Чтобы переключиться на открытую вкладку (<ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" />), нажмите клавишу "Ввод".</translation>
 <translation id="495170559598752135">Действия</translation>
 <translation id="4955242332710481440">A5-Extra</translation>
@@ -716,6 +727,7 @@
 <translation id="5017554619425969104">Скопированный текст</translation>
 <translation id="5018422839182700155">Не удалось открыть страницу</translation>
 <translation id="5019198164206649151">Данные в хранилище повреждены</translation>
+<translation id="5020154601324912079">определяет, как обрабатываются данные вашего устройства (Google обрабатывает данные вашего устройства только под руководством администратора и только в указанных им целях);</translation>
 <translation id="5023310440958281426">Проверьте правила, установленные администратором</translation>
 <translation id="5029568752722684782">Удалить данные</translation>
 <translation id="503069730517007720">Необходимый корневой сертификат для программы "<ph name="SOFTWARE_NAME" />" не установлен. Чтобы устранить проблему, попросите системного администратора ознакомиться с инструкциями по настройке программы "<ph name="SOFTWARE_NAME" />". <ph name="FURTHER_EXPLANATION" /></translation>
@@ -873,6 +885,7 @@
 <translation id="5838278095973806738">Не сообщайте этому сайту конфиденциальную информацию (например, пароли и номера банковских карт). К ней могут получить доступ злоумышленники.</translation>
 <translation id="5860033963881614850">ВЫКЛ</translation>
 <translation id="5863847714970149516">При открытии этой страницы с вашего счета могут быть списаны средства</translation>
+<translation id="5865951947699094510">может удаленно менять конфигурацию вашего аккаунта;</translation>
 <translation id="5866257070973731571">Добавьте номер телефона</translation>
 <translation id="5869405914158311789">Не удается получить доступ к сайту</translation>
 <translation id="5869522115854928033">Сайты с сохраненными паролями</translation>
@@ -892,6 +905,7 @@
 <translation id="5975083100439434680">Уменьшить</translation>
 <translation id="5980920751713728343">Index-3x5</translation>
 <translation id="598637245381783098">Не удалось открыть Payments</translation>
+<translation id="5988826871883769516">Ваше устройство находится под управлением домена <ph name="ENROLLMENT_DOMAIN" />.</translation>
 <translation id="5989320800837274978">Ни фиксированные прокси-серверы, ни URL PAC-скриптов не указаны.</translation>
 <translation id="5990559369517809815">Расширение заблокировало отправку запроса на сервер.</translation>
 <translation id="6008256403891681546">JCB</translation>
@@ -909,6 +923,7 @@
 <translation id="6047233362582046994">Если вы осознаете, что можете подвергнуть риску свои личные данные, то можете <ph name="BEGIN_LINK" />перейти на зараженный сайт<ph name="END_LINK" />, не дожидаясь удаления вредоносных приложений.</translation>
 <translation id="6047927260846328439">Посещение этой страницы может привести к установке вредоносной программы или хищению вашей личной информации. <ph name="BEGIN_LINK" />Все равно продолжить<ph name="END_LINK" /></translation>
 <translation id="6051221802930200923">Веб-сайт <ph name="SITE" /> использует механизм Certificate Pinning, поэтому на нем могла произойти подмена сертификата. Открыть сайт в настоящее время нельзя. Сбой мог быть вызван сетевой ошибкой или действиями злоумышленников. Скорее всего, сайт заработает через некоторое время.</translation>
+<translation id="6052284303005792909">•</translation>
 <translation id="6058977677006700226">Хотите использовать карты на всех устройствах?</translation>
 <translation id="6059925163896151826">USB-устройства</translation>
 <translation id="6080696365213338172">Вы используете сертификат, предоставленный администратором, поэтому он может заблокировать передачу данных на сайт <ph name="DOMAIN" />.</translation>
@@ -978,6 +993,7 @@
 <translation id="6508722015517270189">Перезапустите Google Chrome.</translation>
 <translation id="6529602333819889595">&amp;Повторить удаление</translation>
 <translation id="6534179046333460208">Интернет вокруг нас: рекомендации</translation>
+<translation id="6554795675067793129">Ваш аккаунт принадлежит домену <ph name="ENROLLMENT_DOMAIN" />.</translation>
 <translation id="6556866813142980365">Повторить</translation>
 <translation id="6563469144985748109">Ещё не одобрено администратором</translation>
 <translation id="6569060085658103619">Вы просматриваете страницу расширения</translation>
@@ -1060,6 +1076,7 @@
 <translation id="7062635574500127092">Бирюзовый</translation>
 <translation id="7064851114919012435">Контактные данные</translation>
 <translation id="7079718277001814089">Этот сайт содержит вредоносное ПО</translation>
+<translation id="7081564429925484109">Внимание! Это правило не объединено в соответствии с правилом PolicyListMultipleSourceMergeList, так как оно не является списком.</translation>
 <translation id="7087282848513945231">Округ</translation>
 <translation id="7090678807593890770">Выполните поиск по запросу <ph name="LINK" /> в Google</translation>
 <translation id="7108338896283013870">Скрыть</translation>
@@ -1133,6 +1150,7 @@
 <translation id="741007362987735528">Wide-Format</translation>
 <translation id="7416351320495623771">Управление паролями</translation>
 <translation id="7419106976560586862">Путь к профилю</translation>
+<translation id="7424427397225027541">определяет, как обрабатываются данные вашего аккаунта (Google обрабатывает данные вашего аккаунта только под руководством администратора аккаунта и только в указанных им целях);</translation>
 <translation id="7437289804838430631">Добавить контактные данные</translation>
 <translation id="7440140511386898319">Почитать офлайн</translation>
 <translation id="7441627299479586546">Неверный субъект политики</translation>
@@ -1219,6 +1237,7 @@
 <translation id="780301667611848630">Спасибо, не надо</translation>
 <translation id="7805768142964895445">Состояние</translation>
 <translation id="7806344367022510803">Изменить настройки поисковой системы в Chrome</translation>
+<translation id="7810209002420871817">Как администратор вашего аккаунта домен <ph name="ACCOUNT_DOMAIN" />:</translation>
 <translation id="7812922009395017822">Мир</translation>
 <translation id="7813600968533626083">Удалить подсказку из Chrome?</translation>
 <translation id="7815407501681723534"><ph name="SEARCH_RESULTS" /> по запросу "<ph name="SEARCH_STRING" />" (<ph name="NUMBER_OF_RESULTS" />)</translation>
diff --git a/components/strings/components_strings_ta.xtb b/components/strings/components_strings_ta.xtb
index e5ae079ae..dcb6897f 100644
--- a/components/strings/components_strings_ta.xtb
+++ b/components/strings/components_strings_ta.xtb
@@ -504,7 +504,7 @@
 <translation id="3714780639079136834">மொபைல் டேட்டா அல்லது வைஃபையை இயக்குதல்</translation>
 <translation id="3715597595485130451">வைஃபையுடன் இணைத்தல்</translation>
 <translation id="3717027428350673159"><ph name="BEGIN_LINK" />ப்ராக்ஸி, ஃபயர்வால் மற்றும் DNS உள்ளமைவைச் சரிபார்த்தல்<ph name="END_LINK" /></translation>
-<translation id="372429172604983730">வைரஸ்தடுப்பு, ஃபயர்வால், இணைய வடிப்பான் அல்லது ப்ராக்ஸி மென்பொருள் உள்ளிட்ட ஆப்ஸ்கள் இந்தப் பிழையை ஏற்படுத்தக்கூடும்.</translation>
+<translation id="372429172604983730">வைரஸ்தடுப்பு, ஃபயர்வால், இணைய வடிப்பான் அல்லது ப்ராக்ஸி மென்பொருள் உள்ளிட்ட ஆப்ஸ் இந்தப் பிழையை ஏற்படுத்தக்கூடும்.</translation>
 <translation id="373042150751172459">B4 (என்வலப்)</translation>
 <translation id="3736520371357197498">உங்கள் பாதுகாப்பிற்கான ஆபத்தைப் புரிந்துகொண்டால், தீங்கிழைக்கும் நிரல்கள் அகற்றப்படுவதற்கு முன் <ph name="BEGIN_LINK" />இந்தப் பாதுகாப்பற்ற தளத்தைப் பார்வையிடலாம்<ph name="END_LINK" />.</translation>
 <translation id="3744899669254331632">Chromiumமால் செயல்படுத்த முடியாத தவறான அனுமதிச் சான்றுகளை அனுப்பியுள்ளதால் இப்போது <ph name="SITE" />ஐப் பார்வையிட முடியாது. பொதுவாக நெட்வொர்க் பிழைகளும் தாக்குதல்களும் தற்காலிகமாகவே இருக்கும், சிறிதுநேரம் கழித்து இந்தப் பக்கம் சரியாகச் செயல்படலாம்.</translation>
@@ -1457,7 +1457,7 @@
 <translation id="9183425211371246419"><ph name="HOST_NAME" /> ஆதரிக்கப்படாத நெறிமுறையைப் பயன்படுத்துகிறது.</translation>
 <translation id="9205078245616868884">உங்கள் தரவு உங்கள் ஒத்திசைவு கடவுச்சொற்றொடரைக் கொண்டு முறைமையாக்கப்பட்டுள்ளது. ஒத்திசைவைத் தொடங்க, அதை உள்ளிடவும்.</translation>
 <translation id="9207861905230894330">கட்டுரையைச் சேர்ப்பதில் தோல்வி.</translation>
-<translation id="9215416866750762878">இந்தத் தளத்துடன் Chrome பாதுகாப்பாக இணைவதை, பயன்பாடு தடுக்கிறது</translation>
+<translation id="9215416866750762878">இந்தத் தளத்துடன் Chrome பாதுகாப்பாக இணைவதை, ஆப்ஸ் தடுக்கிறது</translation>
 <translation id="9219103736887031265">படங்கள்</translation>
 <translation id="933712198907837967">Diners Club</translation>
 <translation id="935608979562296692">படிவத்தை அழி</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb
index 685ef22..8beb319 100644
--- a/components/strings/components_strings_te.xtb
+++ b/components/strings/components_strings_te.xtb
@@ -1,6 +1,7 @@
 <?xml version="1.0" ?>
 <!DOCTYPE translationbundle>
 <translationbundle lang="te">
+<translation id="1001338328714563407">మీ పరికరం మరియు ఖాతా మేనేజర్‌గా, <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="1008557486741366299">ఇప్పుడు కాదు</translation>
 <translation id="1010200102790553230">పేజీని తర్వాత లోడ్ చేయి</translation>
 <translation id="1015730422737071372">అదనపు వివరాలను అందించండి</translation>
@@ -302,6 +303,7 @@
 <translation id="2586657967955657006">క్లిప్‌బోర్డ్</translation>
 <translation id="2587730715158995865">ప్రచురణకర్త <ph name="ARTICLE_PUBLISHER" />. దీన్ని మరియు మరో <ph name="OTHER_ARTICLE_COUNT" /> ఇతర కథనాలను చదవండి.</translation>
 <translation id="2587841377698384444">డైరెక్టరీ API ID:</translation>
+<translation id="2595719060046994702">ఈ పరికరం మరియు ఖాతా రెండూ కూడా కంపెనీ లేదా ఇతర సంస్థ నిర్వహణలో లేవు.</translation>
 <translation id="2597378329261239068">ఈ పత్రం అనుమతి పదంచే రక్షించబడింది. దయచేసి అనుమతి పదాన్ని నమోదు చేయండి.</translation>
 <translation id="2609632851001447353">వ్యత్యాసాలు</translation>
 <translation id="2618023639789766142">C10 (ఎన్వలప్)</translation>
@@ -336,6 +338,7 @@
 <translation id="2781692009645368755">Google Pay</translation>
 <translation id="2784949926578158345">కనెక్షన్ మళ్ళీ సెట్ చేయబడింది.</translation>
 <translation id="2788784517760473862">ఆమోదించబడిన క్రెడిట్ కార్డ్‌లు</translation>
+<translation id="2792012897584536778">ఈ పరికర నిర్వాహకులు మీరు సందర్శించే వెబ్‌సైట్‌ల కంటెంట్‌ను చూడటానికి వారిని అనుమతించే అవకాశం ఉండే భద్రతా సర్టిఫికెట్‌లను సెటప్ చేశారు.</translation>
 <translation id="2794233252405721443">సైట్ బ్లాక్ చేయబడింది</translation>
 <translation id="2799020568854403057">రాబోయే సైట్‌లో హానికరమైన యాప్‌లు ఉన్నాయి</translation>
 <translation id="2799223571221894425">మళ్లీ ప్రారంభించు</translation>
@@ -352,6 +355,7 @@
 <translation id="2903493209154104877">చిరునామాలు</translation>
 <translation id="290376772003165898">పేజీ <ph name="LANGUAGE" />లో లేదా?</translation>
 <translation id="2909946352844186028">నెట్‌వర్క్ మార్పు గుర్తించబడింది.</translation>
+<translation id="2910133103376701357">మీ పరికరం, ఖాతా రెండూ <ph name="ENROLLMENT_DOMAIN" /> నిర్వహణలో ఉన్నాయి.</translation>
 <translation id="2916038427272391327">ఇతర ప్రోగ్రామ్‌లను మూసివేయండి</translation>
 <translation id="2922350208395188000">సర్వర్ యొక్క ప్రమాణపత్రం తనిఖీ చెయ్యబడదు.</translation>
 <translation id="2925673989565098301">బట్వాడా పద్ధతి</translation>
@@ -362,6 +366,7 @@
 <translation id="2948083400971632585">మీరు సెట్టింగ్‌ల పేజీ నుండి కనెక్షన్ కోసం కాన్ఫిగర్ చేయబడిన ఏ ప్రాక్సీలను అయినా నిలిపివేయవచ్చు.</translation>
 <translation id="2955913368246107853">కనుగొను పట్టీని మూసివేయి</translation>
 <translation id="2969319727213777354">సురక్షిత కనెక్షన్‌ను ఏర్పాటు చేయడానికి, మీ గడియారాన్ని సరైన సమయానికి సెట్ చేయాలి. ఎందుకంటే వెబ్‌సైట్‌లు వాటిని గుర్తించడానికి ఉపయోగించే స‌ర్టిఫికెట్‌లు నిర్దిష్ట కాలవ్యవధుల్లో మాత్రమే చెల్లుబాటు అవుతాయి. మీ పరికరం గడియారం సమయం తప్పుగా ఉన్నందున, Google Chrome ఈ స‌ర్టిఫికెట్‌లను ధృవీకరించలేదు.</translation>
+<translation id="2970515157925768593">మీ పరికరం మరియు ఖాతా సెటప్‌ను రిమోట్‌లో మార్చవచ్చు.</translation>
 <translation id="2972581237482394796">&amp;పునరావృతం</translation>
 <translation id="2977665033722899841"><ph name="ROW_NAME" />, ప్రస్తుతం ఎంచుకోబడింది. <ph name="ROW_CONTENT" /></translation>
 <translation id="2982481275546140226">డేటాను తీసివేయి</translation>
@@ -373,6 +378,7 @@
 <translation id="3005723025932146533">సేవ్ చేయబడిన కాపీని చూపు</translation>
 <translation id="3008447029300691911"><ph name="CREDIT_CARD" /> కార్డ్ CVCని నమోదు చేయండి. మీరు నిర్ధారించిన తర్వాత, మీ కార్డ్ వివరాలు ఈ సైట్‌తో షేర్ చేయబడతాయి.</translation>
 <translation id="3010559122411665027">జాబితా నమోదు "<ph name="ENTRY_INDEX" />": <ph name="ERROR" /></translation>
+<translation id="3014389611820813634">ఈ పరికర మేనేజర్‌గా, <ph name="ENROLLMENT_DOMAIN" />:</translation>
 <translation id="301521992641321250">స్వయంచాలకంగా బ్లాక్ చేయబడింది</translation>
 <translation id="3023071826883856138">You4 (ఎన్వలప్)</translation>
 <translation id="3024663005179499861">చెల్లని విధాన రకం</translation>
@@ -418,6 +424,7 @@
 <translation id="3287510313208355388">ఆన్‌లైన్‌లో ఉన్నప్పుడు డౌన్‌లోడ్ చేయి</translation>
 <translation id="3293642807462928945"><ph name="POLICY_NAME" /> విధానం గురించి మరింత తెలుసుకోండి</translation>
 <translation id="3303855915957856445">శోధన ఫలితాలు ఏవీ కనుగొనబడలేదు</translation>
+<translation id="3311730110465560799">మీ పరికర సెటప్‌ను రిమోట్‌లో మార్చవచ్చు.</translation>
 <translation id="3320021301628644560">బిల్లింగ్ చిరునామాను జోడించండి</translation>
 <translation id="3324983252691184275">ముదురు ఎరుపు రంగు</translation>
 <translation id="3338095232262050444">సురక్షితం</translation>
@@ -512,6 +519,7 @@
 <translation id="3761718714832595332">స్థితిని దాచు</translation>
 <translation id="3765032636089507299">సురక్షిత బ్రౌజింగ్ పేజీ నిర్మాణంలో ఉంది.</translation>
 <translation id="3778403066972421603">ఈ కార్డ్‌ను మీ Google ఖాతాకు మరియు ఈ పరికరంలో సేవ్ చేయాలని అనుకుంటున్నారా?</translation>
+<translation id="3779973883630527594">ఈ ఖాతాను నిర్వహిస్తున్న కంపెనీ, పాఠశాల లేదా సంస్థ:</translation>
 <translation id="3781428340399460090">ముదురు గులాబి రంగు</translation>
 <translation id="3783418713923659662">Mastercard</translation>
 <translation id="3787705759683870569">గడువు ముగింపు <ph name="EXPIRATION_MONTH" />/<ph name="EXPIRATION_YEAR" /></translation>
@@ -551,6 +559,7 @@
 <translation id="4072486802667267160">మీ ఆర్డర్‌ను ప్రాసెస్ చేస్తున్నప్పుడు ఎర్రర్ ఏర్పడింది. దయచేసి మళ్లీ ప్రయత్నించండి.</translation>
 <translation id="4075732493274867456">క్లయింట్, సర్వర్- ఒకే SSL ప్రోటోకాల్ సంస్కరణ లేదా సైఫర్ సూట్‌కు మద్దతు ఇవ్వవు.</translation>
 <translation id="4079302484614802869">స్థిరమైన ప్రాక్సీ సర్వర్‌లను కాకుండా, ఒక .pac స్క్రిప్ట్ URLను ఉపయోగించేలా ప్రాక్సీ కాన్ఫిగరేషన్ సెట్ చేయబడింది.</translation>
+<translation id="4082393374666368382">సెట్టింగ్‌లు - నిర్వహణ</translation>
 <translation id="4092411512356034591"><ph name="DOMAIN" />కు కొనసాగించాలా?</translation>
 <translation id="4098354747657067197">ముందున్న సైట్ మోసపూరితమైనది</translation>
 <translation id="4103249731201008433">పరికరం క్రమ సంఖ్య చెల్లదు</translation>
@@ -681,6 +690,7 @@
 <translation id="4758311279753947758">సంప్రదింపు సమాచారాన్ని జోడించు</translation>
 <translation id="4764776831041365478"><ph name="URL" /> వద్ద వెబ్‌పేజీ తాత్కాలికంగా తెరుచుకోవటం లేదు లేదా అది క్రొత్త వెబ్ చిరునామాకు శాశ్వతంగా తరలించబడి ఉండవచ్చు.</translation>
 <translation id="4771973620359291008">తెలియని ఎర్రర్ ఒకటి ఏర్పడింది.</translation>
+<translation id="4780900888022378816">మీ పరికరం <ph name="ENROLLMENT_DOMAIN" /> నిర్వహణలో ఉంది మరియు మీ ఖాతా <ph name="ACCOUNT_DOMAIN" /> నిర్వహణలో ఉంది.</translation>
 <translation id="4785689107224900852">ఈ టాబ్‌కు మారండి</translation>
 <translation id="4798078619018708837">మీ కార్డ్ వివరాలను అప్‌డేట్ చేయడానికి <ph name="CREDIT_CARD" /> కార్డ్ గడువు ముగింపు తేదీ, CVCని నమోదు చేయండి. మీరు నిర్ధారించిన తర్వాత, మీ Google ఖాతా నుండి కార్డ్ వివరాలు ఈ సైట్‌తో షేర్ చేయబడతాయి.</translation>
 <translation id="4800132727771399293">మీ గడువు ముగింపు తేదీ మరియు CVCని తనిఖీ చేసి, మళ్లీ ప్రయత్నించండి</translation>
@@ -706,6 +716,7 @@
 <translation id="4926159001844873046"><ph name="SITE" /> ఇలా చెబుతోంది</translation>
 <translation id="4926340098269537727"><ph name="ACTIVE_MATCH" />/<ph name="TOTAL_MATCHCOUNT" /></translation>
 <translation id="4943872375798546930">ఫలితాలు ఏవీ లేవు</translation>
+<translation id="4945672369594656571">మీ పరికరం మరియు ఖాతా డేటా నిర్వహణను నియంత్రిస్తుంది. మీ పరికరం మరియు ఖాతా మేనేజర్ ఆదేశానుసారంగా Google మీ పరికరం మరియు ఖాతా డేటాను ప్రత్యేక పద్ధతిలో మీ పరికరం మరియు ఖాతా మేనేజర్ పేర్కొన్న ప్రయోజనాల కోసం మాత్రమే ప్రాసెస్ చేస్తుంది.</translation>
 <translation id="4950898438188848926">ట్యాబ్ మార్పు బటన్, తెరిచియున్న ట్యాబ్ <ph name="TAB_SWITCH_FOCUSED_FRIENDLY_MATCH_TEXT" />కు మారడానికి ఎంటర్ నొక్కండి</translation>
 <translation id="495170559598752135">చర్యలు</translation>
 <translation id="4955242332710481440">A5-అదనం</translation>
@@ -719,6 +730,7 @@
 <translation id="5017554619425969104">మీరు కాపీ చేసిన వచనం</translation>
 <translation id="5018422839182700155">ఈ పేజీని తెరవడం సాధ్యపడదు</translation>
 <translation id="5019198164206649151">బ్యాకింగ్ నిల్వ చెల్లని స్థితిలో ఉంది</translation>
+<translation id="5020154601324912079">మీ పరికర డేటా నిర్వహణను నియంత్రిస్తుంది. మీ పరికర మేనేజర్ ఆదేశానుసారంగా Google మీ పరికర డేటాను ప్రత్యేక పద్ధతిలో మీ పరికర మేనేజర్ పేర్కొన్న ప్రయోజనాల కోసం మాత్రమే ప్రాసెస్ చేస్తుంది.</translation>
 <translation id="5023310440958281426">మీ నిర్వాహకుని విధానాలను చూడండి</translation>
 <translation id="5029568752722684782">కాపీని తీసివేయి</translation>
 <translation id="503069730517007720">"<ph name="SOFTWARE_NAME" />" యొక్క రూట్ సర్టిఫికేట్ అవసరం, కానీ అది ఇన్‌స్టాల్ చేయబడలేదు. ఈ సమస్యను పరిష్కరించాలంటే, మీ IT నిర్వాహకులు "<ph name="SOFTWARE_NAME" />" యొక్క కాన్ఫిగరేషన్ సూచనలను పరిశీలించాలి. <ph name="FURTHER_EXPLANATION" /></translation>
@@ -876,6 +888,7 @@
 <translation id="5838278095973806738">మీరు ఈ సైట్‌లో ఎలాంటి గోప్యమైన సమాచారాన్ని నమోదు చేయకూడదు (ఉదాహరణకు, పాస్‌వర్డ్‌లు లేదా క్రెడిట్ కార్డ్‌లు), దాడికి పాల్పడేవారు ఆ సమాచారం దొంగిలించే అవకాశం ఉంటుంది.</translation>
 <translation id="5860033963881614850">ఆఫ్ అయ్యింది</translation>
 <translation id="5863847714970149516">మీరు చూడబోతున్న పేజీ మీకు డబ్బు ఛార్జ్ చేయడానికి ప్రయత్నించవచ్చు</translation>
+<translation id="5865951947699094510">మీ ఖాతా సెటప్‌ను రిమోట్‌లో మార్చవచ్చు.</translation>
 <translation id="5866257070973731571">ఫోన్ నంబర్‌ను జోడించండి</translation>
 <translation id="5869405914158311789">ఈ సైట్‌ను చేరుకోలేకపోయాము</translation>
 <translation id="5869522115854928033">సేవ్  చేసిన పాస్‌వర్డ్‌లు</translation>
@@ -895,6 +908,7 @@
 <translation id="5975083100439434680">దూరంగా జూమ్ చెయ్యి</translation>
 <translation id="5980920751713728343">సూచిక-3x5</translation>
 <translation id="598637245381783098">చెల్లింపు యాప్‌ను తెరవడం సాధ్యం కాదు</translation>
+<translation id="5988826871883769516">మీ పరికరం <ph name="ENROLLMENT_DOMAIN" /> నిర్వహణలో ఉంది.</translation>
 <translation id="5989320800837274978">స్థిర ప్రాక్సీ సర్వర్‌లు లేదా ఒక .pac స్క్రిప్ట్ URL పేర్కొనబడలేదు.</translation>
 <translation id="5990559369517809815">సర్వర్‌కు అభ్యర్థనలను ఒక ఎక్సటెన్షన్ బ్లాక్ చేయబడ్డాయి.</translation>
 <translation id="6008256403891681546">JCB</translation>
@@ -912,6 +926,7 @@
 <translation id="6047233362582046994">మీ భద్రతకు వాటిల్లే ఆపదల గురించి మీకు అర్థం అయ్యి ఉంటే, హానికర యాప్‌లు తీసివేయబడటానికి ముందే మీరు <ph name="BEGIN_LINK" />ఈ సైట్‌ను సందర్శించవచ్చు<ph name="END_LINK" />.</translation>
 <translation id="6047927260846328439">ఈ కంటెంట్, సాఫ్ట్‌వేర్‌ని ఇన్‌స్టాల్ చేసేలా లేదా వ్యక్తిగత సమాచారాన్ని బహిర్గతం చేసేలా మిమ్మల్ని మోసం చేయడానికి ప్రయత్నించవచ్చు. <ph name="BEGIN_LINK" />ఏదేమైనా చూపు<ph name="END_LINK" /></translation>
 <translation id="6051221802930200923">ప్రమాణపత్రాన్ని పిన్ చేసే పద్ధతిని వెబ్‌సైట్ ఉపయోగిస్తుంది కనుక మీరు ప్రస్తుతానికి <ph name="SITE" /> ను సందర్శించలేరు. నెట్‌వర్క్ లోపాలు మరియు దాడులు సాధారణంగా తాత్కాలికమే, కనుక ఈ పేజీ తర్వాత పని చేయవచ్చు.</translation>
+<translation id="6052284303005792909">•</translation>
 <translation id="6058977677006700226">మీ కార్డ్‌లను మీ అన్ని పరికరాలలో ఉపయోగించాలా?</translation>
 <translation id="6059925163896151826">USB పరికరాలు</translation>
 <translation id="6080696365213338172">మీరు నిర్వాహకుని ద్వారా అందించబడిన ప్రమాణపత్రాన్ని ఉపయోగించి కంటెంట్‌ను యాక్సెస్ చేసారు. మీరు <ph name="DOMAIN" />కు అందించే డేటాకు మీ నిర్వాహకుని ద్వారా అంతరాయం ఏర్పడవచ్చు.</translation>
@@ -981,6 +996,7 @@
 <translation id="6508722015517270189">Chromeను పునఃప్రారంభించండి</translation>
 <translation id="6529602333819889595">&amp;తొలగించడాన్ని పునరావృతం చేయి</translation>
 <translation id="6534179046333460208">ప్రత్యక్ష వెబ్ సూచనలు</translation>
+<translation id="6554795675067793129">మీ ఖాతా <ph name="ENROLLMENT_DOMAIN" /> నిర్వహణలో ఉంది.</translation>
 <translation id="6556866813142980365">మళ్లీ చేయి</translation>
 <translation id="6563469144985748109">మీ నిర్వాహకుడు దీన్ని ఇంకా ఆమోదించలేదు</translation>
 <translation id="6569060085658103619">మీరు పొడిగింపు పేజీని వీక్షిస్తున్నారు</translation>
@@ -1063,6 +1079,7 @@
 <translation id="7062635574500127092">నీలి పచ్చ రంగు</translation>
 <translation id="7064851114919012435">సంప్రదింపు సమాచారం</translation>
 <translation id="7079718277001814089">ఈ సైట్‌లో మాల్వేర్ ఉంది</translation>
+<translation id="7081564429925484109">హెచ్చరిక: ఈ విధానం ఒక జాబితా కానందున, PolicyListMultipleSourceMergeList విధానంలో పేర్కొన్న విధంగా ఇది విలీనం చేయబడలేదు.</translation>
 <translation id="7087282848513945231">కౌంటి</translation>
 <translation id="7090678807593890770"><ph name="LINK" /> కోసం Googleలో వెతకండి</translation>
 <translation id="7108338896283013870">దాచిపెట్టు</translation>
@@ -1136,6 +1153,7 @@
 <translation id="741007362987735528">వెడల్పైన-ఫార్మాట్</translation>
 <translation id="7416351320495623771">పాస్‌వర్డ్‌లను నిర్వహించండి…</translation>
 <translation id="7419106976560586862">ప్రొఫైల్ మార్గం</translation>
+<translation id="7424427397225027541">మీ ఖాతా డేటా నిర్వహణను నియంత్రిస్తుంది. మీ ఖాతా మేనేజర్ ఆదేశానుసారంగా Google మీ ఖాతా డేటాను ప్రత్యేక పద్ధతిలో మీ ఖాతా మేనేజర్ పేర్కొన్న ప్రయోజనాల కోసం మాత్రమే ప్రాసెస్ చేస్తుంది.</translation>
 <translation id="7437289804838430631">సంప్రదింపు సమాచారాన్ని జోడించు</translation>
 <translation id="7440140511386898319">ఆఫ్‌లైన్‌లో ఉన్నప్పుడు అన్వేషించండి</translation>
 <translation id="7441627299479586546">చెల్లని విధాన విషయం</translation>
@@ -1222,6 +1240,7 @@
 <translation id="780301667611848630">వద్దు , ధన్యవాదాలు</translation>
 <translation id="7805768142964895445">స్థితి</translation>
 <translation id="7806344367022510803">Chromeలో శోధన ఇంజిన్ సెట్టింగ్‌లను మార్చండి</translation>
+<translation id="7810209002420871817">మీ <ph name="ACCOUNT_DOMAIN" /> ఖాతా మేనేజర్‌గా, వీటిని చేయవచ్చు:</translation>
 <translation id="7812922009395017822">Mir</translation>
 <translation id="7813600968533626083">Chrome నుండి ఫారమ్ సూచనను తీసివేయాలా?</translation>
 <translation id="7815407501681723534">'<ph name="SEARCH_STRING" />' కోసం <ph name="NUMBER_OF_RESULTS" /> <ph name="SEARCH_RESULTS" /> కనుగొనబడ్డాయి</translation>
diff --git a/components/strings/components_strings_uk.xtb b/components/strings/components_strings_uk.xtb
index ea16b34..58498c8d 100644
--- a/components/strings/components_strings_uk.xtb
+++ b/components/strings/components_strings_uk.xtb
@@ -1085,7 +1085,7 @@
 <translation id="7062635574500127092">Бірюзовий</translation>
 <translation id="7064851114919012435">Контактна інформація</translation>
 <translation id="7079718277001814089">Цей сайт містить зловмисне програмне забезпечення</translation>
-<translation id="7081564429925484109">Застереження: це правило не об’єднано як указано в PolicyListMultipleSourceMergeList, оскільки це не список.</translation>
+<translation id="7081564429925484109">Застереження: це правило не об’єднано, як указано в PolicyListMultipleSourceMergeList, оскільки це не список.</translation>
 <translation id="7087282848513945231">Країна</translation>
 <translation id="7090678807593890770">Пошукайте за запитом "<ph name="LINK" />" у Google</translation>
 <translation id="7108338896283013870">Сховати</translation>
diff --git a/components/tracing/common/trace_startup_config.cc b/components/tracing/common/trace_startup_config.cc
index 7e984cb..d21058d 100644
--- a/components/tracing/common/trace_startup_config.cc
+++ b/components/tracing/common/trace_startup_config.cc
@@ -242,10 +242,12 @@
 
 bool TraceStartupConfig::EnableFromBackgroundTracing() {
 #if defined(OS_ANDROID)
+  // Tests can enable this value.
   is_enabled_from_background_tracing_ =
+      is_enabled_from_background_tracing_ ||
       base::android::GetBackgroundStartupTracingFlag();
 #else
-  is_enabled_from_background_tracing_ = false;
+  // TODO(ssid): Implement saving setting to preference for next startup.
 #endif
   // Do not set the flag to false if it's not enabled unnecessarily.
   if (!is_enabled_from_background_tracing_)
diff --git a/components/tracing/common/trace_startup_config.h b/components/tracing/common/trace_startup_config.h
index a1e4e34..be13970 100644
--- a/components/tracing/common/trace_startup_config.h
+++ b/components/tracing/common/trace_startup_config.h
@@ -17,7 +17,8 @@
 }  // namespace base
 
 namespace content {
-class StartupTracingControllerTest;
+class CommandlineStartupTracingTest;
+class BackgroundStartupTracingTest;
 }
 
 namespace tracing {
@@ -139,7 +140,8 @@
   // This allows constructor and destructor to be private and usable only
   // by the Singleton class.
   friend struct base::DefaultSingletonTraits<TraceStartupConfig>;
-  friend class content::StartupTracingControllerTest;
+  friend class content::CommandlineStartupTracingTest;
+  friend class content::BackgroundStartupTracingTest;
 
   TraceStartupConfig();
   ~TraceStartupConfig();
diff --git a/components/ui_devtools/css_agent.cc b/components/ui_devtools/css_agent.cc
index 8b0f9ea3..82ee5d2 100644
--- a/components/ui_devtools/css_agent.cc
+++ b/components/ui_devtools/css_agent.cc
@@ -51,28 +51,29 @@
 }
 
 std::unique_ptr<Array<CSS::CSSProperty>> BuildCSSPropertyArray(
-    const gfx::Rect& bounds,
-    const bool visible) {
+    const gfx::Rect& bounds) {
   auto cssProperties = Array<CSS::CSSProperty>::create();
   cssProperties->addItem(BuildCSSProperty(kHeight, bounds.height()));
   cssProperties->addItem(BuildCSSProperty(kWidth, bounds.width()));
   cssProperties->addItem(BuildCSSProperty(kX, bounds.x()));
   cssProperties->addItem(BuildCSSProperty(kY, bounds.y()));
-  cssProperties->addItem(BuildCSSProperty(kVisibility, visible));
   return cssProperties;
 }
 
 std::unique_ptr<CSS::CSSStyle> BuildCSSStyle(UIElement* ui_element) {
   gfx::Rect bounds;
-  bool visible;
   ui_element->GetBounds(&bounds);
-  ui_element->GetVisible(&visible);
-
   std::unique_ptr<Array<CSS::CSSProperty>> css_properties(
-      BuildCSSPropertyArray(bounds, visible));
+      BuildCSSPropertyArray(bounds));
+
+  if (ui_element->type() != VIEW) {
+    bool visible;
+    ui_element->GetVisible(&visible);
+    css_properties->addItem(BuildCSSProperty(kVisibility, visible));
+  }
+
   const std::vector<std::pair<std::string, std::string>> properties(
       ui_element->GetCustomProperties());
-
   for (const auto& it : properties)
     css_properties->addItem(BuildCSSProperty(it.first, it.second));
 
@@ -203,7 +204,8 @@
                                          bool* visible) {
   if (ui_element) {
     ui_element->GetBounds(bounds);
-    ui_element->GetVisible(visible);
+    if (ui_element->type() != VIEW)
+      ui_element->GetVisible(visible);
     return true;
   }
   return false;
diff --git a/components/ui_devtools/views/view_element.cc b/components/ui_devtools/views/view_element.cc
index d5bd83d4..764b52b 100644
--- a/components/ui_devtools/views/view_element.cc
+++ b/components/ui_devtools/views/view_element.cc
@@ -84,11 +84,13 @@
 }
 
 void ViewElement::GetVisible(bool* visible) const {
-  *visible = view_->visible();
+  // Visibility information should be directly retrieved from View's metadata,
+  // no need for this function any more.
+  NOTREACHED();
 }
 
 void ViewElement::SetVisible(bool visible) {
-  view_->SetVisible(visible);
+  // Intentional No-op.
 }
 
 bool ViewElement::SetPropertiesFromString(const std::string& text) {
diff --git a/components/ui_devtools/views/view_element_unittest.cc b/components/ui_devtools/views/view_element_unittest.cc
index 6417229..81626b1 100644
--- a/components/ui_devtools/views/view_element_unittest.cc
+++ b/components/ui_devtools/views/view_element_unittest.cc
@@ -9,6 +9,43 @@
 #include "components/ui_devtools/ui_devtools_unittest_utils.h"
 #include "ui/views/test/views_test_base.h"
 
+namespace {
+
+size_t GetPropertyIndex(ui_devtools::ViewElement* element,
+                        const std::string& property_name) {
+  auto props = element->GetCustomProperties();
+  for (size_t index = 0; index < props.size(); ++index) {
+    if (props[index].first == property_name)
+      return index;
+  }
+  DCHECK(false) << "Property " << property_name << " can not be found.";
+  return 0;
+}
+
+void TestBooleanCustomPropertySetting(ui_devtools::ViewElement* element,
+                                      const std::string& property_name,
+                                      bool init_value) {
+  size_t index = GetPropertyIndex(element, property_name);
+  std::string old_value(init_value ? "true" : "false");
+  auto props = element->GetCustomProperties();
+  EXPECT_EQ(props[index].second, old_value);
+
+  // Check the property can be set accordingly.
+  std::string new_value(init_value ? "false" : "true");
+  std::string separator(":");
+  element->SetPropertiesFromString(property_name + separator + new_value);
+  props = element->GetCustomProperties();
+  EXPECT_EQ(props[index].first, property_name);
+  EXPECT_EQ(props[index].second, new_value);
+
+  element->SetPropertiesFromString(property_name + separator + old_value);
+  props = element->GetCustomProperties();
+  EXPECT_EQ(props[index].first, property_name);
+  EXPECT_EQ(props[index].second, old_value);
+}
+
+}  // namespace
+
 namespace ui_devtools {
 
 using ::testing::_;
@@ -79,65 +116,29 @@
   EXPECT_EQ(view()->bounds(), gfx::Rect(1, 2, 3, 4));
 }
 
-TEST_F(ViewElementTest, SettingVisibleOnElementSetsOnView) {
-  DCHECK(view()->visible());
-
-  element()->SetVisible(false);
-  EXPECT_FALSE(view()->visible());
-
-  element()->SetVisible(true);
-  EXPECT_TRUE(view()->visible());
-}
-
 TEST_F(ViewElementTest, SetPropertiesFromString) {
-  static const char* kTestProperty = "Enabled";
-
-  auto props = element()->GetCustomProperties();
-  size_t index;
-  for (index = 0; index < props.size(); ++index) {
-    if (props[index].first == kTestProperty) {
-      EXPECT_EQ(props[index].second, "true");
-      break;
-    }
-  }
-
-  // Check the property can be set accordingly.
-  element()->SetPropertiesFromString("Enabled:false");
-  props = element()->GetCustomProperties();
-  EXPECT_EQ(props[index].first, kTestProperty);
-  EXPECT_EQ(props[index].second, "false");
-
-  element()->SetPropertiesFromString("Enabled:true");
-  props = element()->GetCustomProperties();
-  EXPECT_EQ(props[index].first, kTestProperty);
-  EXPECT_EQ(props[index].second, "true");
+  static const char* kEnabledProperty = "Enabled";
+  TestBooleanCustomPropertySetting(element(), kEnabledProperty, true);
 
   // Test setting a non-existent property has no effect.
   element()->SetPropertiesFromString("Enable:false");
-  props = element()->GetCustomProperties();
-  EXPECT_EQ(props[index].first, kTestProperty);
+  auto props = element()->GetCustomProperties();
+  size_t index = GetPropertyIndex(element(), kEnabledProperty);
+  EXPECT_EQ(props[index].first, kEnabledProperty);
   EXPECT_EQ(props[index].second, "true");
 
   // Test setting empty string for property value has no effect.
   element()->SetPropertiesFromString("Enabled:");
   props = element()->GetCustomProperties();
-  EXPECT_EQ(props[index].first, kTestProperty);
+  EXPECT_EQ(props[index].first, kEnabledProperty);
   EXPECT_EQ(props[index].second, "true");
 
   // Ensure setting pure whitespace doesn't crash.
   ASSERT_NO_FATAL_FAILURE(element()->SetPropertiesFromString("   \n  "));
 }
 
-TEST_F(ViewElementTest, GetVisible) {
-  bool visible;
-
-  view()->SetVisible(false);
-  element()->GetVisible(&visible);
-  EXPECT_FALSE(visible);
-
-  view()->SetVisible(true);
-  element()->GetVisible(&visible);
-  EXPECT_TRUE(visible);
+TEST_F(ViewElementTest, SettingVisibilityOnView) {
+  TestBooleanCustomPropertySetting(element(), "Visible", true);
 }
 
 TEST_F(ViewElementTest, GetBounds) {
@@ -167,6 +168,19 @@
   EXPECT_EQ(props.back().second, "This is the tooltip");
 }
 
+TEST_F(ViewElementTest, CheckCustomProperties) {
+  auto props = element()->GetCustomProperties();
+  DCHECK_GT(props.size(), 1U);
+
+  // Check visibility information is passed in.
+  bool is_visible_set = false;
+  for (size_t i = 0; i < props.size() - 1; ++i) {
+    if (props[i].first == "Visible")
+      is_visible_set = true;
+  }
+  EXPECT_TRUE(is_visible_set);
+}
+
 TEST_F(ViewElementTest, GetNodeWindowAndScreenBounds) {
   // For this to be meaningful, the view must be in
   // a widget.
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn
index 99fee479..b87dda6 100644
--- a/components/viz/service/BUILD.gn
+++ b/components/viz/service/BUILD.gn
@@ -120,6 +120,8 @@
     "display_embedder/software_output_surface.h",
     "display_embedder/viz_process_context_provider.cc",
     "display_embedder/viz_process_context_provider.h",
+    "display_embedder/vsync_parameter_listener.cc",
+    "display_embedder/vsync_parameter_listener.h",
     "frame_sinks/compositor_frame_sink_impl.cc",
     "frame_sinks/compositor_frame_sink_impl.h",
     "frame_sinks/compositor_frame_sink_support.cc",
@@ -402,6 +404,7 @@
     "display_embedder/buffer_queue_unittest.cc",
     "display_embedder/server_shared_bitmap_manager_unittest.cc",
     "display_embedder/skia_output_surface_impl_unittest.cc",
+    "display_embedder/vsync_parameter_listener_unittest.cc",
     "frame_sinks/compositor_frame_sink_support_unittest.cc",
     "frame_sinks/direct_layer_tree_frame_sink_unittest.cc",
     "frame_sinks/frame_sink_manager_unittest.cc",
diff --git a/components/viz/service/compositor_frame_fuzzer/README.md b/components/viz/service/compositor_frame_fuzzer/README.md
new file mode 100644
index 0000000..da154e6
--- /dev/null
+++ b/components/viz/service/compositor_frame_fuzzer/README.md
@@ -0,0 +1,65 @@
+# CompositorFrame Fuzzer
+
+## Fuzzer functionality
+
+The fuzzer takes a binary protobuf RenderPass message, as specified in
+compositor_frame_fuzzer.proto, which describes the root RenderPass for a
+CompositorFrame as input. It uses [libFuzzer][libfuzzer] and
+[libprotobuf-mutator][protobuf-mutator] to generate and mutate a corpus of
+inputs that exercise as many code paths as possible. See [libFuzzer in
+Chromium][libfuzzer-chromium] documentation for general information on these
+tools and how they are used in Chromium.
+
+On each iteration, the CompositorFrame fuzzer builds a CompositorFrame
+following the specifications in the protobuf-format input and submits it to the
+display compositor. A simulated browser process submits a CompositorFrame which
+embeds the fuzzed CompositorFrame. The display compositor then produces pixel
+output using SoftwareRenderer.
+
+## Seed corpus
+
+A seed corpus helps jumpstart the fuzzer by providing it with an existing set of
+valid inputs to try. See the [efficient fuzzing guide][efficient-fuzzing] for
+more information.
+
+The `.asciipb` files in the text_format_seed_corpus directory will automatically
+be compiled and added to the seed corpus once they have been added to the
+sources list in BUILD.gn.
+
+## Running locally
+
+To run multiple fuzzer iterations and generate a corpus (the initial corpus
+directory may be empty or already contain entries):
+
+```shell
+compositor_frame_fuzzer <path-to-corpus> [optional: <path-to-seed-dir>]
+```
+
+To execute a single input test case:
+
+```shell
+compositor_frame_fuzzer <path-to-test-case>
+```
+
+## Debugging
+
+The CompositorFrame fuzzer produces minimal logging, but will accept verbosity
+flags (`--v=1`) to enable helpful logging for debugging.
+
+Since the fuzzer runs headlessly, run it with the flag
+`--dump-to-png[=dir-name]` to dump the browser display into PNG files for
+debugging.
+
+A possibly useful pattern to debug new fuzzer functionality is to write a new
+seed corpus entry exercising the new paths, then visually testing whether this
+entry is rendered correctly. For instance, to test that the
+`nested_render_pass_draw_quads.asciipb` corpus entry renders correctly:
+
+```shell
+compositor_frame_fuzzer <path-to-build-gen-files>/components/viz/service/compositor_frame_fuzzer/binary_seed_corpus/nested_render_pass_draw_quads.pb --v=1 --dump-to-png=<path-to-out-dir>
+```
+
+[libfuzzer]: http://llvm.org/docs/LibFuzzer.html
+[protobuf-mutator]: https://github.com/google/libprotobuf-mutator/
+[libfuzzer-chromium]: https://chromium.googlesource.com/chromium/src/+/master/testing/libfuzzer/README.md
+[efficient-fuzzing]: https://chromium.googlesource.com/chromium/src/+/master/testing/libfuzzer/efficient_fuzzer.md
diff --git a/components/viz/service/display_embedder/gl_output_surface_offscreen.cc b/components/viz/service/display_embedder/gl_output_surface_offscreen.cc
index 2ef563d..8f4a44cf 100644
--- a/components/viz/service/display_embedder/gl_output_surface_offscreen.cc
+++ b/components/viz/service/display_embedder/gl_output_surface_offscreen.cc
@@ -12,6 +12,8 @@
 #include "components/viz/service/display/output_surface_frame.h"
 #include "gpu/command_buffer/client/context_support.h"
 #include "gpu/command_buffer/client/gles2_interface.h"
+#include "gpu/command_buffer/client/shared_image_interface.h"
+#include "gpu/command_buffer/common/shared_image_usage.h"
 #include "third_party/khronos/GLES2/gl2.h"
 #include "third_party/khronos/GLES2/gl2ext.h"
 #include "ui/gl/gl_utils.h"
@@ -25,30 +27,36 @@
 
 GLOutputSurfaceOffscreen::GLOutputSurfaceOffscreen(
     scoped_refptr<VizProcessContextProvider> context_provider)
-    : GLOutputSurface(context_provider), weak_ptr_factory_(this) {}
+    : GLOutputSurface(context_provider) {}
 
-GLOutputSurfaceOffscreen::~GLOutputSurfaceOffscreen() {}
+GLOutputSurfaceOffscreen::~GLOutputSurfaceOffscreen() {
+  DiscardBackbuffer();
+}
 
 void GLOutputSurfaceOffscreen::EnsureBackbuffer() {
+  if (size_.IsEmpty())
+    return;
+
   if (!texture_id_) {
+    gpu::SharedImageInterface* sii = context_provider_->SharedImageInterface();
     gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
 
     const int max_texture_size =
         context_provider_->ContextCapabilities().max_texture_size;
-    int texture_width = std::min(max_texture_size, size_.width());
-    int texture_height = std::min(max_texture_size, size_.height());
+    gfx::Size texture_size(std::min(size_.width(), max_texture_size),
+                           std::min(size_.height(), max_texture_size));
 
-    // TODO(sgilhuly): Draw to a texture backed by a mailbox.
-    gl->GenTextures(1, &texture_id_);
-    gl->BindTexture(GL_TEXTURE_2D, texture_id_);
-    gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-    gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-    gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-    gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-    gl->TexImage2D(GL_TEXTURE_2D, 0, GLInternalFormat(kFboTextureFormat),
-                   texture_width, texture_height, 0,
-                   GLDataFormat(kFboTextureFormat),
-                   GLDataType(kFboTextureFormat), nullptr);
+    const uint32_t flags = gpu::SHARED_IMAGE_USAGE_GLES2 |
+                           gpu::SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT |
+                           gpu::SHARED_IMAGE_USAGE_DISPLAY;
+    mailbox_ = sii->CreateSharedImage(kFboTextureFormat, texture_size,
+                                      color_space_, flags);
+
+    // Ensure mailbox is valid before using it.
+    gl->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData());
+
+    texture_id_ = gl->CreateAndTexStorage2DSharedImageCHROMIUM(mailbox_.name);
+
     gl->GenFramebuffers(1, &fbo_);
     gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
     gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
@@ -57,18 +65,19 @@
 }
 
 void GLOutputSurfaceOffscreen::DiscardBackbuffer() {
-  gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
-
-  if (texture_id_) {
-    gl->DeleteTextures(1, &texture_id_);
-    texture_id_ = 0;
-  }
-
   if (fbo_) {
+    gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
     gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_);
     gl->DeleteFramebuffers(1, &fbo_);
     fbo_ = 0;
   }
+
+  if (texture_id_) {
+    gpu::SharedImageInterface* sii = context_provider_->SharedImageInterface();
+    sii->DestroySharedImage(gpu::SyncToken(), mailbox_);
+    mailbox_.SetZero();
+    texture_id_ = 0;
+  }
 }
 
 void GLOutputSurfaceOffscreen::BindFramebuffer() {
@@ -86,13 +95,13 @@
                                        bool alpha,
                                        bool stencil) {
   size_ = size;
+  color_space_ = color_space;
   DiscardBackbuffer();
   EnsureBackbuffer();
 }
 
 void GLOutputSurfaceOffscreen::SwapBuffers(OutputSurfaceFrame frame) {
-  gfx::Size surface_size = frame.size;
-  DCHECK(surface_size == size_);
+  DCHECK(frame.size == size_);
 
   gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL();
 
diff --git a/components/viz/service/display_embedder/gl_output_surface_offscreen.h b/components/viz/service/display_embedder/gl_output_surface_offscreen.h
index fa6ca15..ac23c03a 100644
--- a/components/viz/service/display_embedder/gl_output_surface_offscreen.h
+++ b/components/viz/service/display_embedder/gl_output_surface_offscreen.h
@@ -10,7 +10,8 @@
 #include "components/viz/common/frame_sinks/begin_frame_source.h"
 #include "components/viz/service/display_embedder/gl_output_surface.h"
 #include "components/viz/service/display_embedder/viz_process_context_provider.h"
-#include "ui/latency/latency_tracker.h"
+#include "gpu/command_buffer/common/mailbox.h"
+#include "ui/gfx/color_space.h"
 
 namespace viz {
 
@@ -36,10 +37,14 @@
  private:
   void OnSwapBuffersComplete(std::vector<ui::LatencyInfo> latency_info);
 
+  gpu::Mailbox mailbox_;
+
   uint32_t fbo_ = 0;
   uint32_t texture_id_ = 0;
   gfx::Size size_;
-  base::WeakPtrFactory<GLOutputSurfaceOffscreen> weak_ptr_factory_;
+  gfx::ColorSpace color_space_;
+
+  base::WeakPtrFactory<GLOutputSurfaceOffscreen> weak_ptr_factory_{this};
 
   DISALLOW_COPY_AND_ASSIGN(GLOutputSurfaceOffscreen);
 };
diff --git a/components/viz/service/display_embedder/vsync_parameter_listener.cc b/components/viz/service/display_embedder/vsync_parameter_listener.cc
new file mode 100644
index 0000000..5b72efe4
--- /dev/null
+++ b/components/viz/service/display_embedder/vsync_parameter_listener.cc
@@ -0,0 +1,57 @@
+// Copyright 2019 The Chromium 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/viz/service/display_embedder/vsync_parameter_listener.h"
+
+#include <utility>
+
+namespace viz {
+
+constexpr base::TimeDelta VSyncParameterListener::kMaxTimebaseSkew;
+
+VSyncParameterListener::VSyncParameterListener(
+    mojom::VSyncParameterObserverPtr observer)
+    : observer_(std::move(observer)) {}
+
+VSyncParameterListener::~VSyncParameterListener() = default;
+
+void VSyncParameterListener::OnVSyncParametersUpdated(
+    base::TimeTicks timebase,
+    base::TimeDelta interval) {
+  if (ShouldSendUpdate(timebase, interval))
+    observer_->OnUpdateVSyncParameters(timebase, interval);
+}
+
+bool VSyncParameterListener::ShouldSendUpdate(base::TimeTicks timebase,
+                                              base::TimeDelta interval) {
+  // Ignore updates with interval 0.
+  if (interval.is_zero())
+    return false;
+
+  // Calculate an offset for the current timebase compared to the interval.
+  base::TimeDelta offset = timebase.since_origin() % interval;
+
+  // Always send updates if the interval changed.
+  if (last_interval_ == interval) {
+    base::TimeDelta offset_delta = (offset - last_offset_).magnitude();
+
+    // Take into account modulus wrap around near multiples of interval. For
+    // example, if interval=100μs then timebase=1099μs produces offset=99μs
+    // while timebase=1101μs produces offset=1μs. The difference in offsets
+    // should be 2μs instead of 98μs.
+    if (offset_delta > interval / 2)
+      offset_delta = interval - offset_delta;
+
+    // The interval is the same and skew is small, so don't send an update.
+    if (offset_delta < kMaxTimebaseSkew)
+      return false;
+  }
+
+  last_offset_ = offset;
+  last_interval_ = interval;
+
+  return true;
+}
+
+}  // namespace viz
diff --git a/components/viz/service/display_embedder/vsync_parameter_listener.h b/components/viz/service/display_embedder/vsync_parameter_listener.h
new file mode 100644
index 0000000..9dafba2
--- /dev/null
+++ b/components/viz/service/display_embedder/vsync_parameter_listener.h
@@ -0,0 +1,46 @@
+// Copyright 2019 The Chromium 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_VIZ_SERVICE_DISPLAY_EMBEDDER_VSYNC_PARAMETER_LISTENER_H_
+#define COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_VSYNC_PARAMETER_LISTENER_H_
+
+#include "base/macros.h"
+#include "base/time/time.h"
+#include "components/viz/service/viz_service_export.h"
+#include "services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom.h"
+
+namespace viz {
+
+// Sends updated vsync parameters over IPC when either the interval changes or
+// the timebase offset skews more than kMaxTimebaseSkew. Timebase skew for last
+// timebase sent to the observer T1 and a new timebase T2 is defined as
+// difference between T1 + N * interval and T2 + M * interval for N and M that
+// produce the smallest difference.
+class VIZ_SERVICE_EXPORT VSyncParameterListener {
+ public:
+  explicit VSyncParameterListener(mojom::VSyncParameterObserverPtr observer);
+  ~VSyncParameterListener();
+
+  void OnVSyncParametersUpdated(base::TimeTicks timebase,
+                                base::TimeDelta interval);
+
+ private:
+  friend class VSyncParameterListenerTestRunner;
+
+  static constexpr base::TimeDelta kMaxTimebaseSkew =
+      base::TimeDelta::FromMicroseconds(25);
+
+  bool ShouldSendUpdate(base::TimeTicks timebase, base::TimeDelta interval);
+
+  mojom::VSyncParameterObserverPtr observer_;
+
+  base::TimeDelta last_interval_;
+  base::TimeDelta last_offset_;
+
+  DISALLOW_COPY_AND_ASSIGN(VSyncParameterListener);
+};
+
+}  // namespace viz
+
+#endif  // COMPONENTS_VIZ_SERVICE_DISPLAY_EMBEDDER_VSYNC_PARAMETER_LISTENER_H_
diff --git a/components/viz/service/display_embedder/vsync_parameter_listener_unittest.cc b/components/viz/service/display_embedder/vsync_parameter_listener_unittest.cc
new file mode 100644
index 0000000..b5cd3d0
--- /dev/null
+++ b/components/viz/service/display_embedder/vsync_parameter_listener_unittest.cc
@@ -0,0 +1,85 @@
+// Copyright 2019 The Chromium 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/viz/service/display_embedder/vsync_parameter_listener.h"
+
+#include "base/time/time.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace viz {
+
+class VSyncParameterListenerTestRunner {
+ public:
+  VSyncParameterListenerTestRunner(int64_t interval_us, int64_t timebase_us)
+      : interval_(base::TimeDelta::FromMicroseconds(interval_us)),
+        timebase_(base::TimeTicks() +
+                  base::TimeDelta::FromMicroseconds(timebase_us)) {}
+
+  void RunTests() {
+    const uint64_t interval_us = interval_.InMicroseconds();
+    const uint64_t half_inteval_us = interval_us / 2;
+    const uint64_t max_timebase_skew_us =
+        VSyncParameterListener::kMaxTimebaseSkew.InMicroseconds();
+
+    // Timebase values very near the last timebase. Don't send an update.
+    EXPECT_FALSE(WillSendUpdate(max_timebase_skew_us - 1));
+    EXPECT_FALSE(WillSendUpdate(-1));
+    EXPECT_FALSE(WillSendUpdate(0));
+    EXPECT_FALSE(WillSendUpdate(1));
+    EXPECT_FALSE(WillSendUpdate(max_timebase_skew_us - 1));
+
+    // Timebase values in between intervals. Send an update.
+    EXPECT_TRUE(WillSendUpdate(max_timebase_skew_us));
+    EXPECT_TRUE(WillSendUpdate(half_inteval_us - 10));
+    EXPECT_TRUE(WillSendUpdate(half_inteval_us));
+    EXPECT_TRUE(WillSendUpdate(half_inteval_us + 10));
+    EXPECT_TRUE(WillSendUpdate(interval_us - max_timebase_skew_us));
+
+    // Timebase is near last timebase + interval. Don't send an update.
+    EXPECT_FALSE(WillSendUpdate(interval_us - max_timebase_skew_us + 1));
+    EXPECT_FALSE(WillSendUpdate(interval_us - 1));
+    EXPECT_FALSE(WillSendUpdate(interval_us));
+    EXPECT_FALSE(WillSendUpdate(interval_us + 1));
+    EXPECT_FALSE(WillSendUpdate(interval_us + max_timebase_skew_us - 1));
+
+    // Timebase values in between intervals but further away. Send an update.
+    EXPECT_TRUE(WillSendUpdate(interval_us + max_timebase_skew_us));
+    EXPECT_TRUE(WillSendUpdate(interval_us + half_inteval_us));
+    EXPECT_TRUE(WillSendUpdate(2 * interval_us - max_timebase_skew_us));
+    EXPECT_TRUE(WillSendUpdate(2 * interval_us + max_timebase_skew_us));
+  }
+
+ private:
+  // Checks if VSyncParameterListener will send an update when it sees
+  // |timebase_| and then |timebase_| + |timebase_difference_us|.
+  bool WillSendUpdate(int64_t timebase_difference_us) {
+    VSyncParameterListener listener(/*observer=*/nullptr);
+    EXPECT_TRUE(listener.ShouldSendUpdate(timebase_, interval_));
+
+    return listener.ShouldSendUpdate(
+        timebase_ + base::TimeDelta::FromMicroseconds(timebase_difference_us),
+        interval_);
+  }
+
+  base::TimeDelta interval_;
+  base::TimeTicks timebase_;
+};
+
+// Verify that timebase skew calculation works correctly near multiples of
+// the interval.
+TEST(VSyncParameterListenerTest, TimebaseMultipleOfInterval) {
+  uint64_t interval = 16671;
+  uint64_t timebase = interval * 100;
+  VSyncParameterListenerTestRunner(interval, timebase).RunTests();
+}
+
+// Verify that timebase skew calculation works correctly when timebase isn't
+// anywhere near a multiple of the interval.
+TEST(VSyncParameterListenerTest, TimebaseNotNearInterval) {
+  uint64_t interval = 16671;
+  uint64_t timebase = (interval * 100) + (interval / 2);
+  VSyncParameterListenerTestRunner(interval, timebase).RunTests();
+}
+
+}  // namespace viz
diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
index 9c9b4c4..68646411 100644
--- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
+++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.cc
@@ -12,6 +12,7 @@
 #include "components/viz/common/frame_sinks/begin_frame_source.h"
 #include "components/viz/service/display/display.h"
 #include "components/viz/service/display_embedder/display_provider.h"
+#include "components/viz/service/display_embedder/vsync_parameter_listener.h"
 #include "components/viz/service/frame_sinks/external_begin_frame_source_mojo.h"
 #include "components/viz/service/frame_sinks/frame_sink_manager_impl.h"
 #include "components/viz/service/hit_test/hit_test_aggregator.h"
@@ -150,8 +151,11 @@
 void RootCompositorFrameSinkImpl::SetDisplayVSyncParameters(
     base::TimeTicks timebase,
     base::TimeDelta interval) {
-  if (synthetic_begin_frame_source_)
+  if (synthetic_begin_frame_source_) {
     synthetic_begin_frame_source_->OnUpdateVSyncParameters(timebase, interval);
+    if (vsync_listener_)
+      vsync_listener_->OnVSyncParametersUpdated(timebase, interval);
+  }
 }
 
 void RootCompositorFrameSinkImpl::ForceImmediateDrawAndSwapIfPossible() {
@@ -183,6 +187,12 @@
 
 #endif  // defined(OS_ANDROID)
 
+void RootCompositorFrameSinkImpl::AddVSyncParameterObserver(
+    mojom::VSyncParameterObserverPtr observer) {
+  vsync_listener_ =
+      std::make_unique<VSyncParameterListener>(std::move(observer));
+}
+
 void RootCompositorFrameSinkImpl::SetNeedsBeginFrame(bool needs_begin_frame) {
   support_->SetNeedsBeginFrame(needs_begin_frame);
 }
diff --git a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h
index 873e207..cfdd1c3c 100644
--- a/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h
+++ b/components/viz/service/frame_sinks/root_compositor_frame_sink_impl.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "base/macros.h"
 #include "build/build_config.h"
 #include "components/viz/common/surfaces/frame_sink_id.h"
 #include "components/viz/common/surfaces/local_surface_id.h"
@@ -24,6 +25,7 @@
 class ExternalBeginFrameSource;
 class FrameSinkManagerImpl;
 class SyntheticBeginFrameSource;
+class VSyncParameterListener;
 
 // The viz portion of a root CompositorFrameSink. Holds the Binding/InterfacePtr
 // for the mojom::CompositorFrameSink interface and owns the Display.
@@ -56,6 +58,8 @@
   void SetSupportedRefreshRates(
       const std::vector<float>& supported_refresh_rates) override;
 #endif
+  void AddVSyncParameterObserver(
+      mojom::VSyncParameterObserverPtr observer) override;
 
   // mojom::CompositorFrameSink:
   void SetNeedsBeginFrame(bool needs_begin_frame) override;
@@ -111,6 +115,8 @@
   mojom::DisplayClientPtr display_client_;
   mojo::AssociatedBinding<mojom::DisplayPrivate> display_private_binding_;
 
+  std::unique_ptr<VSyncParameterListener> vsync_listener_;
+
   // Must be destroyed before |compositor_frame_sink_client_|. This must never
   // change for the lifetime of RootCompositorFrameSinkImpl.
   const std::unique_ptr<CompositorFrameSinkSupport> support_;
diff --git a/content/app/strings/translations/content_strings_ta.xtb b/content/app/strings/translations/content_strings_ta.xtb
index ae8e2d5b..27d846f 100644
--- a/content/app/strings/translations/content_strings_ta.xtb
+++ b/content/app/strings/translations/content_strings_ta.xtb
@@ -81,7 +81,7 @@
 <translation id="383465348367842624">'<ph name="ATSIGN" />' ஐத் தொடர்ந்து வரும் பகுதியில் '<ph name="INVALIDCHARACTER" />' சின்னம் இருக்கக்கூடாது.</translation>
 <translation id="3846214748874656680">முழுத்திரை வேண்டாம்</translation>
 <translation id="3920932319529768807">முடிவு</translation>
-<translation id="3924558731517983934">பயன்பாடு</translation>
+<translation id="3924558731517983934">ஆப்ஸ்</translation>
 <translation id="3944740393230681990">முன்னுரை</translation>
 <translation id="3960700977367013758">உருட்டல் பட்டி</translation>
 <translation id="4103419683916926126">மில்லிவினாடிகள்</translation>
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc
index e5a43b9..d28fa197 100644
--- a/content/browser/compositor/gpu_process_transport_factory.cc
+++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -36,6 +36,7 @@
 #include "components/viz/service/display_embedder/compositing_mode_reporter_impl.h"
 #include "components/viz/service/display_embedder/compositor_overlay_candidate_validator.h"
 #include "components/viz/service/display_embedder/server_shared_bitmap_manager.h"
+#include "components/viz/service/display_embedder/vsync_parameter_listener.h"
 #include "components/viz/service/frame_sinks/direct_layer_tree_frame_sink.h"
 #include "components/viz/service/frame_sinks/external_begin_frame_source_mojo.h"
 #include "components/viz/service/frame_sinks/frame_sink_manager_impl.h"
@@ -156,6 +157,7 @@
   std::unique_ptr<viz::Display> display;
   std::unique_ptr<viz::mojom::DisplayClient> display_client;
   bool output_is_secure = false;
+  std::unique_ptr<viz::VSyncParameterListener> vsync_listener;
 };
 
 GpuProcessTransportFactory::GpuProcessTransportFactory(
@@ -807,6 +809,8 @@
   if (data->synthetic_begin_frame_source) {
     data->synthetic_begin_frame_source->OnUpdateVSyncParameters(timebase,
                                                                 interval);
+    if (data->vsync_listener)
+      data->vsync_listener->OnVSyncParametersUpdated(timebase, interval);
   }
 }
 
@@ -834,6 +838,18 @@
     data->display->SetOutputIsSecure(secure);
 }
 
+void GpuProcessTransportFactory::AddVSyncParameterObserver(
+    ui::Compositor* compositor,
+    viz::mojom::VSyncParameterObserverPtr observer) {
+  auto it = per_compositor_data_.find(compositor);
+  if (it == per_compositor_data_.end())
+    return;
+  PerCompositorData* data = it->second.get();
+  DCHECK(data);
+  data->vsync_listener =
+      std::make_unique<viz::VSyncParameterListener>(std::move(observer));
+}
+
 void GpuProcessTransportFactory::AddObserver(
     ui::ContextFactoryObserver* observer) {
   observer_list_.AddObserver(observer);
diff --git a/content/browser/compositor/gpu_process_transport_factory.h b/content/browser/compositor/gpu_process_transport_factory.h
index 525fa0c..4a0b346 100644
--- a/content/browser/compositor/gpu_process_transport_factory.h
+++ b/content/browser/compositor/gpu_process_transport_factory.h
@@ -101,6 +101,9 @@
   void IssueExternalBeginFrame(ui::Compositor* compositor,
                                const viz::BeginFrameArgs& args) override;
   void SetOutputIsSecure(ui::Compositor* compositor, bool secure) override;
+  void AddVSyncParameterObserver(
+      ui::Compositor* compositor,
+      viz::mojom::VSyncParameterObserverPtr observer) override;
 
   // ImageTransportFactory implementation.
   void DisableGpuCompositing() override;
diff --git a/content/browser/compositor/test/test_image_transport_factory.h b/content/browser/compositor/test/test_image_transport_factory.h
index 4cbfcc0..b482995 100644
--- a/content/browser/compositor/test/test_image_transport_factory.h
+++ b/content/browser/compositor/test/test_image_transport_factory.h
@@ -18,6 +18,7 @@
 #include "components/viz/host/host_frame_sink_manager.h"
 #include "components/viz/test/test_gpu_memory_buffer_manager.h"
 #include "content/browser/compositor/image_transport_factory.h"
+#include "services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom.h"
 #include "ui/compositor/compositor.h"
 
 namespace viz {
@@ -79,6 +80,9 @@
   void IssueExternalBeginFrame(ui::Compositor* compositor,
                                const viz::BeginFrameArgs& args) override {}
   void SetOutputIsSecure(ui::Compositor* compositor, bool secure) override {}
+  void AddVSyncParameterObserver(
+      ui::Compositor* compositor,
+      viz::mojom::VSyncParameterObserverPtr observer) override {}
   viz::FrameSinkManagerImpl* GetFrameSinkManager() override;
 
   // ImageTransportFactory implementation.
diff --git a/content/browser/device_sensors/device_sensor_browsertest.cc b/content/browser/device_sensors/device_sensor_browsertest.cc
index 1242b41d6..f3d12aa 100644
--- a/content/browser/device_sensors/device_sensor_browsertest.cc
+++ b/content/browser/device_sensors/device_sensor_browsertest.cc
@@ -95,9 +95,8 @@
             shell()->GetJavaScriptDialogManager(shell()->web_contents()));
 
     scoped_refptr<MessageLoopRunner> runner = new MessageLoopRunner();
-    dialog_manager->set_dialog_request_callback(
-        base::Bind(&DeviceSensorBrowserTest::DelayAndQuit,
-                   base::Unretained(this), delay));
+    dialog_manager->set_dialog_request_callback(base::BindOnce(
+        &DeviceSensorBrowserTest::DelayAndQuit, base::Unretained(this), delay));
     runner->Run();
   }
 
diff --git a/content/browser/devtools/devtools_instrumentation.cc b/content/browser/devtools/devtools_instrumentation.cc
index 27795d2..4dbe013 100644
--- a/content/browser/devtools/devtools_instrumentation.cc
+++ b/content/browser/devtools/devtools_instrumentation.cc
@@ -81,6 +81,19 @@
                    protocol::Network::ResourceTypeEnum::Document, status);
 }
 
+void WillBeginDownload(int render_process_id,
+                       int render_frame_id,
+                       const GURL& url) {
+  auto* rfh = static_cast<RenderFrameHostImpl*>(
+      RenderFrameHost::FromID(render_process_id, render_frame_id));
+  FrameTreeNode* ftn =
+      rfh ? FrameTreeNode::GloballyFindByID(rfh->GetFrameTreeNodeId())
+          : nullptr;
+  if (!ftn)
+    return;
+  DispatchToAgents(ftn, &protocol::PageHandler::DownloadWillBegin, ftn, url);
+}
+
 void OnSignedExchangeReceived(
     FrameTreeNode* frame_tree_node,
     base::Optional<const base::UnguessableToken> devtools_navigation_token,
diff --git a/content/browser/devtools/devtools_instrumentation.h b/content/browser/devtools/devtools_instrumentation.h
index 605e388..1805184 100644
--- a/content/browser/devtools/devtools_instrumentation.h
+++ b/content/browser/devtools/devtools_instrumentation.h
@@ -74,6 +74,10 @@
     const NavigationRequest& nav_request,
     const network::URLLoaderCompletionStatus& status);
 
+void WillBeginDownload(int render_process_id,
+                       int render_frame_id,
+                       const GURL& url);
+
 void OnSignedExchangeReceived(
     FrameTreeNode* frame_tree_node,
     base::Optional<const base::UnguessableToken> devtools_navigation_token,
diff --git a/content/browser/devtools/protocol/page_handler.cc b/content/browser/devtools/protocol/page_handler.cc
index d0adc36d..00b80d25 100644
--- a/content/browser/devtools/protocol/page_handler.cc
+++ b/content/browser/devtools/protocol/page_handler.cc
@@ -521,6 +521,13 @@
   navigate_callbacks_.erase(navigate_callback);
 }
 
+void PageHandler::DownloadWillBegin(FrameTreeNode* ftn, const GURL& url) {
+  if (!enabled_)
+    return;
+  frontend_->DownloadWillBegin(ftn->devtools_frame_token().ToString(),
+                               url.spec());
+}
+
 static const char* TransitionTypeName(ui::PageTransition type) {
   int32_t t = type & ~ui::PAGE_TRANSITION_QUALIFIER_MASK;
   switch (t) {
diff --git a/content/browser/devtools/protocol/page_handler.h b/content/browser/devtools/protocol/page_handler.h
index 4bee8ba..f56fff3b 100644
--- a/content/browser/devtools/protocol/page_handler.h
+++ b/content/browser/devtools/protocol/page_handler.h
@@ -46,6 +46,7 @@
 namespace content {
 
 class DevToolsAgentHostImpl;
+class FrameTreeNode;
 class NavigationRequest;
 class RenderFrameHostImpl;
 class WebContentsImpl;
@@ -68,6 +69,7 @@
   void Wire(UberDispatcher* dispatcher) override;
   void SetRenderer(int process_host_id,
                    RenderFrameHostImpl* frame_host) override;
+  // Instrumentation signals.
   void OnSynchronousSwapCompositorFrame(
       viz::CompositorFrameMetadata frame_metadata);
   void DidAttachInterstitialPage();
@@ -86,6 +88,8 @@
                                  JavaScriptDialogCallback callback);
   void DidCloseJavaScriptDialog(bool success, const base::string16& user_input);
   void NavigationReset(NavigationRequest* navigation_request);
+  void DownloadWillBegin(FrameTreeNode* ftn, const GURL& url);
+
   WebContentsImpl* GetWebContents();
 
   Response Enable() override;
diff --git a/content/browser/devtools/protocol_config.json b/content/browser/devtools/protocol_config.json
index 3e9a571..eaec673 100644
--- a/content/browser/devtools/protocol_config.json
+++ b/content/browser/devtools/protocol_config.json
@@ -58,7 +58,7 @@
                 "include": ["enable", "disable", "reload", "navigate", "stopLoading", "getNavigationHistory", "navigateToHistoryEntry", "resetNavigationHistory", "captureScreenshot",
                     "startScreencast", "stopScreencast", "screencastFrameAck", "handleJavaScriptDialog", "setColorPickerEnabled",
                     "printToPDF", "bringToFront", "setDownloadBehavior", "getAppManifest", "crash", "close", "setWebLifecycleState", "captureSnapshot", "getInstallabilityErrors"],
-                "include_events": ["colorPicked", "interstitialShown", "interstitialHidden", "javascriptDialogOpening", "javascriptDialogClosed", "screencastVisibilityChanged", "screencastFrame"],
+                "include_events": ["colorPicked", "interstitialShown", "interstitialHidden", "javascriptDialogOpening", "javascriptDialogClosed", "downloadWillBegin", "screencastVisibilityChanged", "screencastFrame"],
                 "async": ["captureScreenshot", "printToPDF", "navigate", "getAppManifest", "reload", "captureSnapshot", "getInstallabilityErrors"]
             },
             {
diff --git a/content/browser/download/download_manager_impl.cc b/content/browser/download/download_manager_impl.cc
index 54a5ac9d0..02d54e7 100644
--- a/content/browser/download/download_manager_impl.cc
+++ b/content/browser/download/download_manager_impl.cc
@@ -560,15 +560,17 @@
     }
   }
 
-  if (!delegate_ ||
-      !delegate_->InterceptDownloadIfApplicable(
+  if (delegate_ &&
+      delegate_->InterceptDownloadIfApplicable(
           info.url(), user_agent, info.content_disposition, info.mime_type,
           info.request_origin, info.total_bytes, web_contents)) {
-    return false;
+    if (info.request_handle)
+      info.request_handle->CancelRequest(false);
+    return true;
   }
-  if (info.request_handle)
-    info.request_handle->CancelRequest(false);
-  return true;
+  content::devtools_instrumentation::WillBeginDownload(
+      info.render_process_id, info.render_frame_id, info.url());
+  return false;
 }
 
 base::FilePath DownloadManagerImpl::GetDefaultDownloadDirectory() {
diff --git a/content/browser/media/flinging_renderer.cc b/content/browser/media/flinging_renderer.cc
index 83cf1aa5..336efe11 100644
--- a/content/browser/media/flinging_renderer.cc
+++ b/content/browser/media/flinging_renderer.cc
@@ -4,6 +4,8 @@
 
 #include "content/browser/media/flinging_renderer.h"
 
+#include <utility>
+
 #include "base/memory/ptr_util.h"
 #include "content/browser/frame_host/render_frame_host_delegate.h"
 #include "content/browser/frame_host/render_frame_host_impl.h"
@@ -15,8 +17,10 @@
 namespace content {
 
 FlingingRenderer::FlingingRenderer(
-    std::unique_ptr<media::FlingingController> controller)
-    : controller_(std::move(controller)) {
+    std::unique_ptr<media::FlingingController> controller,
+    ClientExtensionPtr client_extension)
+    : client_extension_(std::move(client_extension)),
+      controller_(std::move(controller)) {
   controller_->AddMediaStatusObserver(this);
 }
 
@@ -27,7 +31,8 @@
 // static
 std::unique_ptr<FlingingRenderer> FlingingRenderer::Create(
     RenderFrameHost* render_frame_host,
-    const std::string& presentation_id) {
+    const std::string& presentation_id,
+    ClientExtensionPtr client_extension) {
   DVLOG(1) << __func__;
 
   ContentClient* content_client = GetContentClient();
@@ -54,8 +59,8 @@
   if (!flinging_controller)
     return nullptr;
 
-  return base::WrapUnique<FlingingRenderer>(
-      new FlingingRenderer(std::move(flinging_controller)));
+  return base::WrapUnique<FlingingRenderer>(new FlingingRenderer(
+      std::move(flinging_controller), std::move(client_extension)));
 }
 
 // media::Renderer implementation
@@ -158,7 +163,7 @@
   // reached a new stable PlayState without WMPI having asked for it.
   // Let WMPI know it should update itself.
   if (current_state != target_play_state_)
-    client_->OnRemotePlayStateChange(current_state);
+    client_extension_->OnRemotePlayStateChange(current_state);
 }
 
 }  // namespace content
diff --git a/content/browser/media/flinging_renderer.h b/content/browser/media/flinging_renderer.h
index 5279b14e..f4debfb 100644
--- a/content/browser/media/flinging_renderer.h
+++ b/content/browser/media/flinging_renderer.h
@@ -12,6 +12,7 @@
 #include "media/base/media_status_observer.h"
 #include "media/base/renderer.h"
 #include "media/base/renderer_client.h"
+#include "media/mojo/interfaces/renderer_extensions.mojom.h"
 #include "url/gurl.h"
 
 namespace content {
@@ -27,13 +28,16 @@
 class CONTENT_EXPORT FlingingRenderer : public media::Renderer,
                                         media::MediaStatusObserver {
  public:
+  using ClientExtensionPtr = media::mojom::FlingingRendererClientExtensionPtr;
+
   // Helper method to create a FlingingRenderer from an already existing
   // presentation ID.
   // Returns nullptr if there was an error getting the MediaControllor for the
   // given presentation ID.
   static std::unique_ptr<FlingingRenderer> Create(
       RenderFrameHost* render_frame_host,
-      const std::string& presentation_id);
+      const std::string& presentation_id,
+      ClientExtensionPtr client_extension);
 
   ~FlingingRenderer() override;
 
@@ -57,7 +61,8 @@
   using PlayState = media::MediaStatus::State;
 
   explicit FlingingRenderer(
-      std::unique_ptr<media::FlingingController> controller);
+      std::unique_ptr<media::FlingingController> controller,
+      ClientExtensionPtr client_extension);
 
   void SetTargetPlayState(PlayState state);
 
@@ -69,6 +74,8 @@
 
   media::RendererClient* client_;
 
+  ClientExtensionPtr client_extension_;
+
   std::unique_ptr<media::FlingingController> controller_;
 
   DISALLOW_COPY_AND_ASSIGN(FlingingRenderer);
diff --git a/content/browser/media/flinging_renderer_unittest.cc b/content/browser/media/flinging_renderer_unittest.cc
index af57fbb..b2a9a40 100644
--- a/content/browser/media/flinging_renderer_unittest.cc
+++ b/content/browser/media/flinging_renderer_unittest.cc
@@ -53,7 +53,8 @@
     EXPECT_CALL(*flinging_controller_, RemoveMediaStatusObserver(_));
 
     renderer_ = base::WrapUnique(new FlingingRenderer(
-        std::unique_ptr<media::FlingingController>(flinging_controller_)));
+        std::unique_ptr<media::FlingingController>(flinging_controller_),
+        nullptr));
 
     renderer_->Initialize(nullptr, &renderer_client_, base::DoNothing());
   }
diff --git a/content/browser/media/media_interface_proxy.cc b/content/browser/media/media_interface_proxy.cc
index 800af41..53ac65c8d 100644
--- a/content/browser/media/media_interface_proxy.cc
+++ b/content/browser/media/media_interface_proxy.cc
@@ -177,13 +177,15 @@
 #if defined(OS_ANDROID)
 void MediaInterfaceProxy::CreateFlingingRenderer(
     const std::string& presentation_id,
+    media::mojom::FlingingRendererClientExtensionPtr client_extension,
     media::mojom::RendererRequest request) {
   DCHECK(thread_checker_.CalledOnValidThread());
-  std::unique_ptr<FlingingRenderer> renderer =
-      FlingingRenderer::Create(render_frame_host_, presentation_id);
 
-  media::MojoRendererService::Create(nullptr, std::move(renderer),
-                                     std::move(request));
+  media::MojoRendererService::Create(
+      nullptr,
+      FlingingRenderer::Create(render_frame_host_, presentation_id,
+                               std::move(client_extension)),
+      std::move(request));
 }
 
 void MediaInterfaceProxy::CreateMediaPlayerRenderer(
diff --git a/content/browser/media/media_interface_proxy.h b/content/browser/media/media_interface_proxy.h
index 90221c959..ae405bd 100644
--- a/content/browser/media/media_interface_proxy.h
+++ b/content/browser/media/media_interface_proxy.h
@@ -56,8 +56,10 @@
                           media::mojom::RendererRequest request) final;
 #endif
 #if defined(OS_ANDROID)
-  void CreateFlingingRenderer(const std::string& presentation_id,
-                              media::mojom::RendererRequest request) final;
+  void CreateFlingingRenderer(
+      const std::string& presentation_id,
+      media::mojom::FlingingRendererClientExtensionPtr client_extension,
+      media::mojom::RendererRequest request) final;
   void CreateMediaPlayerRenderer(
       media::mojom::MediaPlayerRendererClientExtensionPtr client_extension_ptr,
       media::mojom::RendererRequest request,
diff --git a/content/browser/media/video_decoder_proxy.cc b/content/browser/media/video_decoder_proxy.cc
index 437b5632..ef825a53 100644
--- a/content/browser/media/video_decoder_proxy.cc
+++ b/content/browser/media/video_decoder_proxy.cc
@@ -55,6 +55,7 @@
 #if defined(OS_ANDROID)
 void VideoDecoderProxy::CreateFlingingRenderer(
     const std::string& audio_device_id,
+    media::mojom::FlingingRendererClientExtensionPtr client_extenion,
     media::mojom::RendererRequest request) {}
 
 void VideoDecoderProxy::CreateMediaPlayerRenderer(
diff --git a/content/browser/media/video_decoder_proxy.h b/content/browser/media/video_decoder_proxy.h
index 6ea8233..aaf0330 100644
--- a/content/browser/media/video_decoder_proxy.h
+++ b/content/browser/media/video_decoder_proxy.h
@@ -43,8 +43,10 @@
       media::mojom::RendererRequest request,
       media::mojom::MediaPlayerRendererExtensionRequest
           renderer_extension_request) final;
-  void CreateFlingingRenderer(const std::string& presentation_id,
-                              media::mojom::RendererRequest request) final;
+  void CreateFlingingRenderer(
+      const std::string& presentation_id,
+      media::mojom::FlingingRendererClientExtensionPtr client_extension,
+      media::mojom::RendererRequest request) final;
 #endif  // defined(OS_ANDROID)
   void CreateCdm(const std::string& key_system,
                  media::mojom::ContentDecryptionModuleRequest request) final;
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index 3da9f72..2a62ca0 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -83,7 +83,6 @@
 #include "ui/base/ui_base_switches.h"
 #include "ui/base/ui_base_switches_util.h"
 #include "ui/base/ui_base_types.h"
-#include "ui/compositor/compositor_vsync_manager.h"
 #include "ui/compositor/dip_util.h"
 #include "ui/display/screen.h"
 #include "ui/events/blink/blink_event_util.h"
diff --git a/content/browser/service_manager/service_manager_context_browsertest.cc b/content/browser/service_manager/service_manager_context_browsertest.cc
index df6ffb9..8f753d45 100644
--- a/content/browser/service_manager/service_manager_context_browsertest.cc
+++ b/content/browser/service_manager/service_manager_context_browsertest.cc
@@ -99,7 +99,7 @@
                        MANUAL_TerminateOnServiceQuit) {
   ShellContentBrowserClient::Get()
       ->set_should_terminate_on_service_quit_callback(
-          base::Bind(&ShouldTerminateOnServiceQuit));
+          base::BindOnce(&ShouldTerminateOnServiceQuit));
 
   // Launch a test service.
   echo::mojom::EchoPtr echo_ptr;
diff --git a/content/browser/service_worker/service_worker_tls_browsertest.cc b/content/browser/service_worker/service_worker_tls_browsertest.cc
index 1c6b1dc..ecda2912 100644
--- a/content/browser/service_worker/service_worker_tls_browsertest.cc
+++ b/content/browser/service_worker/service_worker_tls_browsertest.cc
@@ -25,16 +25,11 @@
 
   void SetUpOnMainThread() override {
     ShellContentBrowserClient::Get()->set_select_client_certificate_callback(
-        base::BindRepeating(&ServiceWorkerTlsTest::OnSelectClientCertificate,
-                            base::Unretained(this)));
+        base::BindOnce(&ServiceWorkerTlsTest::OnSelectClientCertificate,
+                       base::Unretained(this)));
     ASSERT_TRUE(embedded_test_server()->Start());
   }
 
-  void TearDownOnMainThread() override {
-    ShellContentBrowserClient::Get()->set_select_client_certificate_callback(
-        base::RepeatingClosure());
-  }
-
   int select_certificate_count() const { return select_certificate_count_; }
 
   GURL GetTestURL(const std::string& test_case, const std::string& query) {
diff --git a/content/browser/tracing/background_tracing_active_scenario.cc b/content/browser/tracing/background_tracing_active_scenario.cc
index 558bc51..7fad9c7 100644
--- a/content/browser/tracing/background_tracing_active_scenario.cc
+++ b/content/browser/tracing/background_tracing_active_scenario.cc
@@ -147,7 +147,12 @@
   // Perfetto-related deadlocks are resolved.
   if (!TracingControllerImpl::GetInstance()->IsTracing() &&
       tracing::TracingUsesPerfettoBackend()) {
-    tracing::TraceEventDataSource::GetInstance()->SetupStartupTracing();
+    // TODO(oysteine): This should pass in |requires_anonymized_data_| instead
+    // of false only when using consumer API with proto output. But, for JSON
+    // output we still need this to be false since filtering happens in the JSON
+    // exporter.
+    tracing::TraceEventDataSource::GetInstance()->SetupStartupTracing(
+        /*privacy_filtering_enabled=*/false);
   }
 #endif
 
diff --git a/content/browser/tracing/perfetto_file_tracer.cc b/content/browser/tracing/perfetto_file_tracer.cc
index b977c4d..d1f93a13 100644
--- a/content/browser/tracing/perfetto_file_tracer.cc
+++ b/content/browser/tracing/perfetto_file_tracer.cc
@@ -9,6 +9,7 @@
 #include "base/command_line.h"
 #include "base/files/file.h"
 #include "base/files/file_util.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/task/post_task.h"
 #include "base/threading/scoped_blocking_call.h"
 #include "components/tracing/common/trace_startup_config.h"
@@ -16,6 +17,7 @@
 #include "content/public/common/service_manager_connection.h"
 #include "mojo/public/cpp/system/data_pipe_drainer.h"
 #include "services/service_manager/public/cpp/connector.h"
+#include "services/tracing/public/cpp/perfetto/perfetto_config.h"
 #include "services/tracing/public/mojom/constants.mojom.h"
 #include "third_party/perfetto/include/perfetto/tracing/core/trace_config.h"
 #include "third_party/perfetto/protos/perfetto/config/trace_config.pb.h"
@@ -89,36 +91,27 @@
   ServiceManagerConnection::GetForProcess()->GetConnector()->BindInterface(
       tracing::mojom::kServiceName, &consumer_host_);
 
-  perfetto::TraceConfig trace_config;
+  const auto& chrome_config =
+      tracing::TraceStartupConfig::GetInstance()->GetTraceConfig();
+  perfetto::TraceConfig trace_config =
+      tracing::GetDefaultPerfettoConfig(chrome_config);
+
+  // TODO(ssid): This should be moved to GetDefaultPerfettoConfig(). But,
+  // currently we only require this for proto output since JSON exporter still
+  // needs sensitive fields in trace, which will later be stripped.
+  for (auto& source : *trace_config.mutable_data_sources()) {
+    source.mutable_config()
+        ->mutable_chrome_config()
+        ->set_privacy_filtering_enabled(
+            chrome_config.IsArgumentFilterEnabled());
+  }
+
   int duration_in_seconds =
       tracing::TraceStartupConfig::GetInstance()->GetStartupDuration();
   trace_config.set_duration_ms(duration_in_seconds * 1000);
 
   // We just need a single global trace buffer, for our data.
-  trace_config.add_buffers()->set_size_kb(32 * 1024);
-
-  // We need data from two different sources to get the complete trace
-  // we're interested in both, written into the single buffer we
-  // configure above.
-
-  // This source is the actual trace events themselves coming
-  // from the base::TraceLog
-  auto* trace_event_config = trace_config.add_data_sources()->mutable_config();
-  trace_event_config->set_name(tracing::mojom::kTraceEventDataSourceName);
-  trace_event_config->set_target_buffer(0);
-  auto* chrome_config = trace_event_config->mutable_chrome_config();
-
-  // The Chrome config string is passed straight through to base::TraceLog
-  // and defines which tracing categories should be enabled.
-  auto chrome_raw_config =
-      tracing::TraceStartupConfig::GetInstance()->GetTraceConfig().ToString();
-  chrome_config->set_trace_config(chrome_raw_config);
-
-  // The second data source we're interested in is the global metadata.
-  auto* trace_metadata_config =
-      trace_config.add_data_sources()->mutable_config();
-  trace_metadata_config->set_name(tracing::mojom::kMetaDataSourceName);
-  trace_metadata_config->set_target_buffer(0);
+  trace_config.mutable_buffers()->front().set_size_kb(32 * 1024);
 
   tracing::mojom::TracingSessionPtr tracing_session;
   binding_.Bind(mojo::MakeRequest(&tracing_session));
diff --git a/content/browser/tracing/perfetto_file_tracer.h b/content/browser/tracing/perfetto_file_tracer.h
index e6ca8ac77..df24c5f 100644
--- a/content/browser/tracing/perfetto_file_tracer.h
+++ b/content/browser/tracing/perfetto_file_tracer.h
@@ -33,6 +33,8 @@
   // tracing::mojom::TracingSession implementation:
   void OnTracingEnabled() override;
 
+  bool is_finished_for_testing() const { return !background_drainer_; }
+
  private:
   void OnNoMorePackets(bool queued_after_disable);
   void ReadBuffers();
diff --git a/content/browser/tracing/startup_tracing_browsertest.cc b/content/browser/tracing/startup_tracing_browsertest.cc
index 02cc57c9..e6fe871 100644
--- a/content/browser/tracing/startup_tracing_browsertest.cc
+++ b/content/browser/tracing/startup_tracing_browsertest.cc
@@ -11,9 +11,11 @@
 #include "build/build_config.h"
 #include "components/tracing/common/trace_startup_config.h"
 #include "components/tracing/common/tracing_switches.h"
+#include "content/browser/tracing/perfetto_file_tracer.h"
 #include "content/browser/tracing/tracing_controller_impl.h"
 #include "content/public/test/content_browser_test.h"
 #include "content/public/test/content_browser_test_utils.h"
+#include "services/tracing/perfetto/privacy_filtering_check.h"
 #include "services/tracing/public/cpp/perfetto/trace_event_data_source.h"
 #include "services/tracing/public/cpp/trace_startup.h"
 #include "services/tracing/public/cpp/tracing_features.h"
@@ -25,7 +27,7 @@
 // Wait until |condition| returns true.
 void WaitForCondition(base::RepeatingCallback<bool()> condition,
                       const std::string& description) {
-  const base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(30);
+  const base::TimeDelta kTimeout = base::TimeDelta::FromSeconds(15);
   const base::TimeTicks start_time = base::TimeTicks::Now();
   while (!condition.Run() && (base::TimeTicks::Now() - start_time < kTimeout)) {
     base::RunLoop run_loop;
@@ -39,7 +41,10 @@
 
 }  // namespace
 
-class StartupTracingControllerTest : public ContentBrowserTest {
+class CommandlineStartupTracingTest : public ContentBrowserTest {
+ public:
+  CommandlineStartupTracingTest() = default;
+
   void SetUpCommandLine(base::CommandLine* command_line) override {
     base::CreateTemporaryFile(&temp_file_path_);
     command_line->AppendSwitch(switches::kTraceStartup);
@@ -58,10 +63,13 @@
 
  protected:
   base::FilePath temp_file_path_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(CommandlineStartupTracingTest);
 };
 
-IN_PROC_BROWSER_TEST_F(StartupTracingControllerTest, TestStartupTracing) {
-  NavigateToURL(shell(), GetTestUrl("", "title.html"));
+IN_PROC_BROWSER_TEST_F(CommandlineStartupTracingTest, TestStartupTracing) {
+  NavigateToURL(shell(), GetTestUrl("", "title1.html"));
   WaitForCondition(base::BindRepeating([]() {
                      return !TracingController::GetInstance()->IsTracing();
                    }),
@@ -116,7 +124,8 @@
 // deadlocks.
 IN_PROC_BROWSER_TEST_F(StartupTracingInProcessTest,
                        DISABLED_TestFilledStartupBuffer) {
-  tracing::TraceEventDataSource::GetInstance()->SetupStartupTracing();
+  tracing::TraceEventDataSource::GetInstance()->SetupStartupTracing(
+      /*privacy_filtering_enabled=*/false);
 
   auto config = tracing::TraceStartupConfig::GetInstance()
                     ->GetDefaultBrowserStartupConfig();
@@ -138,4 +147,56 @@
   NavigateToURL(shell(), GetTestUrl("", "title1.html"));
 }
 
+class BackgroundStartupTracingTest : public ContentBrowserTest {
+ public:
+  BackgroundStartupTracingTest() = default;
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    base::CreateTemporaryFile(&temp_file_path_);
+    auto* startup_config = tracing::TraceStartupConfig::GetInstance();
+    startup_config->is_enabled_from_background_tracing_ = true;
+    startup_config->EnableFromBackgroundTracing();
+    startup_config->startup_duration_ = 3;
+    tracing::EnableStartupTracingIfNeeded();
+    command_line->AppendSwitchASCII(switches::kPerfettoOutputFile,
+                                    temp_file_path_.AsUTF8Unsafe());
+  }
+
+ protected:
+  base::FilePath temp_file_path_;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BackgroundStartupTracingTest);
+};
+
+#if !defined(OS_ANDROID)
+#define MAYBE_TestStartupTracing DISABLED_TestStartupTracing
+#else
+#define MAYBE_TestStartupTracing TestStartupTracing
+#endif
+IN_PROC_BROWSER_TEST_F(BackgroundStartupTracingTest, MAYBE_TestStartupTracing) {
+  NavigateToURL(shell(), GetTestUrl("", "title1.html"));
+
+  EXPECT_FALSE(tracing::TraceStartupConfig::GetInstance()->IsEnabled());
+  EXPECT_FALSE(TracingController::GetInstance()->IsTracing());
+  WaitForCondition(base::BindRepeating([]() {
+                     return TracingControllerImpl::GetInstance()
+                         ->perfetto_file_tracer_for_testing()
+                         ->is_finished_for_testing();
+                   }),
+                   "finish file write");
+
+  std::string trace;
+  base::ScopedAllowBlockingForTesting allow_blocking;
+  ASSERT_TRUE(base::ReadFileToString(temp_file_path_, &trace));
+  tracing::PrivacyFilteringCheck checker;
+  checker.CheckProtoForUnexpectedFields(trace);
+  EXPECT_GT(checker.counts().track_event, 0u);
+  EXPECT_EQ(checker.counts().process_desc, 0u);
+  EXPECT_GT(checker.counts().thread_desc, 0u);
+  EXPECT_GT(checker.counts().interned_name, 0u);
+  EXPECT_GT(checker.counts().interned_category, 0u);
+  EXPECT_GT(checker.counts().interned_source_location, 0u);
+}
+
 }  // namespace content
diff --git a/content/browser/tracing/tracing_controller_impl.h b/content/browser/tracing/tracing_controller_impl.h
index 58242048f..c91a3b7 100644
--- a/content/browser/tracing/tracing_controller_impl.h
+++ b/content/browser/tracing/tracing_controller_impl.h
@@ -84,6 +84,10 @@
   // exists.
   void FinalizeStartupTracingIfNeeded();
 
+  const PerfettoFileTracer* perfetto_file_tracer_for_testing() const {
+    return perfetto_file_tracer_.get();
+  }
+
  private:
   friend std::default_delete<TracingControllerImpl>;
 
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index fac9501..1729f407 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1933,11 +1933,10 @@
 }
 
 void WebContentsImpl::DidChangeVisibleSecurityState() {
-  if (delegate_) {
+  if (delegate_)
     delegate_->VisibleSecurityStateChanged(this);
-    for (auto& observer : observers_)
-      observer.DidChangeVisibleSecurityState();
-  }
+  for (auto& observer : observers_)
+    observer.DidChangeVisibleSecurityState();
 }
 
 void WebContentsImpl::NotifyPreferencesChanged() {
diff --git a/content/browser/worker_host/worker_browsertest.cc b/content/browser/worker_host/worker_browsertest.cc
index 06b4520d..ace531d 100644
--- a/content/browser/worker_host/worker_browsertest.cc
+++ b/content/browser/worker_host/worker_browsertest.cc
@@ -10,10 +10,12 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/system/sys_info.h"
 #include "base/task/post_task.h"
+#include "base/test/bind_test_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_timeouts.h"
 #include "base/threading/thread_restrictions.h"
 #include "build/build_config.h"
+#include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/client_certificate_delegate.h"
@@ -23,14 +25,18 @@
 #include "content/public/test/content_browser_test.h"
 #include "content/public/test/content_browser_test_utils.h"
 #include "content/public/test/test_utils.h"
+#include "content/public/test/url_loader_interceptor.h"
 #include "content/shell/browser/shell.h"
 #include "content/shell/browser/shell_content_browser_client.h"
+#include "content/test/content_browser_test_utils_internal.h"
 #include "net/base/escape.h"
 #include "net/base/filename_util.h"
+#include "net/dns/mock_host_resolver.h"
 #include "net/ssl/ssl_server_config.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 #include "net/test/spawned_test_server/spawned_test_server.h"
 #include "net/test/test_data_directory.h"
+#include "services/network/public/cpp/features.h"
 #include "url/gurl.h"
 
 namespace content {
@@ -56,17 +62,13 @@
   WorkerTest() : select_certificate_count_(0) {}
 
   void SetUpOnMainThread() override {
+    host_resolver()->AddRule("*", "127.0.0.1");
     ShellContentBrowserClient::Get()->set_select_client_certificate_callback(
-        base::Bind(&WorkerTest::OnSelectClientCertificate,
-                   base::Unretained(this)));
+        base::BindOnce(&WorkerTest::OnSelectClientCertificate,
+                       base::Unretained(this)));
     ASSERT_TRUE(embedded_test_server()->Start());
   }
 
-  void TearDownOnMainThread() override {
-    ShellContentBrowserClient::Get()->set_select_client_certificate_callback(
-        base::Closure());
-  }
-
   int select_certificate_count() const { return select_certificate_count_; }
 
   GURL GetTestFileURL(const std::string& test_case) {
@@ -106,7 +108,7 @@
         ShellContentBrowserClient::Get();
     scoped_refptr<MessageLoopRunner> runner = new MessageLoopRunner();
     browser_client->set_login_request_callback(
-        base::Bind(&QuitUIMessageLoop, runner->QuitClosure()));
+        base::BindOnce(&QuitUIMessageLoop, runner->QuitClosure()));
     shell()->LoadURL(url);
     runner->Run();
   }
@@ -272,4 +274,62 @@
       "pass_messageport_to_sharedworker_dont_wait_for_connect.html", ""));
 }
 
+// Tests the value of |request_initiator| for shared worker resources.
+IN_PROC_BROWSER_TEST_F(WorkerTest, VerifyInitiatorSharedWorker) {
+  // TODO(cammie): Remove the condition that network service must be
+  // enabled once it is enabled on all platforms?
+  // The main body of the test won't currently work unless network service
+  // is enabled (e.g. not on cast-shell-linux as of 2019/04).
+  if (!SupportsSharedWorker() ||
+      !base::FeatureList::IsEnabled(network::features::kNetworkService))
+    return;
+
+  const GURL start_url(embedded_test_server()->GetURL("/frame_tree/top.html"));
+  EXPECT_TRUE(NavigateToURL(shell(), start_url));
+
+  // To make things tricky about |top_frame_origin|, this test navigates to
+  // a page on |embedded_test_server()| which has a cross-origin iframe that
+  // registers the worker.
+  std::string cross_site_domain("cross-site.com");
+  const GURL test_url(embedded_test_server()->GetURL(
+      cross_site_domain, "/workers/simple_shared_worker.html"));
+
+  // There are three requests to test:
+  // 1) The request for the worker itself ("worker.js")
+  // 2) importScripts("empty.js") from the worker
+  // 3) fetch("empty.html") from the worker
+  const GURL worker_url(
+      embedded_test_server()->GetURL(cross_site_domain, "/workers/worker.js"));
+  const GURL script_url(
+      embedded_test_server()->GetURL(cross_site_domain, "/workers/empty.js"));
+  const GURL resource_url(
+      embedded_test_server()->GetURL(cross_site_domain, "/workers/empty.html"));
+
+  std::set<GURL> expected_request_urls = {worker_url, script_url, resource_url};
+  const url::Origin expected_origin =
+      url::Origin::Create(worker_url.GetOrigin());
+
+  base::RunLoop waiter;
+  URLLoaderInterceptor interceptor(base::BindLambdaForTesting(
+      [&](URLLoaderInterceptor::RequestParams* params) {
+        auto it = expected_request_urls.find(params->url_request.url);
+        if (it != expected_request_urls.end()) {
+          EXPECT_FALSE(params->url_request.top_frame_origin.has_value());
+          EXPECT_TRUE(params->url_request.request_initiator.has_value());
+          EXPECT_EQ(expected_origin,
+                    params->url_request.request_initiator.value());
+          expected_request_urls.erase(it);
+        }
+        if (expected_request_urls.empty())
+          waiter.Quit();
+        return false;
+      }));
+
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetFrameTree()
+                            ->root();
+  NavigateFrameToURL(root->child_at(0), test_url);
+  waiter.Run();
+}
+
 }  // namespace content
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 65307db1b..969374a 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -189,6 +189,9 @@
   if (base::FeatureList::IsEnabled(features::kWebXrHitTest))
     WebRuntimeFeatures::EnableWebXRHitTest(true);
 
+  if (base::FeatureList::IsEnabled(features::kWebXrPlaneDetection))
+    WebRuntimeFeatures::EnableWebXRPlaneDetection(true);
+
   if (command_line.HasSwitch(switches::kDisablePresentationAPI))
     WebRuntimeFeatures::EnablePresentationAPI(false);
 
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index c095ee5..4a1fdcc5 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -308,7 +308,7 @@
                                   base::FEATURE_ENABLED_BY_DEFAULT};
 
 // History navigation in response to horizontal overscroll (aka gesture-nav).
-const base::Feature kOverscrollHistoryNavigation{
+const base::Feature kOverscrollHistoryNavigation {
   "OverscrollHistoryNavigation",
 #if defined(OS_ANDROID)
       base::FEATURE_DISABLED_BY_DEFAULT
@@ -677,6 +677,10 @@
 const base::Feature kWebXrHitTest{"WebXRHitTest",
                                   base::FEATURE_DISABLED_BY_DEFAULT};
 
+// Enables access to planes detected in the user's environment.
+const base::Feature kWebXrPlaneDetection{"WebXRPlaneDetection",
+                                         base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Wipe corrupt v2 IndexedDB databases.
 const base::Feature kWipeCorruptV2IDBDatabases{
     "WipeCorruptV2IDBDatabases", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 4601383..7a9d778 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -146,6 +146,7 @@
 CONTENT_EXPORT extern const base::Feature kWebUsb;
 CONTENT_EXPORT extern const base::Feature kWebXr;
 CONTENT_EXPORT extern const base::Feature kWebXrHitTest;
+CONTENT_EXPORT extern const base::Feature kWebXrPlaneDetection;
 CONTENT_EXPORT extern const base::Feature kWipeCorruptV2IDBDatabases;
 CONTENT_EXPORT extern const base::Feature kScriptStreamingOnPreload;
 
diff --git a/content/public/test/test_browser_thread_bundle_unittest.cc b/content/public/test/test_browser_thread_bundle_unittest.cc
index 5310d9df..f796325d 100644
--- a/content/public/test/test_browser_thread_bundle_unittest.cc
+++ b/content/public/test/test_browser_thread_bundle_unittest.cc
@@ -135,7 +135,7 @@
 TEST(TestBrowserThreadBundleTest, TraitsConstructor) {
   TestBrowserThreadBundle test_browser_thread_bundle(
       TestBrowserThreadBundle::Options::REAL_IO_THREAD,
-      base::test::ScopedTaskEnvironment::ExecutionMode::QUEUED);
+      base::test::ScopedTaskEnvironment::ThreadPoolExecutionMode::QUEUED);
   // Should set up a UI main thread.
   EXPECT_TRUE(base::MessageLoopCurrentForUI::IsSet());
   EXPECT_FALSE(base::MessageLoopCurrentForIO::IsSet());
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn
index a6dd692..11d61c3 100644
--- a/content/renderer/BUILD.gn
+++ b/content/renderer/BUILD.gn
@@ -196,6 +196,8 @@
     "manifest/manifest_manager.h",
     "manifest/manifest_uma_util.cc",
     "manifest/manifest_uma_util.h",
+    "media/android/flinging_renderer_client.cc",
+    "media/android/flinging_renderer_client.h",
     "media/android/flinging_renderer_client_factory.cc",
     "media/android/flinging_renderer_client_factory.h",
     "media/android/media_player_renderer_client.cc",
diff --git a/content/renderer/media/android/flinging_renderer_client.cc b/content/renderer/media/android/flinging_renderer_client.cc
new file mode 100644
index 0000000..d2a017a0
--- /dev/null
+++ b/content/renderer/media/android/flinging_renderer_client.cc
@@ -0,0 +1,46 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/renderer/media/android/flinging_renderer_client.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/callback_helpers.h"
+
+namespace content {
+
+FlingingRendererClient::FlingingRendererClient(
+    ClientExtentionRequest client_extension_request,
+    scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+    std::unique_ptr<media::MojoRenderer> mojo_renderer)
+    : MojoRendererWrapper(std::move(mojo_renderer)),
+      media_task_runner_(std::move(media_task_runner)),
+      delayed_bind_client_extension_request_(
+          std::move(client_extension_request)),
+      client_extension_binding_(this) {}
+
+FlingingRendererClient::~FlingingRendererClient() = default;
+
+void FlingingRendererClient::Initialize(
+    media::MediaResource* media_resource,
+    media::RendererClient* client,
+    const media::PipelineStatusCB& init_cb) {
+  DCHECK(media_task_runner_->BelongsToCurrentThread());
+
+  client_ = client;
+
+  client_extension_binding_.Bind(
+      std::move(delayed_bind_client_extension_request_), media_task_runner_);
+
+  MojoRendererWrapper::Initialize(media_resource, client, init_cb);
+}
+
+void FlingingRendererClient::OnRemotePlayStateChange(
+    media::MediaStatus::State state) {
+  DCHECK(media_task_runner_->BelongsToCurrentThread());
+  client_->OnRemotePlayStateChange(state);
+}
+
+}  // namespace content
diff --git a/content/renderer/media/android/flinging_renderer_client.h b/content/renderer/media/android/flinging_renderer_client.h
new file mode 100644
index 0000000..fc63f2bc
--- /dev/null
+++ b/content/renderer/media/android/flinging_renderer_client.h
@@ -0,0 +1,66 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_RENDERER_MEDIA_ANDROID_FLINGING_RENDERER_CLIENT_H_
+#define CONTENT_RENDERER_MEDIA_ANDROID_FLINGING_RENDERER_CLIENT_H_
+
+#include <memory>
+
+#include "base/callback.h"
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/single_thread_task_runner.h"
+#include "content/common/content_export.h"
+#include "media/base/media_resource.h"
+#include "media/base/renderer.h"
+#include "media/base/renderer_client.h"
+#include "media/base/video_renderer_sink.h"
+#include "media/mojo/clients/mojo_renderer.h"
+#include "media/mojo/clients/mojo_renderer_wrapper.h"
+#include "media/mojo/interfaces/renderer_extensions.mojom.h"
+#include "mojo/public/cpp/bindings/binding.h"
+
+namespace content {
+
+// FlingingRendererClient lives in Renderer process and mirrors a
+// FlingingRenderer living in the Browser process.
+class CONTENT_EXPORT FlingingRendererClient
+    : public media::mojom::FlingingRendererClientExtension,
+      public media::MojoRendererWrapper {
+ public:
+  using ClientExtentionRequest =
+      media::mojom::FlingingRendererClientExtensionRequest;
+
+  FlingingRendererClient(
+      ClientExtentionRequest client_extension_request,
+      scoped_refptr<base::SingleThreadTaskRunner> media_task_runner,
+      std::unique_ptr<media::MojoRenderer> mojo_renderer);
+
+  ~FlingingRendererClient() override;
+
+  // media::MojoRendererWrapper overrides.
+  void Initialize(media::MediaResource* media_resource,
+                  media::RendererClient* client,
+                  const media::PipelineStatusCB& init_cb) override;
+
+  // media::mojom::FlingingRendererClientExtension implementation
+  void OnRemotePlayStateChange(media::MediaStatus::State state) override;
+
+ private:
+  scoped_refptr<base::SingleThreadTaskRunner> media_task_runner_;
+
+  media::RendererClient* client_;
+
+  // Used temporarily, to delay binding to |client_extension_binding_| until we
+  // are on the right sequence, when Initialize() is called.
+  ClientExtentionRequest delayed_bind_client_extension_request_;
+
+  mojo::Binding<FlingingRendererClientExtension> client_extension_binding_;
+
+  DISALLOW_COPY_AND_ASSIGN(FlingingRendererClient);
+};
+
+}  // namespace content
+
+#endif  // CONTENT_RENDERER_MEDIA_ANDROID_FLINGING_RENDERER_CLIENT_H_
diff --git a/content/renderer/media/android/flinging_renderer_client_factory.cc b/content/renderer/media/android/flinging_renderer_client_factory.cc
index bfe3a29..97b9a30 100644
--- a/content/renderer/media/android/flinging_renderer_client_factory.cc
+++ b/content/renderer/media/android/flinging_renderer_client_factory.cc
@@ -9,8 +9,10 @@
 #include <utility>
 
 #include "base/logging.h"
+#include "content/renderer/media/android/flinging_renderer_client.h"
 #include "media/mojo/clients/mojo_renderer.h"
 #include "media/mojo/clients/mojo_renderer_factory.h"
+#include "media/mojo/interfaces/renderer_extensions.mojom.h"
 
 namespace content {
 
@@ -31,8 +33,19 @@
     const gfx::ColorSpace& /* target_color_space */) {
   DCHECK(IsFlingingActive());
 
-  return mojo_flinging_factory_->CreateFlingingRenderer(
-      GetActivePresentationId(), media_task_runner, video_renderer_sink);
+  // Used to send messages from the FlingingRenderer (Browser process),
+  // to the FlingingRendererClient (Renderer process). The
+  // |client_extension_request| will be bound in FlingingRendererClient.
+  media::mojom::FlingingRendererClientExtensionPtr client_extension_ptr;
+  auto client_extension_request = mojo::MakeRequest(&client_extension_ptr);
+
+  auto mojo_renderer = mojo_flinging_factory_->CreateFlingingRenderer(
+      GetActivePresentationId(), std::move(client_extension_ptr),
+      media_task_runner, video_renderer_sink);
+
+  return std::make_unique<FlingingRendererClient>(
+      std::move(client_extension_request), media_task_runner,
+      std::move(mojo_renderer));
 }
 
 std::string FlingingRendererClientFactory::GetActivePresentationId() {
diff --git a/content/renderer/media/android/flinging_renderer_client_factory.h b/content/renderer/media/android/flinging_renderer_client_factory.h
index 7a8114e..91263172 100644
--- a/content/renderer/media/android/flinging_renderer_client_factory.h
+++ b/content/renderer/media/android/flinging_renderer_client_factory.h
@@ -20,15 +20,10 @@
 
 // Creates a renderer for media flinging.
 // The FRCF uses a MojoRendererFactory to create a FlingingRenderer in the
-// browser process. The actual renderer returned by the FRCF is a MojoRenderer
-// directly (as opposed to a dedicated FlingingRendererClient), because all the
-// renderer needs to do is forward calls to the FlingingRenderer in the browser.
+// browser process.
 class CONTENT_EXPORT FlingingRendererClientFactory
     : public media::RendererFactory {
  public:
-  // |mojo_flinging_factory| should be created using
-  // HostedRendererType::kFlinging, and GetActivePresentationId()
-  // should be given to it through SetGetTypeSpecificIdCB().
   FlingingRendererClientFactory(
       std::unique_ptr<media::MojoRendererFactory> mojo_renderer_factory,
       std::unique_ptr<media::RemotePlaybackClientWrapper>
diff --git a/content/renderer/media/audio/audio_renderer_sink_cache_unittest.cc b/content/renderer/media/audio/audio_renderer_sink_cache_unittest.cc
index b8390d3b..8075706 100644
--- a/content/renderer/media/audio/audio_renderer_sink_cache_unittest.cc
+++ b/content/renderer/media/audio/audio_renderer_sink_cache_unittest.cc
@@ -33,8 +33,9 @@
 class AudioRendererSinkCacheTest : public testing::Test {
  public:
   AudioRendererSinkCacheTest()
-      : task_env_(base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME,
-                  base::test::ScopedTaskEnvironment::ExecutionMode::QUEUED),
+      : task_env_(
+            base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME,
+            base::test::ScopedTaskEnvironment::ThreadPoolExecutionMode::QUEUED),
         cache_(std::make_unique<AudioRendererSinkCacheImpl>(
             task_env_.GetMainThreadTaskRunner(),
             base::BindRepeating(&AudioRendererSinkCacheTest::CreateSink,
diff --git a/content/renderer/media/media_interface_factory.cc b/content/renderer/media/media_interface_factory.cc
index d3ea640..50b4c96 100644
--- a/content/renderer/media/media_interface_factory.cc
+++ b/content/renderer/media/media_interface_factory.cc
@@ -110,18 +110,20 @@
 
 void MediaInterfaceFactory::CreateFlingingRenderer(
     const std::string& presentation_id,
+    media::mojom::FlingingRendererClientExtensionPtr client_extension,
     media::mojom::RendererRequest request) {
   if (!task_runner_->BelongsToCurrentThread()) {
     task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(&MediaInterfaceFactory::CreateFlingingRenderer,
-                       weak_this_, presentation_id, std::move(request)));
+                       weak_this_, presentation_id, std::move(client_extension),
+                       std::move(request)));
     return;
   }
 
   DVLOG(1) << __func__;
-  GetMediaInterfaceFactory()->CreateFlingingRenderer(presentation_id,
-                                                     std::move(request));
+  GetMediaInterfaceFactory()->CreateFlingingRenderer(
+      presentation_id, std::move(client_extension), std::move(request));
 }
 #endif  // defined(OS_ANDROID)
 
diff --git a/content/renderer/media/media_interface_factory.h b/content/renderer/media/media_interface_factory.h
index 59cb288..b22aad68 100644
--- a/content/renderer/media/media_interface_factory.h
+++ b/content/renderer/media/media_interface_factory.h
@@ -42,8 +42,10 @@
                           media::mojom::RendererRequest request) final;
 #endif
 #if defined(OS_ANDROID)
-  void CreateFlingingRenderer(const std::string& presentation_id,
-                              media::mojom::RendererRequest request) final;
+  void CreateFlingingRenderer(
+      const std::string& presentation_id,
+      media::mojom::FlingingRendererClientExtensionPtr client_extension,
+      media::mojom::RendererRequest request) final;
   void CreateMediaPlayerRenderer(
       media::mojom::MediaPlayerRendererClientExtensionPtr client_extension_ptr,
       media::mojom::RendererRequest request,
diff --git a/content/renderer/media/stream/media_stream_renderer_factory_impl.cc b/content/renderer/media/stream/media_stream_renderer_factory_impl.cc
index a6f5708..befbb2f 100644
--- a/content/renderer/media/stream/media_stream_renderer_factory_impl.cc
+++ b/content/renderer/media/stream/media_stream_renderer_factory_impl.cc
@@ -53,7 +53,6 @@
 scoped_refptr<blink::WebMediaStreamVideoRenderer>
 MediaStreamRendererFactoryImpl::GetVideoRenderer(
     const blink::WebMediaStream& web_stream,
-    const base::Closure& error_cb,
     const blink::WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner) {
@@ -69,7 +68,7 @@
     return nullptr;
   }
 
-  return new MediaStreamVideoRendererSink(video_tracks[0], error_cb, repaint_cb,
+  return new MediaStreamVideoRendererSink(video_tracks[0], repaint_cb,
                                           std::move(io_task_runner),
                                           std::move(main_render_task_runner));
 }
diff --git a/content/renderer/media/stream/media_stream_renderer_factory_impl.h b/content/renderer/media/stream/media_stream_renderer_factory_impl.h
index f4da468..b859759f 100644
--- a/content/renderer/media/stream/media_stream_renderer_factory_impl.h
+++ b/content/renderer/media/stream/media_stream_renderer_factory_impl.h
@@ -20,7 +20,6 @@
 
   scoped_refptr<blink::WebMediaStreamVideoRenderer> GetVideoRenderer(
       const blink::WebMediaStream& web_stream,
-      const base::Closure& error_cb,
       const blink::WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
       scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner)
diff --git a/content/renderer/media/stream/media_stream_video_renderer_sink.cc b/content/renderer/media/stream/media_stream_video_renderer_sink.cc
index 548793b..729d8954 100644
--- a/content/renderer/media/stream/media_stream_video_renderer_sink.cc
+++ b/content/renderer/media/stream/media_stream_video_renderer_sink.cc
@@ -136,12 +136,10 @@
 
 MediaStreamVideoRendererSink::MediaStreamVideoRendererSink(
     const blink::WebMediaStreamTrack& video_track,
-    const base::Closure& error_cb,
     const RepaintCB& repaint_cb,
     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner)
-    : error_cb_(error_cb),
-      repaint_cb_(repaint_cb),
+    : repaint_cb_(repaint_cb),
       video_track_(video_track),
       io_task_runner_(std::move(io_task_runner)),
       main_render_task_runner_(std::move(main_render_task_runner)),
diff --git a/content/renderer/media/stream/media_stream_video_renderer_sink.h b/content/renderer/media/stream/media_stream_video_renderer_sink.h
index 5d5c752e..f417cff 100644
--- a/content/renderer/media/stream/media_stream_video_renderer_sink.h
+++ b/content/renderer/media/stream/media_stream_video_renderer_sink.h
@@ -40,7 +40,6 @@
  public:
   MediaStreamVideoRendererSink(
       const blink::WebMediaStreamTrack& video_track,
-      const base::Closure& error_cb,
       const blink::WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
       scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner);
@@ -70,7 +69,6 @@
   // Helper method used for testing.
   State GetStateForTesting();
 
-  const base::Closure error_cb_;
   const RepaintCB repaint_cb_;
   const blink::WebMediaStreamTrack video_track_;
 
diff --git a/content/renderer/media/stream/media_stream_video_renderer_sink_unittest.cc b/content/renderer/media/stream/media_stream_video_renderer_sink_unittest.cc
index c5805d6..e99f51f 100644
--- a/content/renderer/media/stream/media_stream_video_renderer_sink_unittest.cc
+++ b/content/renderer/media/stream/media_stream_video_renderer_sink_unittest.cc
@@ -53,8 +53,6 @@
 
     media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink(
         blink_track_,
-        base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback,
-                   base::Unretained(this)),
         base::Bind(&MediaStreamVideoRendererSinkTest::RepaintCallback,
                    base::Unretained(this)),
         child_process_->io_task_runner(),
@@ -75,7 +73,6 @@
   }
 
   MOCK_METHOD1(RepaintCallback, void(scoped_refptr<media::VideoFrame>));
-  MOCK_METHOD0(ErrorCallback, void(void));
 
   bool IsInStartedState() const {
     RunIOUntilIdle();
@@ -165,8 +162,6 @@
   MediaStreamVideoRendererSinkTransparencyTest() {
     media_stream_video_renderer_sink_ = new MediaStreamVideoRendererSink(
         blink_track_,
-        base::Bind(&MediaStreamVideoRendererSinkTest::ErrorCallback,
-                   base::Unretained(this)),
         base::Bind(&MediaStreamVideoRendererSinkTransparencyTest::
                        VerifyTransparentFrame,
                    base::Unretained(this)),
diff --git a/content/renderer/media/stream/webmediaplayer_ms.cc b/content/renderer/media/stream/webmediaplayer_ms.cc
index b5008042..79f56e1 100644
--- a/content/renderer/media/stream/webmediaplayer_ms.cc
+++ b/content/renderer/media/stream/webmediaplayer_ms.cc
@@ -150,7 +150,7 @@
         FROM_HERE,
         base::BindOnce(
             &media::GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame,
-            base::Unretained(gpu_memory_buffer_pool_.get()), frame,
+            base::Unretained(gpu_memory_buffer_pool_.get()), std::move(frame),
             media::BindToCurrentLoop(
                 base::BindOnce(&FrameDeliverer::EnqueueFrame,
                                weak_factory_for_pool_.GetWeakPtr()))));
@@ -169,7 +169,7 @@
  private:
   friend class WebMediaPlayerMS;
 
-  void EnqueueFrame(const scoped_refptr<media::VideoFrame>& frame) {
+  void EnqueueFrame(scoped_refptr<media::VideoFrame> frame) {
     DCHECK_CALLED_ON_VALID_THREAD(io_thread_checker_);
 
     {
@@ -187,7 +187,7 @@
       }
     }
 
-    enqueue_frame_cb_.Run(frame);
+    enqueue_frame_cb_.Run(std::move(frame));
   }
 
   void DropCurrentPoolTasks() {
@@ -340,8 +340,6 @@
       media_task_runner_, worker_task_runner_, gpu_factories_));
   video_frame_provider_ = renderer_factory_->GetVideoRenderer(
       web_stream_,
-      media::BindToCurrentLoop(
-          base::Bind(&WebMediaPlayerMS::OnSourceError, AsWeakPtr())),
       frame_deliverer_->GetRepaintCallback(), io_task_runner_,
       main_render_task_runner_);
 
@@ -502,8 +500,6 @@
       SetNetworkState(kNetworkStateLoading);
       video_frame_provider_ = renderer_factory_->GetVideoRenderer(
           web_stream_,
-          media::BindToCurrentLoop(
-              base::Bind(&WebMediaPlayerMS::OnSourceError, AsWeakPtr())),
           frame_deliverer_->GetRepaintCallback(), io_task_runner_,
           main_render_task_runner_);
       DCHECK(video_frame_provider_);
@@ -1139,12 +1135,6 @@
   get_client()->Repaint();
 }
 
-void WebMediaPlayerMS::OnSourceError() {
-  DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  SetNetworkState(WebMediaPlayer::kNetworkStateFormatError);
-  RepaintInternal();
-}
-
 void WebMediaPlayerMS::SetNetworkState(WebMediaPlayer::NetworkState state) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   network_state_ = state;
diff --git a/content/renderer/media/stream/webmediaplayer_ms.h b/content/renderer/media/stream/webmediaplayer_ms.h
index 3bdda35..891deea 100644
--- a/content/renderer/media/stream/webmediaplayer_ms.h
+++ b/content/renderer/media/stream/webmediaplayer_ms.h
@@ -253,9 +253,6 @@
   // Need repaint due to state change.
   void RepaintInternal();
 
-  // The callback for source to report error.
-  void OnSourceError();
-
   // Helpers that set the network/ready state and notifies the client if
   // they've changed.
   void SetNetworkState(blink::WebMediaPlayer::NetworkState state);
diff --git a/content/renderer/media/stream/webmediaplayer_ms_unittest.cc b/content/renderer/media/stream/webmediaplayer_ms_unittest.cc
index 05688f6..6a58bcb7 100644
--- a/content/renderer/media/stream/webmediaplayer_ms_unittest.cc
+++ b/content/renderer/media/stream/webmediaplayer_ms_unittest.cc
@@ -202,13 +202,11 @@
   MockMediaStreamVideoRenderer(
       const scoped_refptr<base::SingleThreadTaskRunner> task_runner,
       ReusableMessageLoopEvent* message_loop_controller,
-      const base::Closure& error_cb,
       const blink::WebMediaStreamVideoRenderer::RepaintCB& repaint_cb)
       : started_(false),
         standard_size_(kStandardWidth, kStandardHeight),
         task_runner_(task_runner),
         message_loop_controller_(message_loop_controller),
-        error_cb_(error_cb),
         repaint_cb_(repaint_cb),
         delay_till_next_generated_frame_(
             base::TimeDelta::FromSecondsD(1.0 / 30.0)) {}
@@ -247,7 +245,6 @@
 
   const scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
   ReusableMessageLoopEvent* const message_loop_controller_;
-  const base::Closure error_cb_;
   const blink::WebMediaStreamVideoRenderer::RepaintCB repaint_cb_;
 
   base::circular_deque<TestFrame> frames_;
@@ -365,10 +362,8 @@
   auto frame = frames_.front();
   frames_.pop_front();
 
-  if (frame.first == FrameType::BROKEN_FRAME) {
-    error_cb_.Run();
+  if (frame.first == FrameType::BROKEN_FRAME)
     return;
-  }
 
   // For pause case, the provider will still let the stream continue, but
   // not send the frames to the player. As is the same case in reality.
@@ -435,7 +430,6 @@
 
   scoped_refptr<blink::WebMediaStreamVideoRenderer> GetVideoRenderer(
       const blink::WebMediaStream& web_stream,
-      const base::Closure& error_cb,
       const blink::WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
       scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner)
@@ -475,15 +469,14 @@
 scoped_refptr<blink::WebMediaStreamVideoRenderer>
 MockRenderFactory::GetVideoRenderer(
     const blink::WebMediaStream& web_stream,
-    const base::Closure& error_cb,
     const blink::WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner) {
   if (!support_video_renderer_)
     return nullptr;
 
-  provider_ = new MockMediaStreamVideoRenderer(task_runner_,
-      message_loop_controller_, error_cb, repaint_cb);
+  provider_ = new MockMediaStreamVideoRenderer(
+      task_runner_, message_loop_controller_, repaint_cb);
 
   return provider_;
 }
@@ -899,45 +892,6 @@
     EXPECT_CALL(*this, DoStopRendering());
 }
 
-TEST_P(WebMediaPlayerMSTest, Playing_ErrorFrame) {
-  // This tests sends a broken frame to WebMediaPlayerMS, and verifies
-  // OnSourceError function works as expected.
-
-  InitializeWebMediaPlayerMS();
-
-  MockMediaStreamVideoRenderer* provider = LoadAndGetFrameProvider(false);
-
-  const int kBrokenFrame = static_cast<int>(FrameType::BROKEN_FRAME);
-  int tokens[] = {0,   33,  66,  100, 133, 166, 200, 233, 266, 300,
-                  333, 366, 400, 433, 466, 500, 533, 566, 600, kBrokenFrame};
-  std::vector<int> timestamps(tokens, tokens + sizeof(tokens) / sizeof(int));
-  provider->QueueFrames(timestamps);
-
-  if (enable_surface_layer_for_video_) {
-    EXPECT_CALL(*submitter_ptr_, StartRendering());
-  } else {
-    EXPECT_CALL(*this, DoSetCcLayer(true));
-    EXPECT_CALL(*this, DoStartRendering());
-  }
-  EXPECT_CALL(*this, DoReadyStateChanged(
-                         blink::WebMediaPlayer::kReadyStateHaveMetadata));
-  EXPECT_CALL(*this, DoReadyStateChanged(
-                         blink::WebMediaPlayer::kReadyStateHaveEnoughData));
-  EXPECT_CALL(*this, DoNetworkStateChanged(
-                         blink::WebMediaPlayer::kNetworkStateFormatError));
-  EXPECT_CALL(*this,
-              CheckSizeChanged(gfx::Size(kStandardWidth, kStandardHeight)));
-  message_loop_controller_.RunAndWaitForStatus(
-      media::PipelineStatus::PIPELINE_ERROR_NETWORK);
-  testing::Mock::VerifyAndClearExpectations(this);
-
-  EXPECT_CALL(*this, DoSetCcLayer(false));
-  if (enable_surface_layer_for_video_)
-    EXPECT_CALL(*submitter_ptr_, StopUsingProvider());
-  else
-    EXPECT_CALL(*this, DoStopRendering());
-}
-
 TEST_P(WebMediaPlayerMSTest, PlayThenPause) {
   InitializeWebMediaPlayerMS();
   const bool opaque_frame = testing::get<1>(GetParam());
diff --git a/content/renderer/media/webrtc/rtc_video_decoder_adapter.cc b/content/renderer/media/webrtc/rtc_video_decoder_adapter.cc
index 8898e16..f26a722 100644
--- a/content/renderer/media/webrtc/rtc_video_decoder_adapter.cc
+++ b/content/renderer/media/webrtc/rtc_video_decoder_adapter.cc
@@ -423,19 +423,19 @@
   DecodeOnMediaThread();
 }
 
-void RTCVideoDecoderAdapter::OnOutput(
-    const scoped_refptr<media::VideoFrame>& frame) {
+void RTCVideoDecoderAdapter::OnOutput(scoped_refptr<media::VideoFrame> frame) {
   DVLOG(3) << __func__;
   DCHECK(media_task_runner_->BelongsToCurrentThread());
 
+  const base::TimeDelta timestamp = frame->timestamp();
   webrtc::VideoFrame rtc_frame(
-      new rtc::RefCountedObject<WebRtcVideoFrameAdapter>(frame),
-      frame->timestamp().InMicroseconds(), 0, webrtc::kVideoRotation_0);
+      new rtc::RefCountedObject<WebRtcVideoFrameAdapter>(std::move(frame)),
+      timestamp.InMicroseconds(), 0, webrtc::kVideoRotation_0);
 
   base::AutoLock auto_lock(lock_);
 
-  if (!base::ContainsValue(decode_timestamps_, frame->timestamp())) {
-    DVLOG(2) << "Discarding frame with timestamp " << frame->timestamp();
+  if (!base::ContainsValue(decode_timestamps_, timestamp)) {
+    DVLOG(2) << "Discarding frame with timestamp " << timestamp;
     return;
   }
 
diff --git a/content/renderer/media/webrtc/rtc_video_decoder_adapter.h b/content/renderer/media/webrtc/rtc_video_decoder_adapter.h
index c56b397..67990cf 100644
--- a/content/renderer/media/webrtc/rtc_video_decoder_adapter.h
+++ b/content/renderer/media/webrtc/rtc_video_decoder_adapter.h
@@ -92,7 +92,7 @@
                                const media::VideoDecoder::InitCB& init_cb);
   void DecodeOnMediaThread();
   void OnDecodeDone(media::DecodeStatus status);
-  void OnOutput(const scoped_refptr<media::VideoFrame>& frame);
+  void OnOutput(scoped_refptr<media::VideoFrame> frame);
 
   bool ShouldReinitializeForSettingHDRColorSpace(
       const webrtc::EncodedImage& input_image) const;
diff --git a/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc b/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc
index a304eec..a67b731 100644
--- a/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc
+++ b/content/renderer/media/webrtc/webrtc_video_frame_adapter.cc
@@ -83,8 +83,8 @@
 namespace content {
 
 WebRtcVideoFrameAdapter::WebRtcVideoFrameAdapter(
-    const scoped_refptr<media::VideoFrame>& frame)
-    : frame_(frame) {}
+    scoped_refptr<media::VideoFrame> frame)
+    : frame_(std::move(frame)) {}
 
 WebRtcVideoFrameAdapter::~WebRtcVideoFrameAdapter() {
 }
diff --git a/content/renderer/media/webrtc/webrtc_video_frame_adapter.h b/content/renderer/media/webrtc/webrtc_video_frame_adapter.h
index e20b215c..4264690 100644
--- a/content/renderer/media/webrtc/webrtc_video_frame_adapter.h
+++ b/content/renderer/media/webrtc/webrtc_video_frame_adapter.h
@@ -17,7 +17,7 @@
 // different threads, but that's safe since it's read-only.
 class WebRtcVideoFrameAdapter : public webrtc::VideoFrameBuffer {
  public:
-  WebRtcVideoFrameAdapter(const scoped_refptr<media::VideoFrame>& frame);
+  explicit WebRtcVideoFrameAdapter(scoped_refptr<media::VideoFrame> frame);
 
   scoped_refptr<media::VideoFrame> getMediaVideoFrame() const { return frame_; }
 
diff --git a/content/renderer/pepper/video_decoder_shim.cc b/content/renderer/pepper/video_decoder_shim.cc
index c5c5d8ec..5c75dd4c 100644
--- a/content/renderer/pepper/video_decoder_shim.cc
+++ b/content/renderer/pepper/video_decoder_shim.cc
@@ -653,7 +653,7 @@
   void OnInitDone(bool success);
   void DoDecode();
   void OnDecodeComplete(media::DecodeStatus status);
-  void OnOutputComplete(const scoped_refptr<media::VideoFrame>& frame);
+  void OnOutputComplete(scoped_refptr<media::VideoFrame> frame);
   void OnResetComplete();
 
   // WeakPtr is bound to main_message_loop_. Use only in shim callbacks.
@@ -808,14 +808,14 @@
 }
 
 void VideoDecoderShim::DecoderImpl::OnOutputComplete(
-    const scoped_refptr<media::VideoFrame>& frame) {
+    scoped_refptr<media::VideoFrame> frame) {
   // Software decoders are expected to generated frames only when a Decode()
   // call is pending.
   DCHECK(awaiting_decoder_);
 
   std::unique_ptr<PendingFrame> pending_frame;
   if (!frame->metadata()->IsTrue(media::VideoFrameMetadata::END_OF_STREAM))
-    pending_frame.reset(new PendingFrame(decode_id_, frame));
+    pending_frame.reset(new PendingFrame(decode_id_, std::move(frame)));
   else
     pending_frame.reset(new PendingFrame(decode_id_));
 
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc
index 7b52db6..4893de5 100644
--- a/content/shell/browser/shell_content_browser_client.cc
+++ b/content/shell/browser/shell_content_browser_client.cc
@@ -342,7 +342,7 @@
 bool ShellContentBrowserClient::ShouldTerminateOnServiceQuit(
     const service_manager::Identity& id) {
   if (should_terminate_on_service_quit_callback_)
-    return should_terminate_on_service_quit_callback_.Run(id);
+    return std::move(should_terminate_on_service_quit_callback_).Run(id);
   return false;
 }
 
@@ -454,8 +454,8 @@
     net::SSLCertRequestInfo* cert_request_info,
     net::ClientCertIdentityList client_certs,
     std::unique_ptr<ClientCertificateDelegate> delegate) {
-  if (!select_client_certificate_callback_.is_null())
-    select_client_certificate_callback_.Run();
+  if (select_client_certificate_callback_)
+    std::move(select_client_certificate_callback_).Run();
 }
 
 SpeechRecognitionManagerDelegate*
diff --git a/content/shell/browser/shell_content_browser_client.h b/content/shell/browser/shell_content_browser_client.h
index 223774a..6d58d2dff 100644
--- a/content/shell/browser/shell_content_browser_client.h
+++ b/content/shell/browser/shell_content_browser_client.h
@@ -119,16 +119,15 @@
 
   // Used for content_browsertests.
   void set_select_client_certificate_callback(
-      base::Closure select_client_certificate_callback) {
+      base::OnceClosure select_client_certificate_callback) {
     select_client_certificate_callback_ =
         std::move(select_client_certificate_callback);
   }
   void set_should_terminate_on_service_quit_callback(
-      base::Callback<bool(const service_manager::Identity&)> callback) {
+      base::OnceCallback<bool(const service_manager::Identity&)> callback) {
     should_terminate_on_service_quit_callback_ = std::move(callback);
   }
-  void set_login_request_callback(
-      base::Callback<void()> login_request_callback) {
+  void set_login_request_callback(base::OnceClosure login_request_callback) {
     login_request_callback_ = std::move(login_request_callback);
   }
 
@@ -145,10 +144,10 @@
   std::unique_ptr<ResourceDispatcherHostDelegate>
       resource_dispatcher_host_delegate_;
 
-  base::Closure select_client_certificate_callback_;
-  base::Callback<bool(const service_manager::Identity&)>
+  base::OnceClosure select_client_certificate_callback_;
+  base::OnceCallback<bool(const service_manager::Identity&)>
       should_terminate_on_service_quit_callback_;
-  base::Callback<void()> login_request_callback_;
+  base::OnceClosure login_request_callback_;
 
   std::unique_ptr<
       service_manager::BinderRegistryWithArgs<content::RenderFrameHost*>>
diff --git a/content/shell/browser/shell_javascript_dialog_manager.cc b/content/shell/browser/shell_javascript_dialog_manager.cc
index eabcda1..148cb9be 100644
--- a/content/shell/browser/shell_javascript_dialog_manager.cc
+++ b/content/shell/browser/shell_javascript_dialog_manager.cc
@@ -30,10 +30,9 @@
     const base::string16& default_prompt_text,
     DialogClosedCallback callback,
     bool* did_suppress_message) {
-  if (!dialog_request_callback_.is_null()) {
-    dialog_request_callback_.Run();
+  if (dialog_request_callback_) {
+    std::move(dialog_request_callback_).Run();
     std::move(callback).Run(true, base::string16());
-    dialog_request_callback_.Reset();
     return;
   }
 
@@ -68,14 +67,13 @@
     DialogClosedCallback callback) {
   // During tests, if the BeforeUnload should not proceed automatically, store
   // the callback and return.
-  if (!dialog_request_callback_.is_null()) {
-    dialog_request_callback_.Run();
+  if (dialog_request_callback_) {
+    std::move(dialog_request_callback_).Run();
 
     if (should_proceed_on_beforeunload_)
       std::move(callback).Run(beforeunload_success_, base::string16());
     else
       before_unload_callback_ = std::move(callback);
-    dialog_request_callback_.Reset();
     return;
   }
 
diff --git a/content/shell/browser/shell_javascript_dialog_manager.h b/content/shell/browser/shell_javascript_dialog_manager.h
index 6740cff3..116b9d7 100644
--- a/content/shell/browser/shell_javascript_dialog_manager.h
+++ b/content/shell/browser/shell_javascript_dialog_manager.h
@@ -43,8 +43,8 @@
   void DialogClosed(ShellJavaScriptDialog* dialog);
 
   // Used for content_browsertests.
-  void set_dialog_request_callback(const base::Closure& callback) {
-    dialog_request_callback_ = callback;
+  void set_dialog_request_callback(base::OnceClosure callback) {
+    dialog_request_callback_ = std::move(callback);
   }
   void set_should_proceed_on_beforeunload(bool proceed, bool success) {
     should_proceed_on_beforeunload_ = proceed;
@@ -59,7 +59,7 @@
   // TODO: implement ShellJavaScriptDialog for other platforms, drop this #if
 #endif
 
-  base::Closure dialog_request_callback_;
+  base::OnceClosure dialog_request_callback_;
 
   // Whether to automatically proceed when asked to display a BeforeUnload
   // dialog, and the return value that should be passed (success or failure).
diff --git a/content/shell/browser/web_test/web_test_background_fetch_delegate.cc b/content/shell/browser/web_test/web_test_background_fetch_delegate.cc
index f994de3..e8dfdb8 100644
--- a/content/shell/browser/web_test/web_test_background_fetch_delegate.cc
+++ b/content/shell/browser/web_test/web_test_background_fetch_delegate.cc
@@ -60,13 +60,13 @@
 
   void OnServiceUnavailable() override {}
 
-  download::Client::ShouldDownload OnDownloadStarted(
+  void OnDownloadStarted(
       const std::string& guid,
       const std::vector<GURL>& url_chain,
       const scoped_refptr<const net::HttpResponseHeaders>& headers) override {
     DCHECK(guid_to_unique_job_id_mapping_.count(guid));
     if (!client_)
-      return download::Client::ShouldDownload::ABORT;
+      return;
 
     guid_to_response_[guid] =
         std::make_unique<content::BackgroundFetchResponse>(url_chain,
@@ -77,8 +77,6 @@
         std::make_unique<content::BackgroundFetchResponse>(
             guid_to_response_[guid]->url_chain,
             guid_to_response_[guid]->headers));
-
-    return download::Client::ShouldDownload::CONTINUE;
   }
 
   void OnDownloadUpdated(const std::string& guid,
diff --git a/content/shell/browser/web_test/web_test_permission_manager.cc b/content/shell/browser/web_test/web_test_permission_manager.cc
index 6ce767c..919475e 100644
--- a/content/shell/browser/web_test/web_test_permission_manager.cc
+++ b/content/shell/browser/web_test/web_test_permission_manager.cc
@@ -217,7 +217,7 @@
 void WebTestPermissionManager::OnPermissionChanged(
     const PermissionDescription& permission,
     blink::mojom::PermissionStatus status) {
-  std::list<base::Closure> callbacks;
+  std::list<base::OnceClosure> callbacks;
 
   for (SubscriptionsMap::iterator iter(&subscriptions_); !iter.IsAtEnd();
        iter.Advance()) {
@@ -232,11 +232,11 @@
 
     // Add the callback to |callbacks| which will be run after the loop to
     // prevent re-entrance issues.
-    callbacks.push_back(base::Bind(subscription->callback, status));
+    callbacks.push_back(base::BindOnce(subscription->callback, status));
   }
 
-  for (const auto& callback : callbacks)
-    callback.Run();
+  for (auto& callback : callbacks)
+    std::move(callback).Run();
 }
 
 }  // namespace content
diff --git a/content/shell/renderer/web_test/test_media_stream_renderer_factory.cc b/content/shell/renderer/web_test/test_media_stream_renderer_factory.cc
index 990e335..81fe744 100644
--- a/content/shell/renderer/web_test/test_media_stream_renderer_factory.cc
+++ b/content/shell/renderer/web_test/test_media_stream_renderer_factory.cc
@@ -37,7 +37,6 @@
 scoped_refptr<blink::WebMediaStreamVideoRenderer>
 TestMediaStreamRendererFactory::GetVideoRenderer(
     const blink::WebMediaStream& web_stream,
-    const base::Closure& error_cb,
     const blink::WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
     scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
     scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner) {
@@ -47,7 +46,7 @@
   return new TestMediaStreamVideoRenderer(
       std::move(io_task_runner),
       gfx::Size(kVideoCaptureWidth, kVideoCaptureHeight),
-      base::TimeDelta::FromMilliseconds(kVideoCaptureFrameDurationMs), error_cb,
+      base::TimeDelta::FromMilliseconds(kVideoCaptureFrameDurationMs),
       repaint_cb);
 }
 
diff --git a/content/shell/renderer/web_test/test_media_stream_renderer_factory.h b/content/shell/renderer/web_test/test_media_stream_renderer_factory.h
index 79e78b4..45e6446 100644
--- a/content/shell/renderer/web_test/test_media_stream_renderer_factory.h
+++ b/content/shell/renderer/web_test/test_media_stream_renderer_factory.h
@@ -23,7 +23,6 @@
   // MediaStreamRendererFactory implementation.
   scoped_refptr<blink::WebMediaStreamVideoRenderer> GetVideoRenderer(
       const blink::WebMediaStream& web_stream,
-      const base::Closure& error_cb,
       const blink::WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
       scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner)
diff --git a/content/shell/renderer/web_test/test_media_stream_video_renderer.cc b/content/shell/renderer/web_test/test_media_stream_video_renderer.cc
index 1d9bf70..e38448e2 100644
--- a/content/shell/renderer/web_test/test_media_stream_video_renderer.cc
+++ b/content/shell/renderer/web_test/test_media_stream_video_renderer.cc
@@ -17,14 +17,12 @@
     const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner,
     const gfx::Size& size,
     const base::TimeDelta& frame_duration,
-    const base::Closure& error_cb,
     const blink::WebMediaStreamVideoRenderer::RepaintCB& repaint_cb)
     : task_runner_(blink::scheduler::GetSingleThreadTaskRunnerForTesting()),
       io_task_runner_(io_task_runner),
       size_(size),
       state_(kStopped),
       frame_duration_(frame_duration),
-      error_cb_(error_cb),
       repaint_cb_(repaint_cb) {}
 
 TestMediaStreamVideoRenderer::~TestMediaStreamVideoRenderer() {}
diff --git a/content/shell/renderer/web_test/test_media_stream_video_renderer.h b/content/shell/renderer/web_test/test_media_stream_video_renderer.h
index 15c4f8ad..500c40f9 100644
--- a/content/shell/renderer/web_test/test_media_stream_video_renderer.h
+++ b/content/shell/renderer/web_test/test_media_stream_video_renderer.h
@@ -27,7 +27,6 @@
       const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner,
       const gfx::Size& size,
       const base::TimeDelta& frame_duration,
-      const base::Closure& error_cb,
       const RepaintCB& repaint_cb);
 
   // blink::WebMediaStreamVideoRenderer implementation.
@@ -55,7 +54,6 @@
 
   base::TimeDelta current_time_;
   base::TimeDelta frame_duration_;
-  base::Closure error_cb_;
   RepaintCB repaint_cb_;
 
   DISALLOW_COPY_AND_ASSIGN(TestMediaStreamVideoRenderer);
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index e3b818a..8553e46c 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1038,6 +1038,7 @@
     "//services/network:test_support",
     "//services/service_manager/public/cpp",
     "//services/test/echo/public/mojom",
+    "//services/tracing:privacy_check",
     "//services/video_capture/public/cpp",
     "//services/video_capture/public/cpp:mocks",
     "//services/video_capture/public/mojom:constants",
diff --git a/content/test/data/workers/empty.html b/content/test/data/workers/empty.html
new file mode 100644
index 0000000..90531a4b
--- /dev/null
+++ b/content/test/data/workers/empty.html
@@ -0,0 +1,2 @@
+<html>
+</html>
diff --git a/content/test/data/workers/empty.js b/content/test/data/workers/empty.js
new file mode 100644
index 0000000..8b1a393
--- /dev/null
+++ b/content/test/data/workers/empty.js
@@ -0,0 +1 @@
+// empty
diff --git a/content/test/data/workers/simple_shared_worker.html b/content/test/data/workers/simple_shared_worker.html
new file mode 100644
index 0000000..18d0f1c
--- /dev/null
+++ b/content/test/data/workers/simple_shared_worker.html
@@ -0,0 +1,7 @@
+<html>
+<body>
+<script>
+var worker = new SharedWorker("worker.js");
+</script>
+</body>
+</html>
diff --git a/content/test/data/workers/worker.js b/content/test/data/workers/worker.js
new file mode 100644
index 0000000..54a6fff
--- /dev/null
+++ b/content/test/data/workers/worker.js
@@ -0,0 +1,2 @@
+importScripts("empty.js");
+fetch("empty.html");
diff --git a/extensions/browser/api/bluetooth/bluetooth_api_utils.cc b/extensions/browser/api/bluetooth/bluetooth_api_utils.cc
index 81851c3..965ccc7 100644
--- a/extensions/browser/api/bluetooth/bluetooth_api_utils.cc
+++ b/extensions/browser/api/bluetooth/bluetooth_api_utils.cc
@@ -7,14 +7,18 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "device/bluetooth/bluetooth_adapter.h"
+#include "device/bluetooth/bluetooth_common.h"
 #include "device/bluetooth/bluetooth_device.h"
 #include "extensions/common/api/bluetooth.h"
 
 namespace bluetooth = extensions::api::bluetooth;
 
+using bluetooth::VendorIdSource;
 using device::BluetoothDevice;
 using device::BluetoothDeviceType;
-using bluetooth::VendorIdSource;
+#if defined(OS_LINUX)
+using device::BluetoothTransport;
+#endif
 
 namespace {
 
@@ -86,6 +90,28 @@
   }
 }
 
+#if defined(OS_LINUX)
+bool ConvertTransportToApi(const BluetoothTransport& input,
+                           bluetooth::Transport* output) {
+  switch (input) {
+    case BluetoothTransport::BLUETOOTH_TRANSPORT_INVALID:
+      *output = bluetooth::TRANSPORT_INVALID;
+      return true;
+    case BluetoothTransport::BLUETOOTH_TRANSPORT_CLASSIC:
+      *output = bluetooth::TRANSPORT_CLASSIC;
+      return true;
+    case BluetoothTransport::BLUETOOTH_TRANSPORT_LE:
+      *output = bluetooth::TRANSPORT_LE;
+      return true;
+    case BluetoothTransport::BLUETOOTH_TRANSPORT_DUAL:
+      *output = bluetooth::TRANSPORT_DUAL;
+      return true;
+    default:
+      return false;
+  }
+}
+#endif
+
 }  // namespace
 
 namespace extensions {
@@ -132,6 +158,10 @@
     out->inquiry_tx_power.reset(new int(device.GetInquiryTxPower().value()));
   else
     out->inquiry_tx_power.reset();
+
+#if defined(OS_LINUX)
+  ConvertTransportToApi(device.GetType(), &(out->transport));
+#endif
 }
 
 void PopulateAdapterState(const device::BluetoothAdapter& adapter,
diff --git a/extensions/common/api/bluetooth.idl b/extensions/common/api/bluetooth.idl
index ca72e77..dfb3316f 100644
--- a/extensions/common/api/bluetooth.idl
+++ b/extensions/common/api/bluetooth.idl
@@ -16,6 +16,9 @@
   // Types for filtering bluetooth devices.
   enum FilterType {all, known};
 
+  // Transport type of the bluetooth device.
+  enum Transport {invalid, classic, le, dual};
+
   // Information about the state of the Bluetooth adapter.
   dictionary AdapterState {
     // The address of the adapter, in the format 'XX:XX:XX:XX:XX:XX'.
@@ -90,6 +93,9 @@
     // that include this field in AD. It is avaliable and valid only during
     // discovery.
     long? inquiryTxPower;
+
+    // The transport type of the bluetooth device.
+    Transport? transport;
   };
 
   dictionary BluetoothFilter {
diff --git a/extensions/strings/extensions_strings_ta.xtb b/extensions/strings/extensions_strings_ta.xtb
index 670e606b4..29befd0 100644
--- a/extensions/strings/extensions_strings_ta.xtb
+++ b/extensions/strings/extensions_strings_ta.xtb
@@ -49,7 +49,7 @@
 <translation id="6391538222494443604">உள்ளீட்டுக் கோப்பகம் இருப்பது அவசியம்.</translation>
 <translation id="641087317769093025">நீட்டிப்பின் ஜிப்பை திறக்க முடியவில்லை</translation>
 <translation id="6413453408918378296">ஐகான் போதுமானளவு தெரியவில்லை '<ph name="ICON" />'.</translation>
-<translation id="6542618148162044354">"<ph name="APP_NAME" />" பயன்பாடு உங்கள் சாதனங்களில் ஒன்று அல்லது அதற்கு மேற்பட்ட சாதனங்களின் அணுகலைக் கோருகிறது:</translation>
+<translation id="6542618148162044354">"<ph name="APP_NAME" />" ஆப்ஸ் உங்கள் சாதனங்களில் ஒன்று அல்லது அதற்கு மேற்பட்ட சாதனங்களின் அணுகலைக் கோருகிறது:</translation>
 <translation id="657064425229075395">'<ph name="BACKGROUND_SCRIPT" />' என்ற பின்புல ஸ்கிரிப்டை ஏற்ற முடியவில்லை.</translation>
 <translation id="6580950983454333167"><ph name="VENDOR_NAME" /> இடமிருந்து <ph name="PRODUCT_NAME" /> (வரிசை எண் <ph name="SERIAL_NUMBER" />)</translation>
 <translation id="6731255991101203740">இதன் ஜிப்பை திறப்பதற்குக் கோப்பகத்தை உருவாக்க முடியவில்லை: '<ph name="DIRECTORY_PATH" />'</translation>
@@ -66,7 +66,7 @@
 <translation id="8284835137979141223"><ph name="VENDOR_NAME" /> இன் <ph name="PRODUCT_NAME" /></translation>
 <translation id="8517576857589387417">மெனிஃபெஸ்ட் ஃபைலைக் காணவில்லை அல்லது படிக்க முடியவில்லை</translation>
 <translation id="8636666366616799973">தொகுப்பு செல்லாதது. விவரங்கள்: '<ph name="ERROR_MESSAGE" />'.</translation>
-<translation id="8761756413268424715">"<ph name="APP_NAME" />" பயன்பாடு உங்கள் சாதனங்களில் ஒன்றின் அணுகலைக் கோருகிறது:</translation>
+<translation id="8761756413268424715">"<ph name="APP_NAME" />" ஆப்ஸ் உங்கள் சாதனங்களில் ஒன்றின் அணுகலைக் கோருகிறது:</translation>
 <translation id="8885905466771744233">குறிப்பிட்ட நீட்டிப்பிற்கான தனிப்பட்ட விசை ஏற்கனவே உள்ளது. அந்த விசையை மீண்டும் பயன்படுத்துக அல்லது அதை முதலில் நீக்குக.</translation>
 <translation id="907841381057066561">தொகுப்பாக்கலின்போது தற்காலிக ஜிப் ஃபைலை உருவாக்குவதில் தோல்வியடைந்தது.</translation>
 <translation id="941543339607623937">செல்லாத தனிப்பட்ட விசை.</translation>
diff --git a/infra/config/cr-buildbucket.cfg b/infra/config/cr-buildbucket.cfg
index ecce9aab..0dc291f5 100644
--- a/infra/config/cr-buildbucket.cfg
+++ b/infra/config/cr-buildbucket.cfg
@@ -522,6 +522,7 @@
   name: "mac-optional-gpu-try"
   mixins: "mac-try"
   mixins: "gpu-optional-try"
+  mixins: "gpu-slow-bot"
 }
 
 builder_mixins {
@@ -595,6 +596,7 @@
   name: "mac-gpu-fyi-ci"
   mixins: "mac"
   mixins: "gpu-fyi-ci"
+  mixins: "gpu-slow-bot"
   dimensions: "cores:4"
 }
 
@@ -1550,17 +1552,14 @@
     builders {
       name: "Mac FYI 10.14 Release (AMD)"
       mixins: "linux-gpu-fyi-ci"
-      mixins: "gpu-slow-bot"
     }
     builders {
       name: "Mac FYI 10.14 Release (Intel)"
       mixins: "linux-gpu-fyi-ci"
-      mixins: "gpu-slow-bot"
     }
     builders {
       name: "Mac FYI 10.14 Release (NVIDIA)"
       mixins: "linux-gpu-fyi-ci"
-      mixins: "gpu-slow-bot"
     }
     builders {
       name: "Mac FYI Release (Intel)"
@@ -1573,7 +1572,6 @@
     builders {
       name: "Mac Pro FYI Release (AMD)"
       mixins: "linux-gpu-fyi-ci"
-      mixins: "gpu-slow-bot"
     }
     builders {
       name: "Mac FYI Retina Release (NVIDIA)"
@@ -1605,13 +1603,12 @@
       # This bot has one machine backing its tests at the moment.
       # If it gets more, this should be switched back to gpu-slow-bot.
       # See crbug.com/853307 for more context.
-      execution_timeout_secs: 43200
+      execution_timeout_secs: 43200  # 12h
     }
     builders {
       name: "Mac FYI GPU ASAN Release"
       # Builder/tester, thus needs Mac (not Linux like testers-only)
       mixins: "mac-gpu-fyi-ci"
-      execution_timeout_secs: 14400  # 4h
     }
     builders {
       name: "Mac FYI dEQP Release AMD"
@@ -3818,6 +3815,82 @@
     builders { mixins: "ios-try" name: "ios-simulator-xcode-clang" }
     builders { mixins: "ios-try" name: "ios-slimnav" }
     builders { mixins: "mac-dawn-try" name: "dawn-mac-x64-deps-rel" }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-amd-10.14"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-amd-dqp"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-amd-pro-rel"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-amd-retina-dbg"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-amd-retina-exp"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-amd-retina-rel"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-asan"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-intel-10.14"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-intel-dbg"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-intel-dqp"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-intel-exp"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-intel-rel"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-nvidia-10.14"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-nvidia-retina-dbg"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-nvidia-retina-exp"
+      # This bot has one machine backing its tests at the moment.
+      # If it gets more, this should be switched back to gpu-slow-bot.
+      # See crbug.com/853307 for more context.
+      execution_timeout_secs: 43200  # 12h
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-fyi-try-mac-nvidia-retina-rel"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-try-mac-amd-retina-dbg"
+    }
+    builders {
+      mixins: "mac-optional-gpu-try"
+      name: "gpu-try-mac-intel-dbg"
+    }
     builders { mixins: "mac-angle-try" name: "mac-angle-rel" }
     builders {
       mixins: "mac-try"
diff --git a/infra/config/luci-milo.cfg b/infra/config/luci-milo.cfg
index 8d92d29..2d06be8 100644
--- a/infra/config/luci-milo.cfg
+++ b/infra/config/luci-milo.cfg
@@ -4051,6 +4051,60 @@
   refs: "refs/heads/master"
   manifest_name: "REVISION"
   builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-10.14"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-dqp"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-pro-rel"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-retina-dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-retina-exp"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-retina-rel"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-asan"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-intel-10.14"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-intel-dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-intel-dqp"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-intel-exp"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-intel-rel"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-nvidia-10.14"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-nvidia-retina-dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-nvidia-retina-exp"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-nvidia-retina-rel"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-try-mac-amd-retina-dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-try-mac-intel-dbg"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/ios-device"
   }
   builders {
@@ -4555,6 +4609,60 @@
     name: "buildbucket/luci.chromium.try/gpu-manual-try-win10-nvidia-rel"
   }
   builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-10.14"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-dqp"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-pro-rel"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-retina-dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-retina-exp"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-amd-retina-rel"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-asan"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-intel-10.14"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-intel-dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-intel-dqp"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-intel-exp"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-intel-rel"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-nvidia-10.14"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-nvidia-retina-dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-nvidia-retina-exp"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-fyi-try-mac-nvidia-retina-rel"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-try-mac-amd-retina-dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.try/gpu-try-mac-intel-dbg"
+  }
+  builders {
     name: "buildbucket/luci.chromium.try/linux-angle-rel"
   }
   builders {
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
index 5084fd12..9df0907 100644
--- a/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_chromium_strings_ta.xtb
@@ -16,7 +16,7 @@
 <translation id="2195025571279539885">அடுத்த முறை இந்தத் தளத்தின் <ph name="LANGUAGE_NAME" /> பக்கங்களை மொழிபெயர்க்கவா என்று Chromium கேட்க வேண்டுமென விரும்புகிறீர்களா?</translation>
 <translation id="2517624234762908348">Chromium தரவை ஒத்திசைக்கவும்</translation>
 <translation id="2647554856022461007">உங்கள் உலாவல் அனுபவத்தை மேம்படுத்த, Chromium ஆனது இணையச் சேவைகளைப் பயன்படுத்தலாம். நீங்கள் விரும்பினால் இந்தச் சேவைகளை முடக்கிக்கொள்ளலாம். <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation>
-<translation id="2730884209570016437">கேமராவை மற்றொரு பயன்பாடு உபயோகிப்பதால், Chromium அதைப் பயன்படுத்த முடியாது</translation>
+<translation id="2730884209570016437">கேமராவை மற்றொரு ஆப்ஸ் உபயோகிப்பதால், Chromium அதைப் பயன்படுத்த முடியாது</translation>
 <translation id="2915596697727466327">உங்கள் கடவுச்சொற்களை அணுக அங்கீகரிக்கப்பட்டவர்களை மட்டும் அனுமதிப்பதற்காக Face IDயை Chromium பயன்படுத்துகிறது.</translation>
 <translation id="3256316712990552818">Chromium இல் நகலெடுக்கப்பட்டது</translation>
 <translation id="3413120535237193088">உங்கள் எல்லாச் சாதனங்களிலும் புத்தகக்குறிகளைப் பெற, Chromium இல் உள்நுழையவும்.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
index 2e9b54d..b0964a6 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_es.xtb
@@ -32,6 +32,7 @@
 <translation id="5389212809648216794">Google Chrome no puede utilizar la cámara porque la está usando otra aplicación</translation>
 <translation id="5639704535586432836">Abre Ajustes &gt; Privacidad &gt; Cámara &gt; Google Chrome y activa la cámara.</translation>
 <translation id="5642200033778930880">Google Chrome no puede usar la cámara en el modo Vista dividida</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5854621639439811139">Consejo sobre Chrome. Algunos botones ahora se encuentran en la parte inferior de la pantalla, como Atrás, Adelante y Buscar.</translation>
 <translation id="6036420186814142909">Google Chrome  incluye funciones que te permiten administrar tus datos de Internet y la rapidez con la que puedes cargar páginas web.
 <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
@@ -49,6 +50,7 @@
 <translation id="7437998757836447326">Cerrar sesión en Chrome</translation>
 <translation id="756809126120519699">Datos de Chrome borrados</translation>
 <translation id="7626032353295482388">Te damos la bienvenida a Chrome</translation>
+<translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Todos los derechos reservados.</translation>
 <translation id="840168496893712993">Algunos complementos hacen que Chrome falle. Prueba a desinstalarlos.</translation>
 <translation id="8459495907675268833">Los datos seleccionados se han eliminado de Chrome y de los dispositivos sincronizados. Es posible que tu cuenta de Google tenga otras formas del historial de navegación, como las búsquedas o la actividad de otros servicios de Google en la página history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
index b6a94c1d..3c30010 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_fil.xtb
@@ -32,6 +32,7 @@
 <translation id="5389212809648216794">Hindi magamit ng Google Chrome ang iyong camera ngayon dahil ginagamit ito sa isa pang application</translation>
 <translation id="5639704535586432836">Buksan ang Settings &gt; Privacy &gt; Camera &gt; Google Chrome at i-on ang camera.</translation>
 <translation id="5642200033778930880">Hindi magamit ng Google Chrome ang iyong camera sa Split View mode</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5854621639439811139">Tip sa Chrome. Nasa ibaba na ng iyong screen ang ilang button, tulad ng Bumalik, Susunod, at Maghanap.</translation>
 <translation id="6036420186814142909">Ang Google Chrome ay may mga feature na nakakatulong sa iyong pamahalaan ang iyong data sa internet at kung gaano ka kabilis nakakapag-load ng mga webpage.
 <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation>
@@ -49,6 +50,7 @@
 <translation id="7437998757836447326">Mag-sign out sa Chrome</translation>
 <translation id="756809126120519699">Na-clear ang data ng Chrome</translation>
 <translation id="7626032353295482388">Welcome sa Chrome</translation>
+<translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Nakalaan ang lahat ng karapatan.</translation>
 <translation id="840168496893712993">Nagiging dahilan ang ilang add-on ng pag-crash ng Chrome. Pakisubukang i-uninstall ang mga ito.</translation>
 <translation id="8459495907675268833">Inalis ang piniling data mula sa Chrome at mga naka-sync na device. Maaaring mayroong ibang mga uri ng history ng pag-browse ang iyong Google Account gaya ng mga paghahanap at aktibidad mula sa iba pang mga serbisyo ng Google sa history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
index 4878b85..db8fe7b 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ml.xtb
@@ -32,6 +32,7 @@
 <translation id="5389212809648216794">മറ്റൊരു അപ്ലിക്കേഷൻ നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കുന്നതിനാൽ Google Chrome-ന് അത്‌ ഉപയോഗിക്കാനാവില്ല</translation>
 <translation id="5639704535586432836">ക്രമീകരണം &gt; സ്വകാര്യത &gt; ക്യാമറ &gt; Google Chrome തുറന്ന് ക്യാമറ ഓണാക്കുക.</translation>
 <translation id="5642200033778930880">വിഭജിത കാഴ്‌ച മോഡിൽ Google Chrome-ന് നിങ്ങളുടെ ക്യാമറ ഉപയോഗിക്കാനാവില്ല</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5854621639439811139">Chrome നുറുങ്ങ്. മടങ്ങുക, മുമ്പോട്ട് പോകുക, തിരയൽ, എന്നീ ചില ബട്ടണുകൾ ഇപ്പോൾ നിങ്ങളുടെ സ്‌ക്രീനിന്റെ താഴെയാണ്.</translation>
 <translation id="6036420186814142909">നിങ്ങളുടെ ഇന്റർനെറ്റ് ഡാറ്റ നിയന്ത്രിക്കുന്നതിനെയും വെബ്‌പേജുകൾ നിങ്ങൾക്ക് എങ്ങനെ വേഗത്തിൽ ലോഡുചെയ്യാനാകുമെന്നതിനെയും സഹായിക്കുന്ന സവിശേഷതകൾ Google Chrome-നുണ്ട്.
 <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation>
@@ -49,6 +50,7 @@
 <translation id="7437998757836447326">Chrome-ൽ നിന്നും സൈൻ ഔട്ട് ചെയ്യുക</translation>
 <translation id="756809126120519699">Chrome ഡാറ്റ മായ്‌ച്ചു</translation>
 <translation id="7626032353295482388">Chrome-ലേക്ക് സ്വാഗതം</translation>
+<translation id="8370517070665726704">പകർപ്പവകാശം <ph name="YEAR" /> Google LLC. എല്ലാ അവകാശങ്ങളും നിക്ഷിപ്‍തം.</translation>
 <translation id="840168496893712993">ചില ആഡ്-ഓണുകൾ Chrome ക്രാഷാകുന്നതിന് ഇടയാക്കുന്നു. അവ അൺ ഇൻസ്റ്റാൾ ചെയ്യുന്നത് പരീക്ഷിക്കുക.</translation>
 <translation id="8459495907675268833">തിരഞ്ഞെടുത്ത ഡാറ്റയെ Chrome-ൽ നിന്നും സമന്വയിപ്പിച്ച ഉപകരണങ്ങളിൽ നിന്നും നീക്കംചെയ്‌തു. നിങ്ങളുടെ Google അക്കൗണ്ടിന് history.google.com എന്നതിൽ മറ്റ് Google സേവനങ്ങളിൽ നിന്നുള്ള തിരയലുകൾ, പ്രവൃത്തി എന്നിങ്ങനെ മറ്റ് തരത്തിലുള്ള ബ്രൗസിംഗ് ചരിത്രമുണ്ടായിരിക്കാം.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
index 01b421b..4673a95 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_no.xtb
@@ -32,6 +32,7 @@
 <translation id="5389212809648216794">Google Chrome kan ikke bruke kameraet fordi det brukes av en annen app</translation>
 <translation id="5639704535586432836">Åpne Innstillinger &gt; Personvern &gt; Kamera &gt; Google Chrome, og slå på kameraet.</translation>
 <translation id="5642200033778930880">Google Chrome kan ikke bruke kameraet i modus for delt visning</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5854621639439811139">Chrome-tips. Noen knapper, slik som Tilbake, Frem og Søk, er nå nederst på skjermen.</translation>
 <translation id="6036420186814142909">Google Chrome har funksjoner som hjelper deg med å administrere dataforbruket ditt og hastigheten for innlasting av nettsider.
 <ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /></translation>
@@ -49,6 +50,7 @@
 <translation id="7437998757836447326">Logg av Chrome</translation>
 <translation id="756809126120519699">Chrome-dataene er slettet</translation>
 <translation id="7626032353295482388">Velkommen til Chrome</translation>
+<translation id="8370517070665726704">Copyright <ph name="YEAR" /> Google LLC. Med enerett.</translation>
 <translation id="840168496893712993">Noen tillegg fører til at Chrome krasjer. Prøv å avinstallere dem.</translation>
 <translation id="8459495907675268833">De valgte dataene er fjernet fra Chrome og alle synkroniserte enheter. Det kan hende Google-kontoen din har andre typer nettleserlogger, for eksempel for søk og aktivitet fra andre Google-tjenester, på history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
index 54ea105..f6b0f3ba 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ru.xtb
@@ -32,6 +32,7 @@
 <translation id="5389212809648216794">Google Chrome не может получить доступ к камере, поскольку она используется другим приложением.</translation>
 <translation id="5639704535586432836">Откройте "Настройки &gt; Конфиденциальность &gt; Камера &gt; Chrome" и включите камеру.</translation>
 <translation id="5642200033778930880">Google Chrome не может использовать камеру в режиме Split View.</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5854621639439811139">Совет для Chrome. Некоторые кнопки, например "Назад", "Вперед" и "Поиск", теперь расположены в нижней части экрана.</translation>
 <translation id="6036420186814142909">В Google Chrome можно устанавливать параметры обработки данных в Интернете и скорости загрузки веб-страниц.
 <ph name="BEGIN_LINK" />Подробнее...<ph name="END_LINK" /></translation>
@@ -49,6 +50,7 @@
 <translation id="7437998757836447326">Выход из Chrome</translation>
 <translation id="756809126120519699">Данные Chrome удалены</translation>
 <translation id="7626032353295482388">Добро пожаловать в Chrome!</translation>
+<translation id="8370517070665726704">© Google LLC, <ph name="YEAR" />. Все права защищены.</translation>
 <translation id="840168496893712993">Некоторые дополнения вызывают сбой Chrome. Попробуйте удалить их.</translation>
 <translation id="8459495907675268833">Выбранные данные удалены из Chrome и с синхронизированных устройств. Остальная история ваших действий в Интернете может храниться в аккаунте Google, например в виде поисковых запросов и сведений из наших сервисов. Она доступна на странице history.google.com.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb
index d5df5f8..a5f9701 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_ta.xtb
@@ -29,7 +29,7 @@
 <translation id="447252321002412580">Chrome இன் அம்சங்களையும் செயல்திறனையும் மேம்படுத்த உதவுக</translation>
 <translation id="4523886039239821078">சில செருகு நிரல்களினால் Chrome சிதைவுக்குட்படுகிறது. பின்வருபவற்றை நிறுவல் நீக்கம் செய்யவும்:</translation>
 <translation id="4615174829807303908"><ph name="SIGNOUT_MANAGED_DOMAIN" /> நிர்வகிக்கும் கணக்கிலிருந்து வெளியேறுகிறீர்கள். இவ்வாறு செய்வதால், இந்தச் சாதனத்திலிருந்து Chrome தரவு நீக்கப்படும், எனினும் உங்கள் Google கணக்கில் தரவு தொடர்ந்து இருக்கும்.</translation>
-<translation id="5389212809648216794">கேமராவை மற்றொரு பயன்பாடு உபயோகிப்பதால், Google Chrome ஆல் அதைப் பயன்படுத்த முடியாது</translation>
+<translation id="5389212809648216794">கேமராவை மற்றொரு ஆப்ஸ் உபயோகிப்பதால், Google Chrome ஆல் அதைப் பயன்படுத்த முடியாது</translation>
 <translation id="5639704535586432836">அமைப்புகள் &gt; தனியுரிமை &gt; கேமரா &gt; Google Chrome என்பதைத் திறந்து, கேமராவை இயக்கவும்.</translation>
 <translation id="5642200033778930880">Google Chrome ஆல் காட்சிப் பிரிப்புப் பயன்முறையில் கேமராவைப் பயன்படுத்த முடியாது</translation>
 <translation id="5854621639439811139">Chrome உதவிக்குறிப்பு: 'பின்செல்’, ‘முன்செல்’, ‘தேடு’ போன்ற சில பட்டன்கள் இப்போது உங்கள் திரையின் அடிப்பகுதியில் உள்ளன.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
index ef7a55b3..bae8296d 100644
--- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_te.xtb
@@ -32,6 +32,7 @@
 <translation id="5389212809648216794">మీ కెమెరాను మరొక అప్లికేషన్‌ ఉపయోగిస్తున్నందున Google Chrome దాన్ని ఉపయోగించలేదు</translation>
 <translation id="5639704535586432836">సెట్టింగ్‌లు &gt; గోప్యత &gt; కెమెరా &gt; Google Chromeని తెరిచి, కెమెరాను ఆన్ చేయండి.</translation>
 <translation id="5642200033778930880">Google Chrome, విభజన వీక్షణ మోడ్‌లో మీ కెమెరాను ఉపయోగించలేదు</translation>
+<translation id="5690427481109656848">Google LLC</translation>
 <translation id="5854621639439811139">Chrome చిట్కా. వెనకకు, ముందుకు మరియు శోధన వంటి కొన్ని బటన్‌లు ఇప్పుడు మీ స్క్రీన్ దిగువున ఉన్నాయి.</translation>
 <translation id="6036420186814142909">మీ ఇంటర్నెట్ డేటాను నిర్వహించడంలో మరియు మీరు వెబ్ పేజీలను త్వరగా లోడ్ చేయగలగడంలో మీకు సహాయపడే ఫీచర్‌లు Google Chromeలో ఉన్నాయి.
 <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation>
@@ -49,6 +50,7 @@
 <translation id="7437998757836447326">Chrome నుండి సైన్ అవుట్ చేయండి</translation>
 <translation id="756809126120519699">Chrome డేటా తీసివేయబడింది</translation>
 <translation id="7626032353295482388">Chromeకు స్వాగతం</translation>
+<translation id="8370517070665726704">కాపీరైట్ <ph name="YEAR" /> Google LLC. సర్వ హక్కులు ప్రత్యేకించబడ్డాయి.</translation>
 <translation id="840168496893712993">కొన్ని యాడ్-ఆన్‌లు Chrome క్రాష్ అయ్యేలా చేశాయి. దయచేసి వాటిని అన్‌ఇన్‌స్టాల్ చేయడాన్ని ప్రయత్నించండి.</translation>
 <translation id="8459495907675268833">ఎంచుకోబడిన డేటా Chromeతో పాటు, సింక్ చేసిన‌ పరికరాల నుండి తీసివేయబడింది. మీ Google ఖాతా history.google.comలో ఇతర Google సేవలకు సంబంధించిన శోధనలు, కార్య‌క‌లాపాల‌ వంటి ఇతర రకాల బ్రౌజింగ్ చరిత్రను కలిగి ఉండవచ్చు.</translation>
 <translation id="8540666473246803645">Google Chrome</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb
index b773b0fa..1bef8bdb 100644
--- a/ios/chrome/app/strings/resources/ios_strings_am.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">ስምረትን አብራ</translation>
 <translation id="6914583639806229067">የቀዱትን ምስል ይፈልጉ</translation>
 <translation id="6914783257214138813">የእርስዎ የይለፍ ቃላት ወደ ውጭ የተላከውን ፋይልን መመልከት ለሚችል ማንኛውም ሰው የሚታዩ ይሆናሉ።</translation>
-<translation id="692898627499215142">የመጀመሪያው የስምረት ውቅረት አላለቀም። ስምረትን ለመጀመር የስምረት መቀየሪያውን ያንቁ።</translation>
 <translation id="6944369514868857500">ሌላ መለያ ይምረጡ</translation>
 <translation id="6945221475159498467">ይምረጡ</translation>
 <translation id="6973630695168034713">አቃፊዎች</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index 7467d96..d8a3e8a6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">تشغيل المزامنة</translation>
 <translation id="6914583639806229067">البحث عن الصورة التي نسختها</translation>
 <translation id="6914783257214138813">ستكون كلمات مرورك مرئية لأي شخص يمكنه الاطلاع على الملف الذي تم تصديره.</translation>
-<translation id="692898627499215142">لم ينتهِ إعداد المزامنة الأولية. لبدء المزامنة، تم تفعيل تبديل المزامنة.</translation>
 <translation id="6944369514868857500">اختيار حساب آخر</translation>
 <translation id="6945221475159498467">تحديد</translation>
 <translation id="6973630695168034713">المجلدات</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
index e13d2b7..fd03b6a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Включване на синхронизирането</translation>
 <translation id="6914583639806229067">Търсене на копираното изображение</translation>
 <translation id="6914783257214138813">Паролите ви ще бъдат видими за всички, които могат да видят експортирания файл.</translation>
-<translation id="692898627499215142">Първоначалното настройване на синхронизирането не бе завършено. За да стартирате синхронизирането, активирайте съответния превключвател.</translation>
 <translation id="6944369514868857500">Избиране на друг профил</translation>
 <translation id="6945221475159498467">Избиране</translation>
 <translation id="6973630695168034713">Папки</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
index e983fea..53933a9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -383,7 +383,6 @@
 <translation id="6903907808598579934">সিঙ্ক চালু করুন</translation>
 <translation id="6914583639806229067">আপনার কপি করা ছবি সার্চ করুন</translation>
 <translation id="6914783257214138813">এক্সপোর্ট করা ফাইল যারা দেখতে পান তারা আপনার পাসওয়ার্ডগুলিও দেখতে পাবেন।</translation>
-<translation id="692898627499215142">সিঙ্কের প্রাথমিক সেট-আপ সম্পূর্ণ হয়নি। সিঙ্ক চালু করতে, সেটি টগল করুন।</translation>
 <translation id="6944369514868857500">অন্য অ্যাকাউন্ট বেছে নিন</translation>
 <translation id="6945221475159498467">নির্বাচন</translation>
 <translation id="6973630695168034713">ফোল্ডারগুলি</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
index 3fb4821..b62ead9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Activa la sincronització</translation>
 <translation id="6914583639806229067">Cerca la imatge que has copiat</translation>
 <translation id="6914783257214138813">Tothom que pugui veure el fitxer exportat podrà veure també les teves contrasenyes.</translation>
-<translation id="692898627499215142">La configuració de la sincronització inicial no ha finalitzat. Per iniciar la sincronització, activa el commutador de sincronització.</translation>
 <translation id="6944369514868857500">Tria un altre compte</translation>
 <translation id="6945221475159498467">Selecciona</translation>
 <translation id="6973630695168034713">Carpetes</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
index c5b32d4..d5652cb6 100644
--- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Zapnout synchronizaci</translation>
 <translation id="6914583639806229067">Vyhledat zkopírovaný obrázek</translation>
 <translation id="6914783257214138813">Vaše hesla uvidí každý, kdo může zobrazit exportovaný soubor.</translation>
-<translation id="692898627499215142">Počáteční nastavení synchronizace nebylo dokončeno. Chcete-li synchronizaci spustit, zapněte přepínač Synchronizace.</translation>
 <translation id="6944369514868857500">Vybrat jiný účet</translation>
 <translation id="6945221475159498467">Vybrat</translation>
 <translation id="6973630695168034713">Složky</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb
index c3d2d68d..65e8e3c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_da.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Aktivér synkronisering</translation>
 <translation id="6914583639806229067">Søg efter billede, du har kopieret</translation>
 <translation id="6914783257214138813">Dine adgangskoder vil være synlige for alle, der kan se den eksporterede fil.</translation>
-<translation id="692898627499215142">Den indledende konfiguration af synkronisering blev ikke afsluttet. Slå Synkronisering til for at starte synkroniseringen.</translation>
 <translation id="6944369514868857500">Vælg en anden konto</translation>
 <translation id="6945221475159498467">Vælg</translation>
 <translation id="6973630695168034713">Mapper</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb
index 15f9e4b..7ad483d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_de.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Synchronisierung aktivieren</translation>
 <translation id="6914583639806229067">Nach dem kopierten Bild suchen</translation>
 <translation id="6914783257214138813">Ihre Passwörter sind für jeden zugänglich, der die exportierte Passwortdatei aufrufen kann.</translation>
-<translation id="692898627499215142">Die erstmalige Einrichtung der Synchronisierung wurde nicht abgeschlossen. Zum Starten der Synchronisierung aktivieren Sie die Schaltfläche "Synchronisierung".</translation>
 <translation id="6944369514868857500">Anderes Konto auswählen</translation>
 <translation id="6945221475159498467">Auswählen</translation>
 <translation id="6973630695168034713">Ordner</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb
index 2770631b..83cb8c794 100644
--- a/ios/chrome/app/strings/resources/ios_strings_el.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -383,7 +383,6 @@
 <translation id="6903907808598579934">Ενεργοποίηση συγχρονισμού</translation>
 <translation id="6914583639806229067">Αναζήτηση της εικόνας που αντιγράψατε</translation>
 <translation id="6914783257214138813">Οι κωδικοί πρόσβασής σας θα είναι ορατοί σε οποιονδήποτε μπορεί να δει το αρχείο εξαγωγής.</translation>
-<translation id="692898627499215142">Η αρχική ρύθμιση του συγχρονισμού δεν τελείωσε. Για να ξεκινήσει ο συγχρονισμός, ενεργοποιήστε τον από το κουμπί εναλλαγής κατάστασης συγχρονισμού.</translation>
 <translation id="6944369514868857500">Επιλογή άλλου λογαριασμού</translation>
 <translation id="6945221475159498467">Επιλογή</translation>
 <translation id="6973630695168034713">Φάκελοι</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 8c5055d..7c04de0 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Turn on sync</translation>
 <translation id="6914583639806229067">Search for image that you copied</translation>
 <translation id="6914783257214138813">Your passwords will be visible to anyone who can see the exported file.</translation>
-<translation id="692898627499215142">Initial sync setup was not finished. To start Sync, enabled the Sync toggle.</translation>
 <translation id="6944369514868857500">Choose another account</translation>
 <translation id="6945221475159498467">Select</translation>
 <translation id="6973630695168034713">Folders</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 f31aa862..bcdb28bc 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Activar la sincronización</translation>
 <translation id="6914583639806229067">Buscar la imagen que copiaste</translation>
 <translation id="6914783257214138813">Las personas que tengan acceso al archivo exportado podrán ver tus contraseñas.</translation>
-<translation id="692898627499215142">No se completó la configuración de la sincronización inicial. Para comenzarla, habilita el control deslizante Sincronizar.</translation>
 <translation id="6944369514868857500">Elegir otra cuenta</translation>
 <translation id="6945221475159498467">Seleccionar</translation>
 <translation id="6973630695168034713">Carpetas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb
index 54dd275..16d2e230 100644
--- a/ios/chrome/app/strings/resources/ios_strings_es.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -388,6 +388,7 @@
 <translation id="6979158407327259162">Google Drive</translation>
 <translation id="7004499039102548441">Pestañas recientes</translation>
 <translation id="7006788746334555276">Configuración de contenido</translation>
+<translation id="7015203776128479407">La configuración de sincronización inicial no ha terminado. La sincronización está desactivada.</translation>
 <translation id="7029809446516969842">Contraseñas</translation>
 <translation id="7031882061095297553">Sincronizar con</translation>
 <translation id="7053983685419859001">Bloquear</translation>
@@ -399,6 +400,7 @@
 <translation id="7136892417564438900">La cámara no está disponible</translation>
 <translation id="7159472599653637159">Solicitar sitio web móvil</translation>
 <translation id="7167621057293532233">Tipos de datos</translation>
+<translation id="7173114856073700355">Abrir Ajustes</translation>
 <translation id="7189598951263744875">Compartir...</translation>
 <translation id="7192050974311852563">Iniciar registro</translation>
 <translation id="7203585745079012652">Decir las respuestas</translation>
@@ -475,6 +477,7 @@
 <translation id="850600235656508448">Abrir en modo de incógnito</translation>
 <translation id="8517375800490286174">Licencias de código abierto</translation>
 <translation id="8524799873541103884">Pestañas de <ph name="INCOGNITO" />: de <ph name="FIRST_VISIBLE_TAB" /> a <ph name="LAST_VISIBLE_TAB" /> de <ph name="NUMBER_OF_OPEN_TABS" /></translation>
+<translation id="8529767659511976195">Nuevo</translation>
 <translation id="8532105204136943229">Año de caducidad</translation>
 <translation id="8534481786647257214">Publicado en Google+</translation>
 <translation id="8548878600947630424">Buscar en la página...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb
index 8356b500..88b4034 100644
--- a/ios/chrome/app/strings/resources/ios_strings_et.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Lülita sünkroonimine sisse</translation>
 <translation id="6914583639806229067">Otsi kopeeritud pilti</translation>
 <translation id="6914783257214138813">Teie paroolid on nähtavad kõigile, kes saavad vaadata eksporditud faili.</translation>
-<translation id="692898627499215142">Sünkroonimise algseadistust ei viidud lõpule. Sünkroonimise käivitamiseks lubage sünkroonimise lüliti</translation>
 <translation id="6944369514868857500">Valige muu konto</translation>
 <translation id="6945221475159498467">Vali</translation>
 <translation id="6973630695168034713">Kaustad</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
index bd75eea7..0946d69 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">روشن کردن همگام‌سازی</translation>
 <translation id="6914583639806229067">جستجوی تصویری که کپی کرده‌اید</translation>
 <translation id="6914783257214138813">گذرواژه‌های شما برای همه افرادی که می‌توانند فایل صادرشده را ببینید، نمایان خواهند بود.</translation>
-<translation id="692898627499215142">راه‌اندازی اولیه همگام‌سازی کامل نشد. برای شروع همگام‌سازی، روشن/خاموش کردن همگام‌سازی را فعال کنید.</translation>
 <translation id="6944369514868857500">انتخاب حسابی دیگر</translation>
 <translation id="6945221475159498467">انتخاب</translation>
 <translation id="6973630695168034713">پوشه‌ها</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
index 4863a72..17e5093 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Ota synkronointi käyttöön</translation>
 <translation id="6914583639806229067">Hae kopioitua kuvaa</translation>
 <translation id="6914783257214138813">Salasanasi näkyvät kaikille, jotka näkevät viedyn tiedoston.</translation>
-<translation id="692898627499215142">Alkuperäistä synkronoinnin määritystä ei tehty loppuun. Aloita synkronointi ottamalla synkronointi käyttöön asetuksissa.</translation>
 <translation id="6944369514868857500">Valitse toinen tili</translation>
 <translation id="6945221475159498467">Valitse</translation>
 <translation id="6973630695168034713">Kansiot</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
index 6c0c222..f8d4e2a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -388,6 +388,7 @@
 <translation id="6979158407327259162">Google Drive</translation>
 <translation id="7004499039102548441">Mga Kamakailang Tab</translation>
 <translation id="7006788746334555276">Mga Setting ng Nilalaman</translation>
+<translation id="7015203776128479407">Hindi natapos ang pag-set up ng unang pag-sync. Naka-off ang pag-sync.</translation>
 <translation id="7029809446516969842">Mga Password</translation>
 <translation id="7031882061095297553">I-sync sa</translation>
 <translation id="7053983685419859001">I-block</translation>
@@ -399,6 +400,7 @@
 <translation id="7136892417564438900">Hindi available ang camera</translation>
 <translation id="7159472599653637159">Hilingin ang Pang-mobile na Site</translation>
 <translation id="7167621057293532233">Mga Uri ng Data</translation>
+<translation id="7173114856073700355">Buksan ang Mga Setting</translation>
 <translation id="7189598951263744875">Ibahagi...</translation>
 <translation id="7192050974311852563">Simulan ang Pag-log</translation>
 <translation id="7203585745079012652">Bigkasin ang Mga Sagot</translation>
@@ -475,6 +477,7 @@
 <translation id="850600235656508448">Buksan sa Incognito</translation>
 <translation id="8517375800490286174">Mga Lisensya ng Open Source</translation>
 <translation id="8524799873541103884">Mga Tab na <ph name="INCOGNITO" /> <ph name="FIRST_VISIBLE_TAB" /> hanggang <ph name="LAST_VISIBLE_TAB" /> ng <ph name="NUMBER_OF_OPEN_TABS" /></translation>
+<translation id="8529767659511976195">Bago</translation>
 <translation id="8532105204136943229">Taon ng Pag-expire</translation>
 <translation id="8534481786647257214">Kumpleto na ang pag-post sa Google+.</translation>
 <translation id="8548878600947630424">Hanapin sa page...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
index 2d06963..32bee0e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Activer la synchronisation</translation>
 <translation id="6914583639806229067">Rechercher l'image copiée</translation>
 <translation id="6914783257214138813">Toute personne ayant accès au fichier exporté pourra voir ces mots de passe.</translation>
-<translation id="692898627499215142">La configuration de la synchronisation initiale n'était pas terminée. Pour lancer la synchronisation, activez-la à l'aide du bouton associé.</translation>
 <translation id="6944369514868857500">Sélectionner un autre compte</translation>
 <translation id="6945221475159498467">Sélectionner</translation>
 <translation id="6973630695168034713">Dossiers</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
index a4df8aa8..f5a40cce 100644
--- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">સમન્વયન ચાલુ કરો</translation>
 <translation id="6914583639806229067">તમે કૉપિ કરેલી છબી માટે શોધ કરો</translation>
 <translation id="6914783257214138813">જે કોઈપણ તમારી નિકાસ કરેલ પાસવર્ડની ફાઇલને જોઈ શકશે, તેમને તમારા પાસવર્ડ પણ દૃશ્યક્ષમ થશે.</translation>
-<translation id="692898627499215142">આરંભિક સિંક સેટઅપ પૂરું થયું નથી. સિંક કરવાનું ચાલુ કરવા માટે સિંક ટૉગલ ચાલુ કર્યું.</translation>
 <translation id="6944369514868857500">બીજું એકાઉન્ટ પસંદ કરો</translation>
 <translation id="6945221475159498467">પસંદ કરો</translation>
 <translation id="6973630695168034713">ફોલ્ડર્સ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
index 8eb84835..b9a1ca5 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">समन्वयन चालू करें</translation>
 <translation id="6914583639806229067">जो इमेज आपने कॉपी की थी वह खोजें</translation>
 <translation id="6914783257214138813">आपके पासवर्ड, निर्यात की गई फ़ाइल देख पाने वाले सभी व्यक्तियों को दिखाई देंगे.</translation>
-<translation id="692898627499215142">शुरुआती सिंक सेटअप पूरा नहीं हुआ. 'सिंक' शुरू करने के लिए, 'सिंक' टॉगल चालू करें.</translation>
 <translation id="6944369514868857500">दूसरा खाता चुनें</translation>
 <translation id="6945221475159498467">चुनें</translation>
 <translation id="6973630695168034713">फ़ोल्डर</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
index e9dc19b..0d28d33f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Uključi sinkronizaciju</translation>
 <translation id="6914583639806229067">Pretraživanje slike koju ste kopirali</translation>
 <translation id="6914783257214138813">Vaše zaporke bit će vidljive svima koji vide izvezenu datoteku.</translation>
-<translation id="692898627499215142">Početno postavljanje sinkronizacije nije dovršeno. Za pokretanje sinkronizacije omogućite prekidač Sinkronizacija.</translation>
 <translation id="6944369514868857500">Odaberite neki drugi račun</translation>
 <translation id="6945221475159498467">Odaberi</translation>
 <translation id="6973630695168034713">Mape</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
index fe2f0e5..c37676f7 100644
--- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Szinkronizálás bekapcsolása</translation>
 <translation id="6914583639806229067">Vágólapra másolt kép keresése</translation>
 <translation id="6914783257214138813">Jelszavai mindenki számára láthatók lesznek, aki hozzáfér az exportált fájlhoz.</translation>
-<translation id="692898627499215142">A szinkronizálás kezdeti beállítása nem fejeződött be. A szinkronizálás indításához kapcsolja be a Szinkronizálás kapcsolót.</translation>
 <translation id="6944369514868857500">Másik fiók választása</translation>
 <translation id="6945221475159498467">Kiválasztás</translation>
 <translation id="6973630695168034713">Mappák</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb
index 78372f3..c548e0c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_id.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Aktifkan sinkronisasi</translation>
 <translation id="6914583639806229067">Telusuri Gambar yang Anda Salin</translation>
 <translation id="6914783257214138813">Sandi akan terlihat oleh orang yang dapat melihat file yang diekspor.</translation>
-<translation id="692898627499215142">Penyiapan sinkronisasi awal belum selesai. Untuk memulai Sinkronisasi, aktifkan tombol Sinkronisasi.</translation>
 <translation id="6944369514868857500">Pilih Akun Lain</translation>
 <translation id="6945221475159498467">Pilih</translation>
 <translation id="6973630695168034713">Folder</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb
index 70dfafd..ff5c570 100644
--- a/ios/chrome/app/strings/resources/ios_strings_it.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Attiva la sincronizzazione</translation>
 <translation id="6914583639806229067">Cerca l'immagine copiata</translation>
 <translation id="6914783257214138813">Le tue password saranno visibili a chiunque abbia accesso al file esportato.</translation>
-<translation id="692898627499215142">La configurazione della sincronizzazione iniziale non è stata terminata. Per avviare la sincronizzazione, attivala.</translation>
 <translation id="6944369514868857500">Scegli un altro account</translation>
 <translation id="6945221475159498467">Seleziona</translation>
 <translation id="6973630695168034713">Cartelle</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
index 827f0891..9b81afa 100644
--- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">הפעל סנכרון</translation>
 <translation id="6914583639806229067">חיפוש תמונה שהעתקת</translation>
 <translation id="6914783257214138813">כל מי שיוכל לגשת אל הקובץ המיוצא יוכל לראות את הסיסמאות שלך.</translation>
-<translation id="692898627499215142">הגדרת הסנכרון הראשונית לא הושלמה. כדי להתחיל בסנכרון, יש להפעיל את לחצן החלפת המצב של הסנכרון.</translation>
 <translation id="6944369514868857500">בחירת חשבון אחר</translation>
 <translation id="6945221475159498467">בחירה</translation>
 <translation id="6973630695168034713">תיקיות</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
index 930399d..f11c25e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">同期を有効にする</translation>
 <translation id="6914583639806229067">コピーした画像を検索</translation>
 <translation id="6914783257214138813">エクスポートしたファイルを閲覧できるユーザーにパスワードを知られてしまう可能性があります。</translation>
-<translation id="692898627499215142">最初の同期設定が終了していません。同期を開始するには、同期をオンにしてください。</translation>
 <translation id="6944369514868857500">別のアカウントを選択</translation>
 <translation id="6945221475159498467">選択</translation>
 <translation id="6973630695168034713">フォルダ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
index 25dd4c1..a9bd0467 100644
--- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">ಸಿಂಕ್‌ ಆನ್‌ ಮಾಡಿ</translation>
 <translation id="6914583639806229067">ನೀವು ನಕಲಿಸಿದ ಚಿತ್ರವನ್ನು ಹುಡುಕಿ</translation>
 <translation id="6914783257214138813">ರಫ್ತು ಮಾಡಲಾದ ಫೈಲ್ ಅನ್ನು ನೋಡುವ ಯಾರಿಗಾದರೂ ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಗೋಚರಿಸುತ್ತವೆ.</translation>
-<translation id="692898627499215142">ಪ್ರಾರಂಭಿಕ ಸಿಂಕ್ ಸೆಟಪ್ ಮುಗಿದಿಲ್ಲ. ಸಿಂಕ್ ಪ್ರಾರಂಭಿಸಲು, ಸಿಂಕ್ ಟಾಗಲ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ.</translation>
 <translation id="6944369514868857500">ಬೇರೊಂದು ಖಾತೆಯನ್ನು ಆಯ್ಕೆ ಮಾಡಿ</translation>
 <translation id="6945221475159498467">ಆಯ್ಕೆಮಾಡಿ</translation>
 <translation id="6973630695168034713">ಫೋಲ್ಡರ್‌ಗಳು</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
index 7f5e369..f907e39 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">동기화 사용 설정</translation>
 <translation id="6914583639806229067">복사한 이미지 검색</translation>
 <translation id="6914783257214138813">내보낸 파일을 볼 수 있는 모든 사용자에게 비밀번호가 표시됩니다.</translation>
-<translation id="692898627499215142">초기 동기화 설정이 완료되지 않았습니다. 동기화를 시작하려면 동기화를 사용으로 전환하세요.</translation>
 <translation id="6944369514868857500">다른 계정 선택</translation>
 <translation id="6945221475159498467">선택</translation>
 <translation id="6973630695168034713">폴더</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
index 2f646f9..40274cf 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Įjungti sinchronizavimą</translation>
 <translation id="6914583639806229067">Ieškoti nukopijuoto vaizdo</translation>
 <translation id="6914783257214138813">Jūsų slaptažodžiai bus matomi visiems, kurie gali peržiūrėti eksportuotą failą.</translation>
-<translation id="692898627499215142">Pradinis sinchronizavimo nustatymas nebaigtas. Norint pradėti sinchronizuoti, įgalintas sinchronizavimo perjungimas.</translation>
 <translation id="6944369514868857500">Pasirinkti kitą paskyrą</translation>
 <translation id="6945221475159498467">Pasirinkti</translation>
 <translation id="6973630695168034713">Aplankai</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
index 33dc13b..4abc4c80 100644
--- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Ieslēgt sinhronizāciju</translation>
 <translation id="6914583639806229067">Meklēt jūsu kopēto attēlu</translation>
 <translation id="6914783257214138813">Jūsu paroles būs redzamas ikvienam, kas var skatīt eksportēto failu.</translation>
-<translation id="692898627499215142">Sākotnējā sinhronizācijas iestatīšana netika pabeigta. Lai sāktu sinhronizāciju, iespējojiet sinhronizācijas slēdzi.</translation>
 <translation id="6944369514868857500">Izvēlēties citu kontu</translation>
 <translation id="6945221475159498467">Atlasīt</translation>
 <translation id="6973630695168034713">Mapes</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
index a9c6a7546..4b2f77b 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -388,6 +388,7 @@
 <translation id="6979158407327259162">Google ഡ്രൈവ്</translation>
 <translation id="7004499039102548441">സമീപകാല ടാബുകൾ</translation>
 <translation id="7006788746334555276">ഉള്ളടക്ക ക്രമീകരണങ്ങള്‍‌</translation>
+<translation id="7015203776128479407">പ്രാഥമിക സമന്വയ സജ്ജീകരണം പൂർത്തിയാക്കിയിട്ടില്ല. സമന്വയം ഓഫാണ്.</translation>
 <translation id="7029809446516969842">പാസ്‌വേഡുകള്‍</translation>
 <translation id="7031882061095297553">ഇതിലേക്ക് സമന്വയിപ്പിക്കുക</translation>
 <translation id="7053983685419859001">തടയുക</translation>
@@ -399,6 +400,7 @@
 <translation id="7136892417564438900">ക്യാമറ ലഭ്യമല്ല</translation>
 <translation id="7159472599653637159">മൊബൈൽ സൈറ്റ് അഭ്യർത്ഥിക്കുക</translation>
 <translation id="7167621057293532233">ഡാറ്റ തരങ്ങള്‍</translation>
+<translation id="7173114856073700355">ക്രമീകരണം തുറക്കുക</translation>
 <translation id="7189598951263744875">പങ്കിടുക...</translation>
 <translation id="7192050974311852563">ലോഗിംഗ് ആരംഭിക്കുക</translation>
 <translation id="7203585745079012652">മറുപടിയായി ഉത്തരങ്ങൾ പറയുക</translation>
@@ -475,6 +477,7 @@
 <translation id="850600235656508448">ആൾമാറാട്ട മോഡിൽ തുറക്കുക</translation>
 <translation id="8517375800490286174">ഓപ്പൺ സോഴ്‌സ് ലൈസൻസുകൾ</translation>
 <translation id="8524799873541103884"><ph name="NUMBER_OF_OPEN_TABS" />-ൽ <ph name="FIRST_VISIBLE_TAB" /> മുതൽ <ph name="LAST_VISIBLE_TAB" /> വരെയുള്ള <ph name="INCOGNITO" /> ആൾമാറാട്ട ടാബുകൾ</translation>
+<translation id="8529767659511976195">പുതിയത്</translation>
 <translation id="8532105204136943229">കാലഹരണപ്പെടുന്ന വർഷം</translation>
 <translation id="8534481786647257214">Google+ പങ്കിടൽ പൂർത്തിയായി.</translation>
 <translation id="8548878600947630424">പേജിൽ കണ്ടെത്തുക...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
index 667dc6c1..a583e9d 100644
--- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -383,7 +383,6 @@
 <translation id="6903907808598579934">संकालन चालू करा</translation>
 <translation id="6914583639806229067">तुम्ही कॉपी केलेली इमेज शोधा</translation>
 <translation id="6914783257214138813">एक्सपोर्ट करण्यात आलेली फाइल दिसणार्‍या प्रत्येकाला, तुमचा पासवर्ड दिसेल.</translation>
-<translation id="692898627499215142">सुरुवातीचे सिंक सेट करणे पूर्ण झाले नाही. सिंक सुरू करण्यासाठी, सिंक टॉगल सुरू करा.</translation>
 <translation id="6944369514868857500">दुसरे खाते निवडा</translation>
 <translation id="6945221475159498467">निवडा</translation>
 <translation id="6973630695168034713">फोल्डर</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
index 693f179..7d23ac9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Hidupkan penyegerakan</translation>
 <translation id="6914583639806229067">Cari Imej yang Anda Salin</translation>
 <translation id="6914783257214138813">Kata laluan anda akan kelihatan kepada sesiapa yang dapat melihat fail yang dieksport.</translation>
-<translation id="692898627499215142">Penyediaan penyegerakan awal tidak diselesaikan. Untuk memulakan Penyegerakan, dayakan togol Penyegerakan.</translation>
 <translation id="6944369514868857500">Pilih Akaun Lain</translation>
 <translation id="6945221475159498467">Pilih</translation>
 <translation id="6973630695168034713">Folder</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
index 29741f1..f085981 100644
--- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Synchronisatie inschakelen</translation>
 <translation id="6914583639806229067">Zoeken naar gekopieerde afbeelding</translation>
 <translation id="6914783257214138813">Je wachtwoorden zijn zichtbaar voor iedereen die het geëxporteerde bestand kan bekijken.</translation>
-<translation id="692898627499215142">Aanvankelijke synchronisatie-instelling is niet voltooid. Schakel Synchronisatie in om te beginnen met synchroniseren.</translation>
 <translation id="6944369514868857500">Een ander account kiezen</translation>
 <translation id="6945221475159498467">Selecteren</translation>
 <translation id="6973630695168034713">Mappen</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb
index 18a02b0..166784f 100644
--- a/ios/chrome/app/strings/resources/ios_strings_no.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -388,6 +388,7 @@
 <translation id="6979158407327259162">Google Disk</translation>
 <translation id="7004499039102548441">Nylige faner</translation>
 <translation id="7006788746334555276">Innholdsinnstillinger</translation>
+<translation id="7015203776128479407">Innledende synkroniseringsoppsett ble ikke fullført. Synkronisering er slått av.</translation>
 <translation id="7029809446516969842">Passord</translation>
 <translation id="7031882061095297553">Synkroniser med</translation>
 <translation id="7053983685419859001">Blokkér</translation>
@@ -399,6 +400,7 @@
 <translation id="7136892417564438900">Kameraet er utilgjengelig</translation>
 <translation id="7159472599653637159">Be om mobilversjonen av nettstedet</translation>
 <translation id="7167621057293532233">Datatyper</translation>
+<translation id="7173114856073700355">Åpne Innstillinger</translation>
 <translation id="7189598951263744875">Del</translation>
 <translation id="7192050974311852563">Start loggføring</translation>
 <translation id="7203585745079012652">Svar med tale</translation>
@@ -475,6 +477,7 @@
 <translation id="850600235656508448">Åpne i inkognitomodus</translation>
 <translation id="8517375800490286174">Lisenser for åpen kildekode</translation>
 <translation id="8524799873541103884"><ph name="INCOGNITO" />fane <ph name="FIRST_VISIBLE_TAB" /> til og med <ph name="LAST_VISIBLE_TAB" /> av <ph name="NUMBER_OF_OPEN_TABS" /></translation>
+<translation id="8529767659511976195">Ny</translation>
 <translation id="8532105204136943229">Utløpsår</translation>
 <translation id="8534481786647257214">Google+-innlegget er fullført.</translation>
 <translation id="8548878600947630424">Finn på siden</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
index 61116d5..aef46c8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -271,7 +271,7 @@
 <translation id="5190835502935405962">Pasek zakładek</translation>
 <translation id="5197255632782567636">Internet</translation>
 <translation id="5228579091201413441">Włącz synchronizację</translation>
-<translation id="5244474230056479698">Synchronizowanie z <ph name="EMAIL" /></translation>
+<translation id="5244474230056479698">Synchronizacja z <ph name="EMAIL" /></translation>
 <translation id="5245322853195994030">Anuluj synchronizację</translation>
 <translation id="5271549068863921519">Zapisz hasło</translation>
 <translation id="5300589172476337783">Pokaż</translation>
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Włącz synchronizację</translation>
 <translation id="6914583639806229067">Wyszukaj skopiowany obraz</translation>
 <translation id="6914783257214138813">Twoje hasła będą widoczne dla każdego, kto może zobaczyć wyeksportowany plik.</translation>
-<translation id="692898627499215142">Nie ukończono początkowej konfiguracji synchronizacji. Aby rozpocząć synchronizację, włącz przełącznik Synchronizuj.</translation>
 <translation id="6944369514868857500">Wybierz inne konto</translation>
 <translation id="6945221475159498467">Wybierz</translation>
 <translation id="6973630695168034713">Foldery</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 48ac5a5..87eef92c 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Ativar a sincronização</translation>
 <translation id="6914583639806229067">Pesquisar imagem que você copiou</translation>
 <translation id="6914783257214138813">Suas senhas ficarão visíveis para qualquer pessoa que tiver acesso ao arquivo exportado.</translation>
-<translation id="692898627499215142">A configuração de sincronização inicial não foi concluída. Para iniciar a sincronização, ative essa opção.</translation>
 <translation id="6944369514868857500">Escolher outra conta</translation>
 <translation id="6945221475159498467">Selecionar</translation>
 <translation id="6973630695168034713">Pastas</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 6715e53..7fcf3c66 100644
--- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Ativar sincronização</translation>
 <translation id="6914583639806229067">Pesquisar imagem que copiou</translation>
 <translation id="6914783257214138813">As suas palavras-passe serão visíveis para todas as pessoas que consigam ver o ficheiro exportado.</translation>
-<translation id="692898627499215142">A configuração da sincronização inicial não foi concluída. Para iniciar a sincronização, ative o botão de ativar/desativar Sincronizar.</translation>
 <translation id="6944369514868857500">Selecionar outra conta</translation>
 <translation id="6945221475159498467">Selecionar</translation>
 <translation id="6973630695168034713">Pastas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
index f05a5eaf..fb52bd8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Activează sincronizarea</translation>
 <translation id="6914583639806229067">Caută imaginea pe care ai copiat-o</translation>
 <translation id="6914783257214138813">Parolele vor fi vizibile pentru toți cei care pot vedea fișierul exportat.</translation>
-<translation id="692898627499215142">Configurarea inițială a sincronizării nu a fost finalizată. Pentru a porni sincronizarea, activează comutatorul de sincronizare.</translation>
 <translation id="6944369514868857500">Alege alt cont</translation>
 <translation id="6945221475159498467">Selectează</translation>
 <translation id="6973630695168034713">Dosare</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
index e523869..f4f4997 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -388,6 +388,7 @@
 <translation id="6979158407327259162">Google Диск</translation>
 <translation id="7004499039102548441">Недавние вкладки</translation>
 <translation id="7006788746334555276">Настройки контента</translation>
+<translation id="7015203776128479407">Первоначальная настройка синхронизации не завершена. Синхронизация выключена.</translation>
 <translation id="7029809446516969842">Пароли</translation>
 <translation id="7031882061095297553">Выберите аккаунт</translation>
 <translation id="7053983685419859001">Блокировать</translation>
@@ -399,6 +400,7 @@
 <translation id="7136892417564438900">Камера недоступна</translation>
 <translation id="7159472599653637159">Мобильная версия</translation>
 <translation id="7167621057293532233">Типы данных</translation>
+<translation id="7173114856073700355">Открыть настройки</translation>
 <translation id="7189598951263744875">Поделиться…</translation>
 <translation id="7192050974311852563">Начать запись журнала</translation>
 <translation id="7203585745079012652">Озвучивать результаты поиска</translation>
@@ -475,6 +477,7 @@
 <translation id="850600235656508448">Открыть в режиме инкогнито</translation>
 <translation id="8517375800490286174">Лицензии открытого ПО</translation>
 <translation id="8524799873541103884"><ph name="INCOGNITO" />, вкладки между <ph name="FIRST_VISIBLE_TAB" /> и <ph name="LAST_VISIBLE_TAB" />, всего <ph name="NUMBER_OF_OPEN_TABS" /></translation>
+<translation id="8529767659511976195">Новое</translation>
 <translation id="8532105204136943229">Год</translation>
 <translation id="8534481786647257214">Опубликовано в Google+.</translation>
 <translation id="8548878600947630424">Найти на странице…</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
index 7552747..68ab923 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Zapnúť synchronizáciu</translation>
 <translation id="6914583639806229067">Vyhľadať skopírovaný obrázok</translation>
 <translation id="6914783257214138813">Vaše heslá uvidí každý, kto si môže zobraziť exportovaný súbor.</translation>
-<translation id="692898627499215142">Počiatočné nastavenie synchronizácie nebolo dokončené. Ak chcete spustiť synchronizáciu, zapnite jej prepínač.</translation>
 <translation id="6944369514868857500">Vybrať iný účet</translation>
 <translation id="6945221475159498467">Vybrať</translation>
 <translation id="6973630695168034713">Priečinky</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
index b255c017..aee3c6e2 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Vklopi sinhronizacijo</translation>
 <translation id="6914583639806229067">Iskanje slike, ki ste jo kopirali</translation>
 <translation id="6914783257214138813">Gesla bodo vidna vsakomur, ki si lahko ogleda izvoženo datoteko z gesli.</translation>
-<translation id="692898627499215142">Začetna nastavitev sinhronizacije ni bila dokončana. Če želite začeti sinhronizacijo, omogočite preklopni element za sinhronizacijo.</translation>
 <translation id="6944369514868857500">Izberi drug račun</translation>
 <translation id="6945221475159498467">Izberi</translation>
 <translation id="6973630695168034713">Mape</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
index b8aed2b..4c8d49ce 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Укључи синхронизацију</translation>
 <translation id="6914583639806229067">Потражите слику коју сте копирали</translation>
 <translation id="6914783257214138813">Лозинке ће бити видљиве свима који могу да виде извезену датотеку.</translation>
-<translation id="692898627499215142">Почетно подешавање синхронизације није завршено. Да бисте покренули синхронизацију, омогућите прекидач за синхронизацију.</translation>
 <translation id="6944369514868857500">Одаберите други налог</translation>
 <translation id="6945221475159498467">Изабери</translation>
 <translation id="6973630695168034713">Директоријуми</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
index fbc2f62..6a50482 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Aktivera synkronisering</translation>
 <translation id="6914583639806229067">Sök efter kopierad bild</translation>
 <translation id="6914783257214138813">Alla med tillgång till den exporterade filen kan läsa dina lösenord.</translation>
-<translation id="692898627499215142">Den initiala synkroniseringskonfigureringen avslutades inte. Aktivera synkroniseringsreglaget för att börja synkronisera.</translation>
 <translation id="6944369514868857500">Välj ett annat konto</translation>
 <translation id="6945221475159498467">Välj</translation>
 <translation id="6973630695168034713">Mappar</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
index af0c75f0..43c3c4a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Washa kipengele cha kusawazisha</translation>
 <translation id="6914583639806229067">Tafuta Picha Uliyonakili</translation>
 <translation id="6914783257214138813">Mtu yeyote anayeweza kuona faili uliyohamisha ataona manenosiri yako.</translation>
-<translation id="692898627499215142">Haikukamilisha kuweka usawazishaji wa mipangilio ya kwanza. Ili uanze Kusawazisha, washa swichi ya Usawazishaji.</translation>
 <translation id="6944369514868857500">Chagua Akaunti Nyingine</translation>
 <translation id="6945221475159498467">Chagua</translation>
 <translation id="6973630695168034713">Folda</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
index b4c832e..042ef8a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -200,7 +200,7 @@
 <translation id="3995521777587992544">பக்க ஏற்றச் செயல்நிலைப் பட்டி, <ph name="EMAIL" /> ஏற்றப்பட்டுள்ளது.</translation>
 <translation id="4002066346123236978">தலைப்பு</translation>
 <translation id="4004204301268239848">கடவுச்சொற்களை வேறு சாதனங்களிலும் பயன்படுத்த ஏதுவாக, அவை உங்கள் Google கணக்கில் சேமிக்கப்பட்டுள்ளன.</translation>
-<translation id="4038354071007134711">கோப்பைத் திறக்கக்கூடிய பயன்பாடு சாதனத்தில் இல்லை.</translation>
+<translation id="4038354071007134711">கோப்பைத் திறக்கக்கூடிய ஆப்ஸ் சாதனத்தில் இல்லை.</translation>
 <translation id="4042870976416480368">பக்கத்தில் கண்டறிக</translation>
 <translation id="4049507953662678203">இணைய இணைப்பு இருப்பதை உறுதிசெய்து, மீண்டும் முயலவும்.</translation>
 <translation id="4071530748369333746">ஒத்திசைவை ரத்துசெய்யவா?</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb
index 306902a3..b3a38a8 100644
--- a/ios/chrome/app/strings/resources/ios_strings_te.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -388,6 +388,7 @@
 <translation id="6979158407327259162">Google డిస్క్</translation>
 <translation id="7004499039102548441">ఇటీవలి ట్యాబ్‌లు</translation>
 <translation id="7006788746334555276">కంటెంట్ సెట్టింగ్‌లు</translation>
+<translation id="7015203776128479407">ప్రాథమిక సింక్ సెటప్ పూర్తి కాలేదు. సింక్ ఆఫ్‌లో ఉంది.</translation>
 <translation id="7029809446516969842">పాస్‌వర్డ్‌లు</translation>
 <translation id="7031882061095297553">వీటికి సమకాలీకరించండి</translation>
 <translation id="7053983685419859001">నిరోధించు</translation>
@@ -399,6 +400,7 @@
 <translation id="7136892417564438900">కెమెరా అందుబాటులో లేదు</translation>
 <translation id="7159472599653637159">మొబైల్ సైట్‌ను అభ్యర్థించు</translation>
 <translation id="7167621057293532233">డేటా రకాలు</translation>
+<translation id="7173114856073700355">సెట్టింగ్‌లను తెరువు</translation>
 <translation id="7189598951263744875">భాగస్వామ్యం చేయి...</translation>
 <translation id="7192050974311852563">లాగ్ చేయడం ప్రారంభించు</translation>
 <translation id="7203585745079012652">సమాధానాలను చదివి వినిపించు</translation>
@@ -475,6 +477,7 @@
 <translation id="850600235656508448">అజ్ఞాతంలో తెరువు</translation>
 <translation id="8517375800490286174">ఓపెన్ సోర్స్ లైసెన్స్‌లు</translation>
 <translation id="8524799873541103884"><ph name="NUMBER_OF_OPEN_TABS" />లో <ph name="FIRST_VISIBLE_TAB" /> నుండి <ph name="LAST_VISIBLE_TAB" /> వరకు <ph name="INCOGNITO" /> ట్యాబ్‌లు</translation>
+<translation id="8529767659511976195">కొత్తది</translation>
 <translation id="8532105204136943229">గడువు ముగింపు సంవత్సరం</translation>
 <translation id="8534481786647257214">Google+ పోస్ట్ పూర్తయింది.</translation>
 <translation id="8548878600947630424">పేజీలో కనుగొను...</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb
index f905e41b..3700a38 100644
--- a/ios/chrome/app/strings/resources/ios_strings_th.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">เปิดการซิงค์</translation>
 <translation id="6914583639806229067">ค้นหารูปภาพที่คุณคัดลอก</translation>
 <translation id="6914783257214138813">คนที่ดูไฟล์ที่ส่งออกได้จะเห็นรหัสผ่านของคุณ</translation>
-<translation id="692898627499215142">ตั้งค่าการซิงค์เริ่มต้นไม่สำเร็จ เลื่อนเปิดสวิตช์ "ซิงค์" เพื่อเริ่มซิงค์</translation>
 <translation id="6944369514868857500">เลือกบัญชีอื่น</translation>
 <translation id="6945221475159498467">เลือก</translation>
 <translation id="6973630695168034713">โฟลเดอร์</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
index 348e2701..b09e1654 100644
--- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Senkronizasyonu aç</translation>
 <translation id="6914583639806229067">Kopyalanan Metni Ara</translation>
 <translation id="6914783257214138813">Şifreleriniz, dışa aktarılan dosyayı görebilen herkes tarafından görülebilir.</translation>
-<translation id="692898627499215142">İlk senkronizasyon kurulumu tamamlanmadı. Senkronizasyonu başlatmak için Senkronizasyon anahtarını etkinleştirin.</translation>
 <translation id="6944369514868857500">Başka Hesap Seç</translation>
 <translation id="6945221475159498467">Seç</translation>
 <translation id="6973630695168034713">Klasörler</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
index ea16968..a60caab9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Увімкнути синхронізацію</translation>
 <translation id="6914583639806229067">Шукати скопійоване зображення</translation>
 <translation id="6914783257214138813">Ваші паролі бачитимуть усі, хто може переглядати експортований файл.</translation>
-<translation id="692898627499215142">Початкове налаштування синхронізації не завершено. Щоб почати синхронізацію, увімкніть її.</translation>
 <translation id="6944369514868857500">Вибрати інший обліковий запис</translation>
 <translation id="6945221475159498467">Вибрати</translation>
 <translation id="6973630695168034713">Папки</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
index 2dc515fde..e99b583e 100644
--- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">Bật đồng bộ hóa</translation>
 <translation id="6914583639806229067">Tìm kiếm hình ảnh bạn đã sao chép</translation>
 <translation id="6914783257214138813">Bất cứ ai có thể xem tệp đã xuất đều có thể biết mật khẩu của bạn.</translation>
-<translation id="692898627499215142">Quá trình thiết lập đồng bộ hóa ban đầu chưa hoàn tất. Để bắt đầu Đồng bộ hóa, hãy bật tính năng Đồng bộ hóa.</translation>
 <translation id="6944369514868857500">Chọn một tài khoản khác</translation>
 <translation id="6945221475159498467">Chọn</translation>
 <translation id="6973630695168034713">Thư mụ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 e7e346f1..b43577e9 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">开启同步功能</translation>
 <translation id="6914583639806229067">搜索您复制的图片</translation>
 <translation id="6914783257214138813">所有能查看此导出文件的人员都能看到您的密码。</translation>
-<translation id="692898627499215142">初始同步设置未完成。要开始同步,请开启同步开关。</translation>
 <translation id="6944369514868857500">另选一个帐号</translation>
 <translation id="6945221475159498467">选择</translation>
 <translation id="6973630695168034713">文件夹</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 1e2dd76..e36fd8f4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -382,7 +382,6 @@
 <translation id="6903907808598579934">開啟同步處理功能</translation>
 <translation id="6914583639806229067">搜尋你複製的圖片</translation>
 <translation id="6914783257214138813">凡是可查看匯出的檔案的使用者都能看到你的密碼。</translation>
-<translation id="692898627499215142">尚未完成初始同步處理設定。如要啟動同步處理,請啟用同步處理切換按鈕。</translation>
 <translation id="6944369514868857500">選擇其他帳戶</translation>
 <translation id="6945221475159498467">選取</translation>
 <translation id="6973630695168034713">資料夾</translation>
diff --git a/ios/chrome/browser/autofill/automation/automation_action.mm b/ios/chrome/browser/autofill/automation/automation_action.mm
index 774e1bbc..a5048ef 100644
--- a/ios/chrome/browser/autofill/automation/automation_action.mm
+++ b/ios/chrome/browser/autofill/automation/automation_action.mm
@@ -5,6 +5,7 @@
 #import <EarlGrey/EarlGrey.h>
 
 #import "ios/chrome/browser/autofill/automation/automation_action.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 
 #include "base/guid.h"
 #include "base/mac/foundation_util.h"
@@ -214,7 +215,8 @@
   web::WebState* web_state = chrome_test_util::GetCurrentWebState();
 
   // Wait for the element to be visible on the page.
-  [ChromeEarlGrey waitForWebViewContainingElement:selector];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:selector]);
 
   // Potentially scroll into view if below the fold.
   [[EarlGrey selectElementWithMatcher:web::WebViewInWebState(web_state)]
@@ -438,7 +440,8 @@
   }
 
   // Wait for the element to be visible on the page.
-  [ChromeEarlGrey waitForWebViewContainingElement:selector];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:selector]);
 
   NSString* expectedType = base::SysUTF8ToNSString([self
       getStringFromDictionaryWithKey:"expectedAutofillType"
@@ -495,7 +498,8 @@
   }
 
   // Wait for the element to be visible on the page.
-  [ChromeEarlGrey waitForWebViewContainingElement:selector];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:selector]);
 
   int selectedIndex = [self getIntFromDictionaryWithKey:"index" error:&error];
   if (error) {
diff --git a/ios/chrome/browser/autofill/automation/automation_action_egtest.mm b/ios/chrome/browser/autofill/automation/automation_action_egtest.mm
index c7511ef8..3da273b 100644
--- a/ios/chrome/browser/autofill/automation/automation_action_egtest.mm
+++ b/ios/chrome/browser/autofill/automation/automation_action_egtest.mm
@@ -35,7 +35,8 @@
       base::FilePath(FILE_PATH_LITERAL(kTestPageDirectory)));
   XCTAssertTrue(self.testServer->Start());
 
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kTestPageUrl)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kTestPageUrl)]);
 }
 
 // Tests the click action, by clicking a button that populates the web page,
diff --git a/ios/chrome/browser/autofill/automation/automation_egtest.mm b/ios/chrome/browser/autofill/automation/automation_egtest.mm
index 94990d8..2972129 100644
--- a/ios/chrome/browser/autofill/automation/automation_egtest.mm
+++ b/ios/chrome/browser/autofill/automation/automation_egtest.mm
@@ -13,6 +13,7 @@
 #import "ios/chrome/browser/autofill/automation/automation_action.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 
 #include "base/guid.h"
@@ -286,7 +287,7 @@
 - (bool)runActionsOnce {
   @try {
     // Load the initial page of the recipe.
-    [ChromeEarlGrey loadURL:startUrl];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:startUrl]);
 
     for (AutomationAction* action in actions_) {
       CHROME_EG_ASSERT_NO_ERROR([action execute]);
diff --git a/ios/chrome/browser/autofill/form_input_egtest.mm b/ios/chrome/browser/autofill/form_input_egtest.mm
index 84af414..73950ab 100644
--- a/ios/chrome/browser/autofill/form_input_egtest.mm
+++ b/ios/chrome/browser/autofill/form_input_egtest.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_actions.h"
@@ -89,9 +90,10 @@
   web::test::SetUpFileBasedHttpServer();
   GURL URL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/multi_field_form.html");
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
-  [ChromeEarlGrey waitForWebViewContainingText:"hello!"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"hello!"]);
 
   // Opening the keyboard from a webview blocks EarlGrey's synchronization.
   [[GREYConfiguration sharedInstance]
diff --git a/ios/chrome/browser/context_menu/context_menu_egtest.mm b/ios/chrome/browser/context_menu/context_menu_egtest.mm
index 242e507..2c12612 100644
--- a/ios/chrome/browser/context_menu/context_menu_egtest.mm
+++ b/ios/chrome/browser/context_menu/context_menu_egtest.mm
@@ -19,6 +19,7 @@
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h"
@@ -189,12 +190,13 @@
 // image in the current tab.
 - (void)testOpenImageInCurrentTabFromContextMenu {
   const GURL pageURL = self.testServer->GetURL(kLogoPagePath);
-  [ChromeEarlGrey loadURL:pageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText]);
 
   LongPressElement(kLogoPageChromiumImageId);
   TapOnContextMenuButton(OpenImageButton());
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   // Verify url.
   const GURL imageURL = self.testServer->GetURL(kLogoPageImageSourcePath);
@@ -206,15 +208,16 @@
 // opens the image in a new background tab.
 - (void)testOpenImageInNewTabFromContextMenu {
   const GURL pageURL = self.testServer->GetURL(kLogoPagePath);
-  [ChromeEarlGrey loadURL:pageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText]);
 
   LongPressElement(kLogoPageChromiumImageId);
   TapOnContextMenuButton(OpenImageInNewTabButton());
 
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   SelectTabAtIndexInCurrentMode(1U);
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   // Verify url.
   const GURL imageURL = self.testServer->GetURL(kLogoPageImageSourcePath);
@@ -225,15 +228,17 @@
 // Tests "Open in New Tab" on context menu.
 - (void)testContextMenuOpenInNewTab {
   const GURL initialURL = self.testServer->GetURL(kInitialPageUrl);
-  [ChromeEarlGrey loadURL:initialURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kInitialPageDestinationLinkText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:initialURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:kInitialPageDestinationLinkText]);
 
   LongPressElement(kInitialPageDestinationLinkId);
   TapOnContextMenuButton(OpenLinkInNewTabButton());
 
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   SelectTabAtIndexInCurrentMode(1U);
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationPageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationPageText]);
 
   // Verify url.
   const GURL destinationURL = self.testServer->GetURL(kDestinationPageUrl);
@@ -244,7 +249,7 @@
 // Tests that the context menu is displayed for an image url.
 - (void)testContextMenuDisplayedOnImage {
   const GURL imageURL = self.testServer->GetURL(kLogoPageImageSourcePath);
-  [ChromeEarlGrey loadURL:imageURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:imageURL]);
 
   // Calculate a point inside the displayed image. Javascript can not be used to
   // find the element because no DOM exists.  If the viewport is adjusted using
@@ -266,9 +271,9 @@
                         point, kGREYLongPressDefaultDuration)];
 
   TapOnContextMenuButton(OpenImageInNewTabButton());
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   SelectTabAtIndexInCurrentMode(1U);
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   // Verify url.
   [[EarlGrey selectElementWithMatcher:OmniboxText(imageURL.GetContent())]
@@ -280,12 +285,13 @@
   chrome_test_util::HistogramTester histogramTester;
 
   const GURL pageURL = self.testServer->GetURL(kLogoPagePath);
-  [ChromeEarlGrey loadURL:pageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText]);
 
   LongPressElement(kLogoPageChromiumImageId);
   TapOnContextMenuButton(OpenImageButton());
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   histogramTester.ExpectTotalCount("ContextMenu.DOMElementFetchDuration", 1,
                                    ^(NSString* error) {
@@ -298,12 +304,13 @@
   chrome_test_util::HistogramTester histogramTester;
 
   const GURL pageURL = self.testServer->GetURL(kLogoPagePath);
-  [ChromeEarlGrey loadURL:pageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLogoPageText]);
 
   LongPressElement(kLogoPageChromiumImageId);
   TapOnContextMenuButton(OpenImageButton());
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   // Verify that system touches were cancelled.
   histogramTester.ExpectTotalCount("ContextMenu.CancelSystemTouches", 1,
@@ -320,8 +327,9 @@
   // Load the destination page directly because it has a plain text message on
   // it.
   const GURL destinationURL = self.testServer->GetURL(kDestinationPageUrl);
-  [ChromeEarlGrey loadURL:destinationURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationPageText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:destinationURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationPageText]);
 
   LongPressElement(kDestinationPageTextId);
 
@@ -343,8 +351,9 @@
 // Tests cancelling the context menu.
 - (void)testDismissContextMenu {
   const GURL initialURL = self.testServer->GetURL(kInitialPageUrl);
-  [ChromeEarlGrey loadURL:initialURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kInitialPageDestinationLinkText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:initialURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:kInitialPageDestinationLinkText]);
 
   // Display the context menu twice.
   for (NSInteger i = 0; i < 2; i++) {
@@ -378,8 +387,9 @@
 // Checks that all the options are displayed in the context menu.
 - (void)testAppropriateContextMenu {
   const GURL initialURL = self.testServer->GetURL(kInitialPageUrl);
-  [ChromeEarlGrey loadURL:initialURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kInitialPageDestinationLinkText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:initialURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:kInitialPageDestinationLinkText]);
 
   LongPressElement(kInitialPageDestinationLinkId);
 
diff --git a/ios/chrome/browser/device_sharing/handoff_manager_egtest.mm b/ios/chrome/browser/device_sharing/handoff_manager_egtest.mm
index 8577156..7c79cf6 100644
--- a/ios/chrome/browser/device_sharing/handoff_manager_egtest.mm
+++ b/ios/chrome/browser/device_sharing/handoff_manager_egtest.mm
@@ -11,6 +11,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/web/public/test/http_server/http_server.h"
 #include "ios/web/public/test/http_server/http_server_util.h"
@@ -65,33 +66,33 @@
 - (void)testTypicalURL {
   const GURL destinationUrl = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/destination.html");
-  [ChromeEarlGrey loadURL:destinationUrl];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:destinationUrl]);
   AssertHandoffURL(destinationUrl);
 }
 
 // Tests Handoff URL for a new tab.
 - (void)testTypicalURLInNewTab {
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   const GURL destinationUrl = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/pony.html");
-  [ChromeEarlGrey loadURL:destinationUrl];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:destinationUrl]);
   AssertHandoffURL(destinationUrl);
 }
 
 // Tests that Handoff URL should never be set for an incognito tab.
 - (void)testTypicalURLInNewIncognitoTab {
   // Opens an incognito tab and loads a web page. Check that Handoff URL is nil.
-  [ChromeEarlGrey openNewIncognitoTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
   const GURL destinationUrl = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/destination.html");
-  [ChromeEarlGrey loadURL:destinationUrl];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:destinationUrl]);
   AssertHandoffURL(GURL());
 
   // Loads a second URL on the same incognito tab. Handoff URL should still be
   // nil.
   const GURL destinationUrl2 = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/pony.html");
-  [ChromeEarlGrey loadURL:destinationUrl2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:destinationUrl2]);
   AssertHandoffURL(GURL());
 }
 
@@ -106,11 +107,11 @@
       "http://ios/testing/data/http_server_files/chromium_logo_page.html");
 
   // Sets up the state for 3 tabs.
-  [ChromeEarlGrey loadURL:tab1URL];
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:tab2URL];
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:tab3URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:tab1URL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:tab2URL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:tab3URL]);
 
   // When tab 3 is closed, tab 2 is front and Handoff URL should be the URL for
   // tab 2.
@@ -133,16 +134,16 @@
       "http://ios/testing/data/http_server_files/chromium_logo_page.html");
 
   // Loads one page.
-  [ChromeEarlGrey loadURL:tab1URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:tab1URL]);
   // Loads page two in incognito and verifies that Handoff URL is nil.
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey loadURL:tab2URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:tab2URL]);
   AssertHandoffURL(GURL());
 
   // Loads page three in a new normal tab and verify that Handoff URL is not
   // nil.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:tab3URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:tab3URL]);
   AssertHandoffURL(tab3URL);
 }
 
diff --git a/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm b/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm
index 7088e97..037b513 100644
--- a/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm
+++ b/ios/chrome/browser/feature_engagement/feature_engagement_egtest.mm
@@ -25,6 +25,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
@@ -419,7 +420,8 @@
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start");
 
   // Load a URL with french text so that language detection is performed.
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kFrenchPageURLPath)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kFrenchPageURLPath)]);
 
   base::test::ScopedFeatureList scoped_feature_list;
   EnableBadgedTranslateManualTrigger(scoped_feature_list);
@@ -464,7 +466,7 @@
 
   // Navigate to a page other than the NTP to allow for the New Tab Tip to
   // appear.
-  [ChromeEarlGrey loadURL:GURL("chrome://version")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://version")]);
 
   // Open and close the tab switcher to trigger the New Tab tip.
   OpenAndCloseTabSwitcher();
diff --git a/ios/chrome/browser/main/BUILD.gn b/ios/chrome/browser/main/BUILD.gn
index 297d778..6677eab 100644
--- a/ios/chrome/browser/main/BUILD.gn
+++ b/ios/chrome/browser/main/BUILD.gn
@@ -7,6 +7,7 @@
     "browser.h",
     "browser_impl.h",
     "browser_impl.mm",
+    "browser_observer.h",
   ]
   deps = [
     "//base",
@@ -21,6 +22,8 @@
 source_set("test_support") {
   testonly = true
   sources = [
+    "fake_browser_observer.h",
+    "fake_browser_observer.mm",
     "test_browser.h",
     "test_browser.mm",
   ]
@@ -46,6 +49,7 @@
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/web_state_list",
+    "//ios/chrome/browser/web_state_list:test_support",
     "//ios/web/public/test",
     "//testing/gtest",
     "//third_party/ocmock",
diff --git a/ios/chrome/browser/main/browser.h b/ios/chrome/browser/main/browser.h
index e846213..0ba2b38 100644
--- a/ios/chrome/browser/main/browser.h
+++ b/ios/chrome/browser/main/browser.h
@@ -10,6 +10,7 @@
 #include "base/macros.h"
 #include "base/supports_user_data.h"
 
+class BrowserObserver;
 @class TabModel;
 class WebStateList;
 
@@ -39,6 +40,10 @@
   // Accessor for the WebStateList.
   virtual WebStateList* GetWebStateList() const = 0;
 
+  // Adds and removes observers.
+  virtual void AddObserver(BrowserObserver* observer) = 0;
+  virtual void RemoveObserver(BrowserObserver* observer) = 0;
+
  protected:
   Browser() {}
 
diff --git a/ios/chrome/browser/main/browser_impl.h b/ios/chrome/browser/main/browser_impl.h
index 1d17091e..1b9aaec 100644
--- a/ios/chrome/browser/main/browser_impl.h
+++ b/ios/chrome/browser/main/browser_impl.h
@@ -9,6 +9,7 @@
 
 #include "base/gtest_prod_util.h"
 #include "base/macros.h"
+#include "base/observer_list.h"
 
 @class TabModel;
 class WebStateList;
@@ -32,6 +33,8 @@
   ios::ChromeBrowserState* GetBrowserState() const override;
   TabModel* GetTabModel() const override;
   WebStateList* GetWebStateList() const override;
+  void AddObserver(BrowserObserver* observer) override;
+  void RemoveObserver(BrowserObserver* observer) override;
 
  private:
   // Exposed to allow unittests to pass in a mock TabModel.
@@ -41,6 +44,7 @@
   ios::ChromeBrowserState* browser_state_;
   __strong TabModel* tab_model_;
   WebStateList* web_state_list_;
+  base::ObserverList<BrowserObserver, /* check_empty= */ true> observers_;
 
   DISALLOW_COPY_AND_ASSIGN(BrowserImpl);
 };
diff --git a/ios/chrome/browser/main/browser_impl.mm b/ios/chrome/browser/main/browser_impl.mm
index 3f0eded3..c729d96 100644
--- a/ios/chrome/browser/main/browser_impl.mm
+++ b/ios/chrome/browser/main/browser_impl.mm
@@ -7,6 +7,7 @@
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#import "ios/chrome/browser/main/browser_observer.h"
 #import "ios/chrome/browser/sessions/session_service_ios.h"
 #import "ios/chrome/browser/tabs/tab_model.h"
 
@@ -31,7 +32,11 @@
   web_state_list_ = tab_model_.webStateList;
 }
 
-BrowserImpl::~BrowserImpl() = default;
+BrowserImpl::~BrowserImpl() {
+  for (auto& observer : observers_) {
+    observer.BrowserDestroyed(this);
+  }
+}
 
 ios::ChromeBrowserState* BrowserImpl::GetBrowserState() const {
   return browser_state_;
@@ -45,6 +50,14 @@
   return web_state_list_;
 }
 
+void BrowserImpl::AddObserver(BrowserObserver* observer) {
+  observers_.AddObserver(observer);
+}
+
+void BrowserImpl::RemoveObserver(BrowserObserver* observer) {
+  observers_.RemoveObserver(observer);
+}
+
 // static
 std::unique_ptr<Browser> Browser::Create(
     ios::ChromeBrowserState* browser_state) {
diff --git a/ios/chrome/browser/main/browser_impl_unittest.mm b/ios/chrome/browser/main/browser_impl_unittest.mm
index 2508e26b..1e0e068 100644
--- a/ios/chrome/browser/main/browser_impl_unittest.mm
+++ b/ios/chrome/browser/main/browser_impl_unittest.mm
@@ -4,14 +4,11 @@
 
 #import "ios/chrome/browser/main/browser_impl.h"
 
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
 #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#import "ios/chrome/browser/main/fake_browser_observer.h"
 #import "ios/chrome/browser/tabs/tab_model.h"
+#import "ios/chrome/browser/web_state_list/fake_web_state_list_delegate.h"
 #include "ios/chrome/browser/web_state_list/web_state_list.h"
-#include "ios/chrome/browser/web_state_list/web_state_list_delegate.h"
 #include "ios/web/public/test/test_web_thread_bundle.h"
 #include "testing/platform_test.h"
 #import "third_party/ocmock/OCMock/OCMock.h"
@@ -20,21 +17,9 @@
 #error "This file requires ARC support."
 #endif
 
-namespace {
-
-class TestWebStateListDelegate : public WebStateListDelegate {
- public:
-  ~TestWebStateListDelegate() override {}
-  void WillAddWebState(web::WebState* web_state) override {}
-  void WebStateDetached(web::WebState* web_state) override {}
-};
-
-}  // namespace
-
 class BrowserImplTest : public PlatformTest {
  protected:
-  BrowserImplTest()
-      : web_state_list_delegate_(), web_state_list_(&web_state_list_delegate_) {
+  BrowserImplTest() : web_state_list_(&web_state_list_delegate_) {
     TestChromeBrowserState::Builder test_cbs_builder;
     chrome_browser_state_ = test_cbs_builder.Build();
 
@@ -45,11 +30,12 @@
   web::TestWebThreadBundle thread_bundle_;
   std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
 
-  TestWebStateListDelegate web_state_list_delegate_;
+  FakeWebStateListDelegate web_state_list_delegate_;
   WebStateList web_state_list_;
   id tab_model_;
 };
 
+// Tests that the accessors return the expected values.
 TEST_F(BrowserImplTest, TestAccessors) {
   BrowserImpl browser(chrome_browser_state_.get(), tab_model_);
 
@@ -57,3 +43,17 @@
   EXPECT_EQ(tab_model_, browser.GetTabModel());
   EXPECT_EQ(&web_state_list_, browser.GetWebStateList());
 }
+
+// Tests that the BrowserDestroyed() callback is sent when a browser is deleted.
+TEST_F(BrowserImplTest, BrowserDestroyed) {
+  std::unique_ptr<Browser> browser =
+      std::make_unique<BrowserImpl>(chrome_browser_state_.get());
+  FakeBrowserObserver observer(browser.get());
+  // Simulate shut down order from BrowserViewWrangler, where the TabModel's
+  // |-browserStateDestroyed| is expected to be executed before the
+  // TabModelList's destructor.
+  // TODO(crbug.com/783777): Remove when TabModel is no longer used.
+  [browser->GetTabModel() browserStateDestroyed];
+  browser = nullptr;
+  EXPECT_TRUE(observer.browser_destroyed());
+}
diff --git a/ios/chrome/browser/main/browser_observer.h b/ios/chrome/browser/main/browser_observer.h
new file mode 100644
index 0000000..79ccfd5
--- /dev/null
+++ b/ios/chrome/browser/main/browser_observer.h
@@ -0,0 +1,27 @@
+// Copyright 2019 The Chromium 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_MAIN_BROWSER_OBSERVER_H_
+#define IOS_CHROME_BROWSER_MAIN_BROWSER_OBSERVER_H_
+
+#include "base/macros.h"
+#include "base/observer_list_types.h"
+
+class Browser;
+
+// Observer interface for objects interested in Browser events.
+class BrowserObserver : public base::CheckedObserver {
+ public:
+  // Invoked when the Browser is being destroyed. Gives subclasses a chance
+  // to cleanup.
+  virtual void BrowserDestroyed(Browser* browser) {}
+
+ protected:
+  BrowserObserver() = default;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(BrowserObserver);
+};
+
+#endif  // IOS_CHROME_BROWSER_MAIN_BROWSER_OBSERVER_H_
diff --git a/ios/chrome/browser/main/fake_browser_observer.h b/ios/chrome/browser/main/fake_browser_observer.h
new file mode 100644
index 0000000..f35fc6d
--- /dev/null
+++ b/ios/chrome/browser/main/fake_browser_observer.h
@@ -0,0 +1,30 @@
+// Copyright 2019 The Chromium 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_MAIN_FAKE_BROWSER_OBSERVER_H_
+#define IOS_CHROME_BROWSER_MAIN_FAKE_BROWSER_OBSERVER_H_
+
+#import "ios/chrome/browser/main/browser_observer.h"
+
+class Browser;
+
+// Fake browser observer.
+class FakeBrowserObserver : public BrowserObserver {
+ public:
+  // Constructor for a fake observer that observes |browser| upon construction
+  // until the BrowserDestroyed() signal is received.
+  explicit FakeBrowserObserver(Browser* browser);
+  ~FakeBrowserObserver() override;
+
+  // Whether the BrowserDestroyed() signal has been received.
+  bool browser_destroyed() const { return browser_destroyed_; }
+
+  // BrowserObserver:
+  void BrowserDestroyed(Browser* browser) override;
+
+ private:
+  bool browser_destroyed_ = false;
+};
+
+#endif  // IOS_CHROME_BROWSER_MAIN_FAKE_BROWSER_OBSERVER_H_
diff --git a/ios/chrome/browser/main/fake_browser_observer.mm b/ios/chrome/browser/main/fake_browser_observer.mm
new file mode 100644
index 0000000..5a0545bb
--- /dev/null
+++ b/ios/chrome/browser/main/fake_browser_observer.mm
@@ -0,0 +1,24 @@
+// Copyright 2019 The Chromium 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/main/fake_browser_observer.h"
+
+#include "base/logging.h"
+#import "ios/chrome/browser/main/browser.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+FakeBrowserObserver::FakeBrowserObserver(Browser* browser) {
+  DCHECK(browser);
+  browser->AddObserver(this);
+}
+
+FakeBrowserObserver::~FakeBrowserObserver() = default;
+
+void FakeBrowserObserver::BrowserDestroyed(Browser* browser) {
+  browser->RemoveObserver(this);
+  browser_destroyed_ = true;
+}
diff --git a/ios/chrome/browser/main/test_browser.h b/ios/chrome/browser/main/test_browser.h
index 17357f31..10a45f9 100644
--- a/ios/chrome/browser/main/test_browser.h
+++ b/ios/chrome/browser/main/test_browser.h
@@ -8,6 +8,7 @@
 #include "ios/chrome/browser/main/browser.h"
 
 #include "base/macros.h"
+#include "base/observer_list.h"
 
 class TestBrowser : public Browser {
  public:
@@ -26,11 +27,14 @@
   ios::ChromeBrowserState* GetBrowserState() const override;
   TabModel* GetTabModel() const override;
   WebStateList* GetWebStateList() const override;
+  void AddObserver(BrowserObserver* observer) override;
+  void RemoveObserver(BrowserObserver* observer) override;
 
  private:
   ios::ChromeBrowserState* browser_state_ = nullptr;
   TabModel* tab_model_ = nil;
   WebStateList* web_state_list_ = nullptr;
+  base::ObserverList<BrowserObserver, /* check_empty= */ true> observers_;
 
   DISALLOW_COPY_AND_ASSIGN(TestBrowser);
 };
diff --git a/ios/chrome/browser/main/test_browser.mm b/ios/chrome/browser/main/test_browser.mm
index 00de6f2..1762004 100644
--- a/ios/chrome/browser/main/test_browser.mm
+++ b/ios/chrome/browser/main/test_browser.mm
@@ -4,6 +4,7 @@
 
 #import "ios/chrome/browser/main/test_browser.h"
 
+#include "ios/chrome/browser/main/browser_observer.h"
 #import "ios/chrome/browser/tabs/tab_model.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -33,3 +34,11 @@
 WebStateList* TestBrowser::GetWebStateList() const {
   return web_state_list_;
 }
+
+void TestBrowser::AddObserver(BrowserObserver* observer) {
+  observers_.AddObserver(observer);
+}
+
+void TestBrowser::RemoveObserver(BrowserObserver* observer) {
+  observers_.RemoveObserver(observer);
+}
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
index 712a6e2..db28015 100644
--- a/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
+++ b/ios/chrome/browser/metrics/tab_usage_recorder_egtest.mm
@@ -87,10 +87,11 @@
 // page.
 void NewMainTabWithURL(const GURL& url, const std::string& word) {
   int number_of_tabs = chrome_test_util::GetMainTabCount();
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:url];
-  [ChromeEarlGrey waitForWebViewContainingText:word];
-  [ChromeEarlGrey waitForMainTabCount:(number_of_tabs + 1)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:url]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForWebViewContainingText:word]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForMainTabCount:(number_of_tabs + 1)]);
 }
 
 // Opens 2 new tabs with different URLs.
@@ -140,7 +141,7 @@
 
   // Open two tabs with urls.
   OpenTwoTabs();
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   // Switch between the two tabs.  Both are currently in memory.
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
@@ -159,7 +160,8 @@
   // Switch back to the normal tabs. Should be on tab one.
   CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode());
 
-  [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
 
   histogramTester.ExpectTotalCount(kSelectedTabHistogramName, 2, failureBlock);
   histogramTester.ExpectBucketCount(kSelectedTabHistogramName,
@@ -183,10 +185,11 @@
 
   // Open three tabs with http:// urls.
   for (NSUInteger i = 0; i < numberOfTabs; i++) {
-    [ChromeEarlGrey openNewTab];
-    [ChromeEarlGrey loadURL:url1];
-    [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord];
-    [ChromeEarlGrey waitForMainTabCount:(i + 1)];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:url1]);
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:(i + 1)]);
   }
 
   // Switch between the tabs. They are currently in memory.
@@ -213,20 +216,22 @@
                                                             }),
                @"JavaScript to reload each tab did not finish");
     [ChromeEarlGreyUI reload];
-    [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord];
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
   }
 
   // Evict the tab. Create a dummy tab so that switching back to normal mode
   // does not trigger a reload immediately.
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs());
-  [ChromeEarlGrey waitForIncognitoTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]);
 
   // Switch back to the normal tabs. Should be on tab one.
   CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode());
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
-  [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
 
   // Verify that one page-load count has been recorded. It should contain two
   // page loads for each tab created.
@@ -252,7 +257,7 @@
 
   // Open two tabs with urls.
   OpenTwoTabs();
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   // Set the normal tabs as 'cold start' tabs.
   GREYAssertTrue(chrome_test_util::SetCurrentTabsToBeColdStartTabs(),
                  @"Fail to state tabs as cold start tabs");
@@ -261,16 +266,18 @@
   CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs());
   CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs());
 
-  [ChromeEarlGrey waitForIncognitoTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:2]);
 
   // Switch back to the normal tabs.
   CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode());
 
-  [ChromeEarlGrey waitForWebViewContainingText:kURL2FirstWord];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kURL2FirstWord]);
 
   // Select the other one so it also reloads.
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
-  [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
   FailureBlock failureBlock = ^(NSString* error) {
     GREYFail(error);
   };
@@ -286,7 +293,8 @@
   chrome_test_util::SelectTabAtIndexInCurrentMode(1);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
-  [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
   histogramTester.ExpectBucketCount(kSelectedTabHistogramName,
                                     TabUsageRecorder::EVICTED_DUE_TO_COLD_START,
                                     1, failureBlock);
@@ -307,7 +315,7 @@
 
   // Open two tabs with urls.
   OpenTwoTabs();
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Simulate going into the background.
   GREYAssertTrue(chrome_test_util::SimulateTabsBackgrounding(),
@@ -322,7 +330,8 @@
   // Switch back to the normal tabs.
   CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode());
 
-  [ChromeEarlGrey waitForWebViewContainingText:kURL2FirstWord];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kURL2FirstWord]);
 
   const GURL url1 = web::test::HttpServer::MakeUrl(kTestUrl1);
   const GURL url2 = web::test::HttpServer::MakeUrl(kTestUrl2);
@@ -332,7 +341,8 @@
   histogramTester.ExpectTotalCount(kEvictedTabReloadTime, 1, failureBlock);
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
-  [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::OmniboxText(url1.GetContent())]
       assertWithMatcher:grey_notNil()];
@@ -355,8 +365,9 @@
   CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs());
   CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode());
 
-  [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kURL1FirstWord]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   histogramTester.ExpectUniqueSample(kEvictedTabReloadSuccessRate,
                                      TabUsageRecorder::LOAD_SUCCESS, 1,
@@ -383,8 +394,8 @@
   };
 
   // A blank tab needed to switch to it after reloading.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   chrome_test_util::LoadUrl(slowURL);
   CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs());
 
@@ -463,7 +474,7 @@
                  grey_sufficientlyVisible(), nil);
   Wait(toolMenuMatcher, @"Tool Menu");
 
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   [[GREYConfiguration sharedInstance]
           setValue:@(YES)
       forConfigKey:kGREYConfigKeySynchronizationEnabled];
@@ -495,7 +506,8 @@
   [ChromeEarlGreyUI tapSettingsMenuButton:SettingsMenuPrivacyButton()];
   [[EarlGrey selectElementWithMatcher:SettingsDoneButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:responses[slowURL]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:responses[slowURL]]);
 
   histogramTester.ExpectBucketCount(kDidUserWaitForEvictedTabReload,
                                     TabUsageRecorder::USER_DID_NOT_WAIT, 0,
@@ -515,7 +527,7 @@
   web::test::SetUpHttpServer(std::make_unique<HtmlResponseProvider>(responses));
 
   chrome_test_util::HistogramTester histogramTester;
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   chrome_test_util::LoadUrl(slowURL);
 
   CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs());
@@ -569,7 +581,7 @@
   chrome_test_util::HistogramTester histogramTester;
 
   // We need two tabs to be able to switch.
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   [[GREYConfiguration sharedInstance]
           setValue:@(NO)
       forConfigKey:kGREYConfigKeySynchronizationEnabled];
@@ -607,12 +619,13 @@
       assertWithMatcher:grey_notNil()];
 
   NSUInteger tabIndex = chrome_test_util::GetMainTabCount() - 1;
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs());
   CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode());
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(tabIndex);
-  [ChromeEarlGrey waitForWebViewContainingText:"arrived"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"arrived"]);
 
   FailureBlock failureBlock = ^(NSString* error) {
     GREYFail(error);
@@ -653,14 +666,16 @@
   GREYAssert(chrome_test_util::TapWebViewElementWithId("link"),
              @"Failed to tap \"link\"");
 
-  [ChromeEarlGrey waitForWebViewContainingText:"Whee"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Whee"]);
   NSUInteger tabIndex = chrome_test_util::GetMainTabCount() - 1;
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   CHROME_EG_ASSERT_NO_ERROR(OpenNewIncognitoTabUsingUIAndEvictMainTabs());
   CHROME_EG_ASSERT_NO_ERROR(SwitchToNormalMode());
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(tabIndex);
-  [ChromeEarlGrey waitForWebViewContainingText:"Whee"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Whee"]);
 
   // Verify that the page-load count has been recorded.  It should contain a
   // sum of 2 - one sample with 2 page loads.
@@ -713,12 +728,14 @@
 
   [[EarlGrey selectElementWithMatcher:OpenLinkInNewTabButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForMainTabCount:(numberOfTabs + 1)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForMainTabCount:(numberOfTabs + 1)]);
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(numberOfTabs);
 
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-  [ChromeEarlGrey waitForWebViewContainingText:"Whee"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Whee"]);
 
   FailureBlock failureBlock = ^(NSString* error) {
     GREYFail(error);
@@ -734,7 +751,7 @@
   chrome_test_util::HistogramTester histogramTester;
   ResetTabUsageRecorder();
 
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   GURL url(kTestUrl1);
 
   chrome_test_util::OpenChromeFromExternalApp(url);
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder_test_util.mm b/ios/chrome/browser/metrics/tab_usage_recorder_test_util.mm
index 038bc1e0..08d20d6 100644
--- a/ios/chrome/browser/metrics/tab_usage_recorder_test_util.mm
+++ b/ios/chrome/browser/metrics/tab_usage_recorder_test_util.mm
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "ios/chrome/browser/metrics/tab_usage_recorder_test_util.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 
 #import <EarlGrey/EarlGrey.h>
 #import <Foundation/Foundation.h>
@@ -65,7 +66,8 @@
       grey_accessibilityID(kToolsMenuNewIncognitoTabId);
   [[EarlGrey selectElementWithMatcher:new_incognito_tab_button_matcher]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForIncognitoTabCount:(nb_incognito_tab + 1)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForIncognitoTabCount:(nb_incognito_tab + 1)]);
   ConditionBlock condition = ^bool {
     return chrome_test_util::IsIncognitoMode();
   };
diff --git a/ios/chrome/browser/metrics/ukm_egtest.mm b/ios/chrome/browser/metrics/ukm_egtest.mm
index d2288d6..96309d2 100644
--- a/ios/chrome/browser/metrics/ukm_egtest.mm
+++ b/ios/chrome/browser/metrics/ukm_egtest.mm
@@ -145,20 +145,22 @@
 
 void OpenNewIncognitoTab() {
   NSUInteger incognito_tab_count = GetIncognitoTabCount();
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey waitForIncognitoTabCount:(incognito_tab_count + 1)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForIncognitoTabCount:(incognito_tab_count + 1)]);
   GREYAssert(IsIncognitoMode(), @"Failed to switch to incognito mode.");
 }
 
 void CloseCurrentIncognitoTab() {
   NSUInteger incognito_tab_count = GetIncognitoTabCount();
   [ChromeEarlGrey closeCurrentTab];
-  [ChromeEarlGrey waitForIncognitoTabCount:(incognito_tab_count - 1)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForIncognitoTabCount:(incognito_tab_count - 1)]);
 }
 
 void CloseAllIncognitoTabs() {
-  [ChromeEarlGrey closeAllIncognitoTabs];
-  [ChromeEarlGrey waitForIncognitoTabCount:0];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey closeAllIncognitoTabs]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:0]);
 
   // The user is dropped into the tab grid after closing the last incognito tab.
   // Therefore this test must manually switch back to showing the normal tabs.
@@ -172,8 +174,9 @@
 
 void OpenNewRegularTab() {
   NSUInteger tab_count = chrome_test_util::GetMainTabCount();
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey waitForMainTabCount:(tab_count + 1)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForMainTabCount:(tab_count + 1)]);
 }
 
 // Grant/revoke metrics consent and update MetricsServicesManager.
@@ -294,7 +297,7 @@
 - (void)testIncognitoPlusRegular {
   uint64_t original_client_id = metrics::UkmEGTestHelper::client_id();
   chrome_test_util::CloseAllTabs();
-  [ChromeEarlGrey waitForMainTabCount:(0)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:(0)]);
 
   OpenNewIncognitoTab();
   AssertUKMEnabled(false);
@@ -303,8 +306,8 @@
   OpenNewRegularTab();
   AssertUKMEnabled(false);
 
-  [ChromeEarlGrey closeAllIncognitoTabs];
-  [ChromeEarlGrey waitForIncognitoTabCount:0];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey closeAllIncognitoTabs]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:0]);
   AssertUKMEnabled(true);
 
   // Client ID should not have been reset.
diff --git a/ios/chrome/browser/net/cookies_egtest.mm b/ios/chrome/browser/net/cookies_egtest.mm
index ebbf929..475dfe0 100644
--- a/ios/chrome/browser/net/cookies_egtest.mm
+++ b/ios/chrome/browser/net/cookies_egtest.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/web/public/test/http_server/html_response_provider.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -76,8 +77,8 @@
 
 // Clear cookies to make sure that tests do not interfere each other.
 - (void)tearDown {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)]);
   NSString* const clearCookieScript =
       @"var cookies = document.cookie.split(';');"
        "for (var i = 0; i < cookies.length; i++) {"
@@ -101,8 +102,8 @@
 - (void)testClearIncognitoFromMain {
   // Loads a dummy page in normal tab. Sets a normal test cookie. Verifies that
   // the incognito test cookie is not found.
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalSetCookie)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalSetCookie)]);
   NSDictionary* cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(kNormalCookieValue, cookies[kNormalCookieName],
                          @"Failed to set normal cookie in normal mode.");
@@ -111,9 +112,9 @@
 
   // Opens an incognito tab, loads the dummy page, and sets incognito test
   // cookie.
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoSetCookie)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoSetCookie)]);
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(kIncognitoCookieValue, cookies[kIncognitoCookieName],
                          @"Failed to set incognito cookie in incognito mode.");
@@ -122,9 +123,9 @@
 
   // Switches back to normal profile by opening up a new tab. Test cookie
   // should not be found.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)]);
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(kNormalCookieValue, cookies[kNormalCookieName],
                          @"Normal cookie should still exist in normal mode.");
@@ -133,10 +134,10 @@
 
   // Finally, closes all incognito tabs while still in normal tab.
   // Checks that incognito cookie is gone.
-  [ChromeEarlGrey closeAllIncognitoTabs];
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoBrowsing)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey closeAllIncognitoTabs]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoBrowsing)]);
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqual(0U, cookies.count,
                   @"Incognito cookie should be gone from normal mode.");
@@ -147,13 +148,13 @@
 // not reappear.
 - (void)testClearIncognitoFromIncognito {
   // Loads a page in normal tab.
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)]);
 
   // Opens an incognito tab, loads a page, and sets an incognito cookie.
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoSetCookie)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoSetCookie)]);
   NSDictionary* cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(kIncognitoCookieValue, cookies[kIncognitoCookieName],
                          @"Failed to set incognito cookie in incognito mode.");
@@ -161,23 +162,23 @@
                   @"Only one cookie should be found in incognito mode.");
 
   // Closes all incognito tabs and switch back to a normal tab.
-  [ChromeEarlGrey closeAllIncognitoTabs];
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey closeAllIncognitoTabs]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)]);
 
   // Opens a new incognito tab and verify that the previously set cookie
   // is no longer there.
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoBrowsing)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoBrowsing)]);
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqual(0U, cookies.count,
                   @"Incognito cookie should be gone from incognito mode.");
 
   // Verifies that new incognito cookies can be set.
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoSetCookie)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoSetCookie)]);
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(kIncognitoCookieValue, cookies[kIncognitoCookieName],
                          @"Failed to set incognito cookie in incognito mode.");
@@ -188,8 +189,8 @@
 // Tests that a cookie set in normal tab is not available in an incognito tab.
 - (void)testSwitchToIncognito {
   // Sets cookie in normal tab.
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalSetCookie)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalSetCookie)]);
   NSDictionary* cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(kNormalCookieValue, cookies[kNormalCookieName],
                          @"Normal cookie should still exist in normal mode.");
@@ -197,19 +198,19 @@
                   @"Only one cookie should be found in normal mode.");
 
   // Switches to a new incognito tab and verifies that cookie is not there.
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoBrowsing)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoBrowsing)]);
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqual(0U, cookies.count,
                   @"Normal cookie should not be found in incognito mode.");
 
   // Closes all incognito tabs and then switching back to a normal tab. Verifies
   // that the cookie set earlier is still there.
-  [ChromeEarlGrey closeAllIncognitoTabs];
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey closeAllIncognitoTabs]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)]);
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(
       kNormalCookieValue, cookies[kNormalCookieName],
@@ -223,11 +224,11 @@
 - (void)testSwitchToMain {
   // Loads a page in normal tab and then switches to a new incognito tab. Sets
   // cookie in incognito tab.
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)];
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoSetCookie)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoSetCookie)]);
   NSDictionary* cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(kIncognitoCookieValue, cookies[kIncognitoCookieName],
                          @"Failed to set incognito cookie in incognito mode.");
@@ -236,17 +237,17 @@
 
   // Switches back to a normal tab and verifies that cookie set in incognito tab
   // is not available.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)]);
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqual(0U, cookies.count,
                   @"Incognito cookie should not be found in normal mode.");
 
   // Returns back to Incognito tab and cookie is still there.
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoBrowsing)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlIncognitoBrowsing)]);
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(
       kIncognitoCookieValue, cookies[kIncognitoCookieName],
@@ -258,8 +259,8 @@
 // Tests that a cookie set in a normal tab can be found in another normal tab.
 - (void)testShareCookiesBetweenTabs {
   // Loads page and sets cookie in first normal tab.
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalSetCookie)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalSetCookie)]);
   NSDictionary* cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(kNormalCookieValue, cookies[kNormalCookieName],
                          @"Failed to set normal cookie in normal mode.");
@@ -267,9 +268,9 @@
                   @"Only one cookie should be found in normal mode.");
 
   // Creates another normal tab and verifies that the cookie is also there.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kTestUrlNormalBrowsing)]);
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(
       kNormalCookieValue, cookies[kNormalCookieName],
diff --git a/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
index 9875f9a..0ef11ec 100644
--- a/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
+++ b/ios/chrome/browser/ntp_tiles/ntp_tiles_egtest.mm
@@ -9,6 +9,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/html_response_provider.h"
@@ -54,19 +55,19 @@
   GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
                  @"Clearing Browsing History timed out");
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 
   [[EarlGrey selectElementWithMatcher:
                  chrome_test_util::StaticTextWithAccessibilityLabel(@"title1")]
       assertWithMatcher:grey_nil()];
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   // After loading URL, need to do another action before opening a new tab
   // with the icon present.
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 
   [[EarlGrey selectElementWithMatcher:
                  chrome_test_util::StaticTextWithAccessibilityLabel(@"title1")]
@@ -100,19 +101,20 @@
   GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
                  @"Clearing Browsing History timed out");
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   [[EarlGrey selectElementWithMatcher:
                  chrome_test_util::StaticTextWithAccessibilityLabel(@"title2")]
       assertWithMatcher:grey_nil()];
 
   // Load first URL and expect redirect to destination URL.
-  [ChromeEarlGrey loadURL:firstRedirectURL];
-  [ChromeEarlGrey waitForWebViewContainingText:"redirect complete"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:firstRedirectURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"redirect complete"]);
 
   // After loading URL, need to do another action before opening a new tab
   // with the icon present.
-  [ChromeEarlGrey goBack];
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 
   // Which of the two tiles that is displayed is an implementation detail, and
   // this test helps document it. The purpose of the test is to verify that only
diff --git a/ios/chrome/browser/passwords/BUILD.gn b/ios/chrome/browser/passwords/BUILD.gn
index 65bc0955..be41cf8 100644
--- a/ios/chrome/browser/passwords/BUILD.gn
+++ b/ios/chrome/browser/passwords/BUILD.gn
@@ -17,8 +17,6 @@
     "ios_chrome_password_manager_driver.mm",
     "ios_chrome_password_store_factory.cc",
     "ios_chrome_password_store_factory.h",
-    "ios_chrome_save_password_infobar_delegate.h",
-    "ios_chrome_save_password_infobar_delegate.mm",
     "ios_chrome_update_password_infobar_delegate.h",
     "ios_chrome_update_password_infobar_delegate.mm",
     "ios_password_infobar_controller.h",
@@ -42,7 +40,7 @@
     "update_password_infobar_controller.mm",
   ]
   deps = [
-    ":public",
+    ":infobar_delegates",
     "//base",
     "//base:i18n",
     "//components/autofill/core/browser",
@@ -101,18 +99,22 @@
   allow_circular_includes_from = [ ":passwords_generation_utils" ]
 }
 
-source_set("public") {
+source_set("infobar_delegates") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
     "ios_chrome_password_manager_infobar_delegate.h",
     "ios_chrome_password_manager_infobar_delegate.mm",
+    "ios_chrome_save_password_infobar_delegate.h",
+    "ios_chrome_save_password_infobar_delegate.mm",
   ]
   deps = [
     "//base",
     "//components/infobars/core",
     "//components/password_manager/core/browser",
+    "//components/strings",
     "//ios/chrome/app/strings",
     "//ios/chrome/app/theme",
+    "//ios/chrome/browser/ui/infobars:feature_flags",
     "//ui/base",
   ]
 }
diff --git a/ios/chrome/browser/passwords/credential_manager_egtest.mm b/ios/chrome/browser/passwords/credential_manager_egtest.mm
index e2ed302..af2909e 100644
--- a/ios/chrome/browser/passwords/credential_manager_egtest.mm
+++ b/ios/chrome/browser/passwords/credential_manager_egtest.mm
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #include "ios/chrome/browser/passwords/credential_manager.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 
 #import <EarlGrey/EarlGrey.h>
 #import <UIKit/UIKit.h>
@@ -99,8 +100,9 @@
 - (void)loadSimplePageAndStoreACredential {
   // Loads simple page. It is on localhost so it is considered a secure context.
   const GURL URL = self.testServer->GetURL("/example");
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:"You are here."];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"You are here."]);
 
   // Obtain a PasswordStore.
   scoped_refptr<password_manager::PasswordStore> passwordStore =
@@ -185,7 +187,7 @@
 
   // Open new tab.
   [ChromeEarlGreyUI openNewTab];
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Execute JavaScript from inactive tab.
   webState->ExecuteJavaScript(
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.h b/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.h
index b6d3ff81..461e93c 100644
--- a/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.h
+++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.h
@@ -43,6 +43,9 @@
   // The title for the InfobarModal being presented.
   virtual NSString* GetInfobarModalTitleText() const;
 
+  // Sets the dispatcher for this delegate.
+  void set_dispatcher(id<ApplicationCommands> dispatcher);
+
  protected:
   IOSChromePasswordManagerInfoBarDelegate(
       bool is_sync_user,
@@ -63,10 +66,6 @@
     return infobar_response_;
   }
 
-  void set_dispatcher(id<ApplicationCommands> dispatcher) {
-    dispatcher_ = dispatcher;
-  }
-
  private:
   // ConfirmInfoBarDelegate implementation.
   int GetIconId() const override;
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.mm
index 9c6d067..5cad56c 100644
--- a/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.mm
+++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_infobar_delegate.mm
@@ -66,6 +66,11 @@
   return @"";
 }
 
+void IOSChromePasswordManagerInfoBarDelegate::set_dispatcher(
+    id<ApplicationCommands> dispatcher) {
+  dispatcher_ = dispatcher;
+}
+
 int IOSChromePasswordManagerInfoBarDelegate::GetIconId() const {
   return IDR_IOS_INFOBAR_SAVE_PASSWORD;
 }
diff --git a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h
index 7fc68ae0e..6bae92e 100644
--- a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h
+++ b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h
@@ -16,10 +16,6 @@
 class PasswordFormManagerForUI;
 }
 
-namespace infobars {
-class InfoBarManager;
-}
-
 // After a successful *new* login attempt, Chrome passes the current
 // password_manager::PasswordFormManager and move it to a
 // IOSChromeSavePasswordInfoBarDelegate while the user makes up their mind
@@ -27,23 +23,15 @@
 class IOSChromeSavePasswordInfoBarDelegate
     : public IOSChromePasswordManagerInfoBarDelegate {
  public:
-  // Creates the infobar for |form_to_save| and adds it to |infobar_manager|.
-  // |is_sync_user| controls the footer string. |dispatcher| is not retained.
-  static void Create(
+  IOSChromeSavePasswordInfoBarDelegate(
       bool is_sync_user,
-      infobars::InfoBarManager* infobar_manager,
-      std::unique_ptr<password_manager::PasswordFormManagerForUI> form_to_save,
-      id<ApplicationCommands> dispatcher);
+      std::unique_ptr<password_manager::PasswordFormManagerForUI> form_to_save);
 
   ~IOSChromeSavePasswordInfoBarDelegate() override;
 
   bool ShouldExpire(const NavigationDetails& details) const override;
 
  private:
-  IOSChromeSavePasswordInfoBarDelegate(
-      bool is_sync_user,
-      std::unique_ptr<password_manager::PasswordFormManagerForUI> form_to_save);
-
   // ConfirmInfoBarDelegate implementation.
   infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override;
   base::string16 GetMessageText() const override;
diff --git a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm
index 1e689e9a..35946a5 100644
--- a/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm
+++ b/ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.mm
@@ -13,9 +13,6 @@
 #include "components/password_manager/core/browser/password_form_metrics_recorder.h"
 #include "components/password_manager/core/browser/password_manager_constants.h"
 #include "components/strings/grit/components_strings.h"
-#include "ios/chrome/browser/infobars/infobar.h"
-#import "ios/chrome/browser/passwords/ios_password_infobar_controller.h"
-#import "ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.h"
 #import "ios/chrome/browser/ui/infobars/infobar_feature.h"
 #include "ios/chrome/grit/ios_chromium_strings.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -27,38 +24,6 @@
 
 using password_manager::PasswordFormManagerForUI;
 
-// static
-void IOSChromeSavePasswordInfoBarDelegate::Create(
-    bool is_sync_user,
-    infobars::InfoBarManager* infobar_manager,
-    std::unique_ptr<PasswordFormManagerForUI> form_to_save,
-    id<ApplicationCommands> dispatcher) {
-  DCHECK(infobar_manager);
-  auto delegate = base::WrapUnique(new IOSChromeSavePasswordInfoBarDelegate(
-      is_sync_user, std::move(form_to_save)));
-  delegate->set_dispatcher(dispatcher);
-
-  if (IsInfobarUIRebootEnabled()) {
-    InfobarPasswordCoordinator* coordinator =
-        [[InfobarPasswordCoordinator alloc]
-            initWithInfoBarDelegate:delegate.get()];
-    infobar_manager->AddInfoBar(
-        std::make_unique<InfoBarIOS>(coordinator, std::move(delegate)));
-  } else {
-    IOSPasswordInfoBarController* controller =
-        [[IOSPasswordInfoBarController alloc]
-            initWithInfoBarDelegate:delegate.get()];
-    infobar_manager->AddInfoBar(
-        std::make_unique<InfoBarIOS>(controller, std::move(delegate)));
-  }
-}
-
-IOSChromeSavePasswordInfoBarDelegate::~IOSChromeSavePasswordInfoBarDelegate() {
-  password_manager::metrics_util::LogSaveUIDismissalReason(infobar_response());
-  form_to_save()->GetMetricsRecorder()->RecordUIDismissalReason(
-      infobar_response());
-}
-
 IOSChromeSavePasswordInfoBarDelegate::IOSChromeSavePasswordInfoBarDelegate(
     bool is_sync_user,
     std::unique_ptr<PasswordFormManagerForUI> form_manager)
@@ -69,6 +34,12 @@
       password_manager::metrics_util::AUTOMATIC_WITH_PASSWORD_PENDING);
 }
 
+IOSChromeSavePasswordInfoBarDelegate::~IOSChromeSavePasswordInfoBarDelegate() {
+  password_manager::metrics_util::LogSaveUIDismissalReason(infobar_response());
+  form_to_save()->GetMetricsRecorder()->RecordUIDismissalReason(
+      infobar_response());
+}
+
 infobars::InfoBarDelegate::InfoBarIdentifier
 IOSChromeSavePasswordInfoBarDelegate::GetIdentifier() const {
   return SAVE_PASSWORD_INFOBAR_DELEGATE_MOBILE;
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm
index 5c7a204..3ffd4d0 100644
--- a/ios/chrome/browser/passwords/password_controller.mm
+++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -42,17 +42,21 @@
 #include "components/strings/grit/components_strings.h"
 #include "components/sync/driver/sync_service.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+#include "ios/chrome/browser/infobars/infobar.h"
 #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #import "ios/chrome/browser/metrics/ukm_url_recorder.h"
 #include "ios/chrome/browser/passwords/credential_manager.h"
 #import "ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h"
 #import "ios/chrome/browser/passwords/ios_chrome_update_password_infobar_delegate.h"
+#import "ios/chrome/browser/passwords/ios_password_infobar_controller.h"
 #import "ios/chrome/browser/passwords/notify_auto_signin_view_controller.h"
 #import "ios/chrome/browser/passwords/password_form_filler.h"
 #include "ios/chrome/browser/passwords/password_manager_features.h"
 #include "ios/chrome/browser/sync/profile_sync_service_factory.h"
 #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
+#import "ios/chrome/browser/ui/infobars/coordinators/infobar_password_coordinator.h"
+#import "ios/chrome/browser/ui/infobars/infobar_feature.h"
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #include "ios/chrome/browser/web/tab_id_tab_helper.h"
 #include "ios/chrome/grit/ios_strings.h"
@@ -674,11 +678,26 @@
       InfoBarManagerImpl::FromWebState(_webState);
 
   switch (type) {
-    case PasswordInfoBarType::SAVE:
-      IOSChromeSavePasswordInfoBarDelegate::Create(
-          isSyncUser, infoBarManager, std::move(form), self.dispatcher);
-      break;
+    case PasswordInfoBarType::SAVE: {
+      auto delegate = std::make_unique<IOSChromeSavePasswordInfoBarDelegate>(
+          isSyncUser, std::move(form));
+      delegate->set_dispatcher(self.dispatcher);
 
+      if (IsInfobarUIRebootEnabled()) {
+        InfobarPasswordCoordinator* coordinator =
+            [[InfobarPasswordCoordinator alloc]
+                initWithInfoBarDelegate:delegate.get()];
+        infoBarManager->AddInfoBar(
+            std::make_unique<InfoBarIOS>(coordinator, std::move(delegate)));
+      } else {
+        IOSPasswordInfoBarController* controller =
+            [[IOSPasswordInfoBarController alloc]
+                initWithInfoBarDelegate:delegate.get()];
+        infoBarManager->AddInfoBar(
+            std::make_unique<InfoBarIOS>(controller, std::move(delegate)));
+      }
+      break;
+    }
     case PasswordInfoBarType::UPDATE:
       IOSChromeUpdatePasswordInfoBarDelegate::Create(
           isSyncUser, infoBarManager, std::move(form), self.baseViewController,
diff --git a/ios/chrome/browser/prerender/prerender_egtest.mm b/ios/chrome/browser/prerender/prerender_egtest.mm
index 84b81b4..3c9e443f 100644
--- a/ios/chrome/browser/prerender/prerender_egtest.mm
+++ b/ios/chrome/browser/prerender/prerender_egtest.mm
@@ -15,6 +15,7 @@
 #import "ios/chrome/test/app/history_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "net/test/embedded_test_server/http_request.h"
@@ -72,26 +73,28 @@
   NSString* pageString = base::SysUTF8ToNSString(pageURL.GetContent());
 
   // Go to the page a couple of time so it shows as suggestion.
-  [ChromeEarlGrey loadURL:pageURL];
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   [[self class] closeAllTabs];
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 
   [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()]
       performAction:grey_tap()];
-  [ChromeEarlGrey
-      waitForElementWithMatcherSufficientlyVisible:chrome_test_util::Omnibox()];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+                          chrome_test_util::Omnibox()]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
       performAction:grey_typeText([pageString stringByAppendingString:@"\n"])];
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
   [[self class] closeAllTabs];
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 
   // Type the begining of the address to have the autocomplete suggestion.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()]
       performAction:grey_tap()];
-  [ChromeEarlGrey
-      waitForElementWithMatcherSufficientlyVisible:chrome_test_util::Omnibox()];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+                          chrome_test_util::Omnibox()]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
       performAction:grey_typeText(
                         [pageString substringToIndex:[pageString length] - 6])];
diff --git a/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm b/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm
index f17e748..30320a4 100644
--- a/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm
+++ b/ios/chrome/browser/translate/legacy_translate_infobar_egtest.mm
@@ -31,6 +31,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/js_test_util.h"
@@ -322,7 +323,7 @@
   // A page with French text.
   responses[URL] = GetFrenchPageHtml(kHtmlAttribute, "");
   web::test::SetUpSimpleHttpServer(responses);
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   // Check that the "Before Translate" infobar is displayed.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabel(@"English")]
@@ -387,7 +388,7 @@
   }
 
   // Open a new webpage.
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   [self simulateTranslationFromSpanishToEnglish];
 
   // Check that the "Always Translate" switch is displayed in the infobar.
@@ -436,8 +437,8 @@
   }
 
   // Do a translation in incognito
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   [self simulateTranslationFromSpanishToEnglish];
   // Check that the infobar does not contain the "Always Translate" switch.
   NSString* switchLabel = GetTranslateInfobarSwitchLabel("Spanish");
@@ -472,17 +473,19 @@
   // Translate the page with the link.
   GURL frenchPageURL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPageWithLinkPath));
-  [ChromeEarlGrey loadURL:frenchPageURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:frenchPageURL]);
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
                                           IDS_TRANSLATE_INFOBAR_ACCEPT)]
       performAction:grey_tap()];
 
   // Check that the translation happened.
-  [ChromeEarlGrey waitForWebViewContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
 
   // Click on the link.
-  [ChromeEarlGrey tapWebViewElementWithID:@"link"];
-  [ChromeEarlGrey waitForWebViewNotContainingText:"link"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"link"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:"link"]);
 
   GURL frenchPagePathURL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
@@ -491,7 +494,8 @@
       assertWithMatcher:grey_notNil()];
 
   // Check that the auto-translation happened.
-  [ChromeEarlGrey waitForWebViewContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
 }
 
 #pragma mark - Utility methods
@@ -507,8 +511,9 @@
 
   // The infobar is presented with an animation. Wait for the "Done" button
   // to become visibile before considering the animation as complete.
-  [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
-                      ButtonWithAccessibilityLabelId(IDS_DONE)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+                          ButtonWithAccessibilityLabelId(IDS_DONE)]);
 
   // Assert that the infobar is visible.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(IDS_DONE)]
diff --git a/ios/chrome/browser/translate/translate_egtest.mm b/ios/chrome/browser/translate/translate_egtest.mm
index 125258e8..aaaec3f5 100644
--- a/ios/chrome/browser/translate/translate_egtest.mm
+++ b/ios/chrome/browser/translate/translate_egtest.mm
@@ -41,6 +41,7 @@
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/chrome/test/fakes/fake_language_detection_tab_helper_observer.h"
@@ -531,7 +532,7 @@
   expectedLanguageDetails.html_root_language = "de";
   expectedLanguageDetails.adopted_language = translate::kUnknownLanguageCode;
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   [self assertLanguageDetails:expectedLanguageDetails];
 }
 
@@ -545,7 +546,7 @@
       "<html><body style='display:none'>%s</body></html>", kFrenchText);
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   // Check for no language detected.
   translate::LanguageDetectionDetails expectedLanguageDetails;
   expectedLanguageDetails.adopted_language = translate::kUnknownLanguageCode;
@@ -565,7 +566,7 @@
       base::StringPrintf("http://%s", kFrenchPageNoTranslateValue));
 
   // Load some french page with |content="notranslate"| meta tag.
-  [ChromeEarlGrey loadURL:noTranslateContentURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:noTranslateContentURL]);
 
   // Check that no language has been detected.
   GREYAssert(
@@ -573,7 +574,7 @@
       @"A language has been detected");
 
   // Load some french page with |value="notranslate"| meta tag.
-  [ChromeEarlGrey loadURL:noTranslateValueURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:noTranslateValueURL]);
 
   // Check that no language has been detected.
   GREYAssert(
@@ -594,7 +595,7 @@
   responses[URL] = "<html><body>Blahrg :)</body></html>";
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   // Check for no language detected.
   translate::LanguageDetectionDetails expectedLanguageDetails;
   expectedLanguageDetails.adopted_language = "und";
@@ -633,7 +634,7 @@
   responses[URL] = html;
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   // Check that language has been detected.
   translate::LanguageDetectionDetails expectedLanguageDetails;
   expectedLanguageDetails.adopted_language = "fr";
@@ -654,7 +655,7 @@
   // The HTTP header is detected.
   GURL URL = web::test::HttpServer::MakeUrl(std::string("http://") +
                                             kLanguagePath + "?http=fr");
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   translate::LanguageDetectionDetails expectedLanguageDetails;
   expectedLanguageDetails.content_language = "fr";
   expectedLanguageDetails.adopted_language = "fr";
@@ -663,7 +664,7 @@
   // Everything after the comma is truncated.
   URL = web::test::HttpServer::MakeUrl(std::string("http://") + kLanguagePath +
                                        "?http=fr,ornot");
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   expectedLanguageDetails.content_language = "fr";
   expectedLanguageDetails.adopted_language = "fr";
   [self assertLanguageDetails:expectedLanguageDetails];
@@ -671,7 +672,7 @@
   // The HTTP header is overriden by meta tag.
   URL = web::test::HttpServer::MakeUrl(std::string("http://") + kLanguagePath +
                                        "?http=fr&meta=it");
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   expectedLanguageDetails.content_language = "it";
   expectedLanguageDetails.adopted_language = "it";
   [self assertLanguageDetails:expectedLanguageDetails];
@@ -679,7 +680,7 @@
   // Only the header of the main page is detected.
   URL =
       web::test::HttpServer::MakeUrl(std::string("http://") + kSubresourcePath);
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   expectedLanguageDetails.content_language = "fr";
   expectedLanguageDetails.adopted_language = "fr";
   [self assertLanguageDetails:expectedLanguageDetails];
@@ -694,9 +695,10 @@
   // Detection works when clicking on a link.
   GURL URL = web::test::HttpServer::MakeUrl(std::string("http://") + kLinkPath);
   GURL someLanguageURL = web::test::HttpServer::MakeUrl(kSomeLanguageUrl);
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   GREYAssert(TapWebViewElementWithId("click"), @"Failed to tap \"click\"");
-  [ChromeEarlGrey waitForWebViewContainingText:kLanguagePathText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLanguagePathText]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           someLanguageURL.GetContent())]
       assertWithMatcher:grey_notNil()];
@@ -725,7 +727,7 @@
       web::test::HttpServer::MakeUrl("http://languageDetectionLargePage");
   responses[URL] = html;
   web::test::SetUpSimpleHttpServer(responses);
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   // Check that language has been detected.
   translate::LanguageDetectionDetails expectedLanguageDetails;
@@ -749,7 +751,7 @@
       prefs::kOfferTranslateEnabled, NO);
 
   // Open some webpage.
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   // Check that no language has been detected.
   GREYAssert(
       !language_detection_tab_helper_observer_->GetLanguageDetectionDetails(),
@@ -775,7 +777,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -821,7 +823,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -854,7 +856,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self translateThenRevert];
 }
@@ -872,8 +874,8 @@
   // Stop observing the current IOSLanguageDetectionTabHelper before opening the
   // incognito tab.
   language_detection_tab_helper_observer_.reset();
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   // Needed for the incognito WebState.
   [self setUpMockScriptManager];
@@ -886,7 +888,8 @@
   [self assertTranslateInfobarIsVisible];
 
   // Make sure the page is not translated.
-  [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"]);
 
   // The source language tab must be selected and the target language tab must
   // not. Translate the page by tapping the target language tab.
@@ -896,7 +899,8 @@
       assertWithMatcher:ElementIsSelected(NO)] performAction:grey_tap()];
 
   // Make sure the page is translated.
-  [ChromeEarlGrey waitForWebViewContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
 
   // The target language tab must be selected and the source language tab must
   // not. Revert the translation by tapping the source language tab.
@@ -906,7 +910,8 @@
       assertWithMatcher:ElementIsSelected(NO)] performAction:grey_tap()];
 
   // Make sure the translation is reverted.
-  [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"]);
 
   // The source language tab must be selected and the target language tab must
   // not.
@@ -930,12 +935,13 @@
   // Load a page with French text and a link.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPageWithLinkPath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
   // Make sure the page is not translated.
-  [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"]);
 
   // The target language tab must not be selected. Translate the page by
   // tapping the target language tab.
@@ -943,10 +949,11 @@
       assertWithMatcher:ElementIsSelected(NO)] performAction:grey_tap()];
 
   // Make sure the page is translated.
-  [ChromeEarlGrey waitForWebViewContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
 
   // Click on the link.
-  [ChromeEarlGrey tapWebViewElementWithID:@"link"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"link"]);
 
   // Make sure the navigation is completed.
   GURL frenchPagePathURL = web::test::HttpServer::MakeUrl(
@@ -956,7 +963,8 @@
       assertWithMatcher:grey_notNil()];
 
   // Make sure the page is automatically translated.
-  [ChromeEarlGrey waitForWebViewContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
 }
 
 // Tests that the source and the target languages can be changed.
@@ -968,7 +976,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -1009,7 +1017,8 @@
       assertWithMatcher:grey_nil()];
 
   // Make sure the page is translated.
-  [ChromeEarlGrey waitForWebViewContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
 
   // Make sure the target language changes to "Dutch". The target language
   // tab must be selected and the source language tab must not. Revert the
@@ -1020,7 +1029,8 @@
       assertWithMatcher:ElementIsSelected(NO)] performAction:grey_tap()];
 
   // Make sure the translation is reverted.
-  [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"]);
 
   // Open the translate options menu.
   [[EarlGrey selectElementWithMatcher:OptionsButton()]
@@ -1044,7 +1054,8 @@
       onElementWithMatcher:LanguagesMenu()] performAction:grey_tap()];
 
   // Make sure the page is translated.
-  [ChromeEarlGrey waitForWebViewContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
 
   // Make sure the source language changes to "English". The target language
   // tab must be selected and the source language tab must not.
@@ -1064,7 +1075,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -1088,7 +1099,8 @@
       assertWithMatcher:grey_nil()];
 
   // Make sure the page is not translated yet.
-  [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:"Translated"]);
 
   // Make sure that French to English translation is not whitelisted yet.
   GREYAssert(!translatePrefs->IsLanguagePairWhitelisted("fr", "en"),
@@ -1103,7 +1115,8 @@
       performAction:grey_tap()];
 
   // Make sure the page is translated after the snackbar is dismissed.
-  [ChromeEarlGrey waitForWebViewContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
 
   // Make sure that French to English translation is whitelisted after the
   // snackbar is dismissed.
@@ -1111,12 +1124,13 @@
              @"French to English translation is not whitelisted");
 
   // Reload the page.
-  [ChromeEarlGrey reload];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
 
   [self assertTranslateInfobarIsVisible];
 
   // Make sure the page is translated.
-  [ChromeEarlGrey waitForWebViewContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
 
   // The target language tab must be selected and the source language tab must
   // not.
@@ -1171,7 +1185,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -1220,7 +1234,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -1278,7 +1292,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -1337,7 +1351,7 @@
              @"Translation from French is not blocked");
 
   // Reload the page.
-  [ChromeEarlGrey reload];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
 
   // Make sure the translate infobar does not appear.
   GREYAssertFalse([self waitForElementToAppearOrTimeout:TranslateInfobar()],
@@ -1354,7 +1368,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -1370,7 +1384,7 @@
   for (int i = 0;
        i < translate::TranslateInfoBarDelegate::GetAutoNeverThreshold(); i++) {
     // Reload the page.
-    [ChromeEarlGrey reload];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
 
     [self assertTranslateInfobarIsVisible];
 
@@ -1413,7 +1427,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -1434,7 +1448,7 @@
          j < translate::TranslateInfoBarDelegate::GetAutoNeverThreshold();
          j++) {
       // Reload the page.
-      [ChromeEarlGrey reload];
+      CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
 
       [self assertTranslateInfobarIsVisible];
 
@@ -1455,7 +1469,7 @@
   for (int i = 0;
        i < translate::TranslateInfoBarDelegate::GetAutoNeverThreshold(); i++) {
     // Reload the page.
-    [ChromeEarlGrey reload];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
 
     [self assertTranslateInfobarIsVisible];
 
@@ -1483,7 +1497,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -1541,7 +1555,7 @@
              @"Translate infobar failed to disappear.");
 
   // Reload the page.
-  [ChromeEarlGrey reload];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
 
   // Make sure the translate infobar does not appear.
   GREYAssertFalse([self waitForElementToAppearOrTimeout:TranslateInfobar()],
@@ -1562,7 +1576,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -1607,7 +1621,8 @@
       assertWithMatcher:ElementIsSelected(NO)];
 
   // Make sure the page is translated.
-  [ChromeEarlGrey waitForWebViewContainingText:"Translated"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Translated"]);
 
   // Dismiss the translate infobar.
   [[EarlGrey selectElementWithMatcher:CloseButton()] performAction:grey_tap()];
@@ -1645,7 +1660,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -1669,7 +1684,7 @@
              @"Translate infobar failed to disappear.");
 
   // Reload the page.
-  [ChromeEarlGrey reload];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
 
   // Make sure the translate infobar does not appear.
   GREYAssertFalse([self waitForElementToAppearOrTimeout:TranslateInfobar()],
@@ -1698,7 +1713,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
@@ -1721,7 +1736,7 @@
              @"Translate infobar failed to disappear.");
 
   // Reload the page.
-  [ChromeEarlGrey reload];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
 
   // Make sure the translate infobar does not appear.
   GREYAssertFalse([self waitForElementToAppearOrTimeout:TranslateInfobar()],
@@ -1749,7 +1764,7 @@
   // Load a page with French text with |content="notranslate"| meta tag.
   GURL noTranslateContentURL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPageNoTranslateContent));
-  [ChromeEarlGrey loadURL:noTranslateContentURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:noTranslateContentURL]);
 
   // Make sure no language has been detected.
   GREYAssert(
@@ -1769,7 +1784,7 @@
   // Load a page with French text with |value="notranslate"| meta tag.
   GURL noTranslateValueURL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPageNoTranslateValue));
-  [ChromeEarlGrey loadURL:noTranslateValueURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:noTranslateValueURL]);
 
   // Make sure no language has been detected.
   GREYAssert(
@@ -1788,7 +1803,7 @@
 
   // Load a chrome:// page.
   GURL URL = web::test::HttpServer::MakeUrl("chrome://something-internal");
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   // Make sure the Translate manual trigger button is not enabled.
   [ChromeEarlGreyUI openToolsMenu];
@@ -1813,7 +1828,7 @@
   // Load a page with French text.
   GURL URL = web::test::HttpServer::MakeUrl(
       base::StringPrintf("http://%s", kFrenchPagePath));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self assertTranslateInfobarIsVisible];
 
diff --git a/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm b/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm
index 2cb9054..19cebf5 100644
--- a/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm
+++ b/ios/chrome/browser/ui/activity_services/activity_service_controller_egtest.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
@@ -89,7 +90,8 @@
   web::test::SetUpHttpServer(std::move(provider));
 
   // Open a page with an error.
-  [ChromeEarlGrey loadURL:ErrorPageResponseProvider::GetDnsFailureUrl()];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:ErrorPageResponseProvider::GetDnsFailureUrl()]);
 
   // Verify that you can share, but that the Print action is not available.
   [ChromeEarlGreyUI openShareMenu];
@@ -113,7 +115,7 @@
 - (void)testActivityServiceControllerIsDisabled {
   // Open an un-shareable page.
   GURL kURL("chrome://version");
-  [ChromeEarlGrey loadURL:kURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:kURL]);
   // Verify that the share button is disabled.
   id<GREYMatcher> share_button = chrome_test_util::ShareButton();
   [[EarlGrey selectElementWithMatcher:share_button]
@@ -133,7 +135,7 @@
   web::test::SetUpSimpleHttpServer(responses);
 
   // Open page and open the share menu.
-  [ChromeEarlGrey loadURL:url];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:url]);
   [ChromeEarlGreyUI openShareMenu];
 
   // Verify that the share menu is up and contains a Copy action.
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm
index 8bc1850..2f71fe0f 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/card_view_controller_egtest.mm
@@ -24,6 +24,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
@@ -140,8 +141,9 @@
 
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
   const GURL URL = self.testServer->GetURL(kFormHTMLFile);
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:"hello!"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"hello!"]);
 
   _personalDataManager =
       autofill::PersonalDataManagerFactory::GetForBrowserState(
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm
index 785ec48..9b638484 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_coordinator_egtest.mm
@@ -25,6 +25,7 @@
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
@@ -320,8 +321,9 @@
   _personalDataManager->SetSyncingForTest(true);
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
   const GURL URL = self.testServer->GetURL(kFormHTMLFile);
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:"Profile form"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Profile form"]);
 }
 
 - (void)tearDown {
@@ -580,11 +582,12 @@
       assertWithMatcher:grey_sufficientlyVisible()];
 
   // Open a tab in incognito.
-  [ChromeEarlGrey openNewIncognitoTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
   const GURL URL = self.testServer->GetURL(kFormHTMLFile);
   NSString* omniboxText = base::SysUTF8ToNSString(URL.spec() + "\n");
   [ChromeEarlGreyUI focusOmniboxAndType:omniboxText];
-  [ChromeEarlGrey waitForWebViewContainingText:"Profile form"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Profile form"]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
@@ -613,9 +616,10 @@
       assertWithMatcher:grey_sufficientlyVisible()];
 
   // Open a tab in incognito.
-  [ChromeEarlGrey openNewIncognitoTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
   [ChromeEarlGreyUI focusOmniboxAndType:omniboxText];
-  [ChromeEarlGrey waitForWebViewContainingText:webViewText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:webViewText]);
 
   [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()]
       performAction:chrome_test_util::TapWebElement(kFormElementCity)];
@@ -625,9 +629,10 @@
       assertWithMatcher:grey_sufficientlyVisible()];
 
   [ChromeEarlGrey closeCurrentTab];
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:webViewText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:webViewText]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
@@ -639,9 +644,10 @@
       assertWithMatcher:grey_sufficientlyVisible()];
 
   // Open a tab in incognito.
-  [ChromeEarlGrey openNewIncognitoTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
   [ChromeEarlGreyUI focusOmniboxAndType:omniboxText];
-  [ChromeEarlGrey waitForWebViewContainingText:webViewText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:webViewText]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
@@ -649,9 +655,10 @@
       performAction:chrome_test_util::TapWebElement(kFormElementCity)];
 
   // Open a  regular tab.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:webViewText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:webViewText]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
@@ -678,11 +685,12 @@
       assertWithMatcher:grey_sufficientlyVisible()];
 
   // Open a tab in incognito.
-  [ChromeEarlGrey openNewIncognitoTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
   const GURL URL = self.testServer->GetURL(kFormHTMLFile);
   NSString* omniboxText = base::SysUTF8ToNSString(URL.spec() + "\n");
   [ChromeEarlGreyUI focusOmniboxAndType:omniboxText];
-  [ChromeEarlGrey waitForWebViewContainingText:"Profile form"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Profile form"]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
@@ -690,9 +698,10 @@
       performAction:chrome_test_util::TapWebElement(kFormElementCity)];
 
   // Open a  regular tab.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:"Profile form"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Profile form"]);
 
   // Bring up the keyboard by tapping the city, which is the element before the
   // picker.
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller_egtest.mm
index 92f80b0..f207f04 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/fallback_view_controller_egtest.mm
@@ -18,6 +18,7 @@
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
@@ -86,8 +87,9 @@
 
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
   const GURL URL = self.testServer->GetURL(kFormHTMLFile);
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:"Hello"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Hello"]);
 }
 
 - (void)tearDown {
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_egtest.mm
index 4ef192c..3b980c7b 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/keyboard_observer_egtest.mm
@@ -11,6 +11,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_actions.h"
@@ -93,8 +94,9 @@
   web::test::SetUpFileBasedHttpServer();
   GURL URL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/multi_field_form.html");
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:"hello!"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"hello!"]);
 
   // Opening the keyboard from a webview blocks EarlGrey's synchronization.
   [[GREYConfiguration sharedInstance]
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm
index a6d16a1b..579523f 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/password_view_controller_egtest.mm
@@ -25,6 +25,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
@@ -241,8 +242,9 @@
              @"Manual Fallback must be enabled for this Test Case");
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
   const GURL URL = self.testServer->GetURL(kFormHTMLFile);
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:"hello!"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"hello!"]);
   SaveExamplePasswordForm();
 }
 
@@ -574,8 +576,9 @@
   }
 
   const GURL URL = self.testServer->GetURL(kIFrameHTMLFile);
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:"iFrame"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"iFrame"]);
   SaveLocalPasswordForm(URL);
 
   // Bring up the keyboard.
diff --git a/ios/chrome/browser/ui/autofill/save_card_infobar_egtest.mm b/ios/chrome/browser/ui/autofill/save_card_infobar_egtest.mm
index 67d7ab91..19f34af 100644
--- a/ios/chrome/browser/ui/autofill/save_card_infobar_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/save_card_infobar_egtest.mm
@@ -24,6 +24,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -291,8 +292,8 @@
 // fallback local save infobar becomes visible if the request unexpectedly fails
 // but the form data is complete.
 - (void)offerLocalSave_FullData_RequestFails {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)]);
 
   // Set up the Google Payments server response.
   test_url_loader_factory_.AddResponse(kURLGetUploadDetailsRequest,
@@ -336,8 +337,8 @@
 // fallback local save infobar becomes visible if the request is declined but
 // the form data is complete.
 - (void)offerLocalSave_FullData_PaymentsDeclines {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)]);
 
   // Set up the Google Payments server response.
   test_url_loader_factory_.AddResponse(kURLGetUploadDetailsRequest,
@@ -380,8 +381,8 @@
 // date, should query Google Payments; but the fallback local save infobar
 // should not appear if the request is declined and the form data is incomplete.
 - (void)testNotOfferLocalSave_PartialData_PaymentsDeclines {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)]);
 
   // Set up the Google Payments server response.
   test_url_loader_factory_.AddResponse(kURLGetUploadDetailsRequest,
@@ -403,8 +404,8 @@
 // Ensures that submitting the form should query Google Payments; and the
 // upstreaming infobar should appear if the request is accepted.
 - (void)offerUpstream_FullData_PaymentsAccepts {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)]);
 
   // Set up the Google Payments server response.
   test_url_loader_factory_.AddResponse(kURLGetUploadDetailsRequest,
@@ -446,8 +447,8 @@
 // date, should query Google Payments and the upstreaming infobar should appear
 // if the request is accepted.
 - (void)offerUpstream_PartialData_PaymentsAccepts {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)]);
 
   // Set up the Google Payments server response.
   test_url_loader_factory_.AddResponse(kURLGetUploadDetailsRequest,
@@ -493,8 +494,8 @@
 
   base::HistogramTester histogram_tester;
 
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)]);
 
   // Set up the Google Payments server response.
   test_url_loader_factory_.AddResponse(kURLGetUploadDetailsRequest,
@@ -569,8 +570,8 @@
 
   base::HistogramTester histogram_tester;
 
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)]);
 
   // Set up the Google Payments server response.
   test_url_loader_factory_.AddResponse(kURLGetUploadDetailsRequest,
@@ -622,8 +623,8 @@
 // Ensures that the infobar goes away and no credit card is saved to Chrome if
 // the user declines local save.
 - (void)userData_LocalSave_UserDeclines {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)]);
 
   // Set up the Google Payments server response.
   test_url_loader_factory_.AddResponse(kURLGetUploadDetailsRequest,
@@ -690,8 +691,8 @@
 // Ensures that the infobar goes away and the credit card is saved to Chrome if
 // the user accepts local save.
 - (void)testUserData_LocalSave_UserAccepts {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)]);
 
   // Ensure there are no saved credit cards.
   GREYAssertEqual(0U, personal_data_manager_->GetCreditCards().size(),
@@ -734,8 +735,8 @@
 // TODO(crbug.com/925670): remove SetMaxStrikesOnFormFillCard() and incur
 // the maximum number of strikes by showing and declining save infobar instead.
 - (void)testNotOfferLocalSave_MaxStrikesReached {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCreditCardUploadForm)]);
 
   // Set up the Google Payments server response.
   test_url_loader_factory_.AddResponse(kURLGetUploadDetailsRequest,
diff --git a/ios/chrome/browser/ui/autofill/save_profile_egtest.mm b/ios/chrome/browser/ui/autofill/save_profile_egtest.mm
index bae084c..297ac0f 100644
--- a/ios/chrome/browser/ui/autofill/save_profile_egtest.mm
+++ b/ios/chrome/browser/ui/autofill/save_profile_egtest.mm
@@ -13,6 +13,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -69,7 +70,8 @@
 
 // Ensures that the profile is saved to Chrome after submitting the form.
 - (void)testUserData_LocalSave {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kProfileForm)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kProfileForm)]);
 
   // Ensure there are no saved profiles.
   GREYAssertEqual(0U, personal_data_manager_->GetProfiles().size(),
diff --git a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
index 1fb1b06..0875a24 100644
--- a/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
+++ b/ios/chrome/browser/ui/bookmarks/bookmarks_egtest.mm
@@ -37,6 +37,7 @@
 #import "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h"
@@ -171,7 +172,7 @@
 - (void)setUp {
   [super setUp];
 
-  [ChromeEarlGrey waitForBookmarksToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]);
   GREYAssert(chrome_test_util::ClearBookmarks(),
              @"Not all bookmarks were removed.");
 }
@@ -199,7 +200,7 @@
   std::string expectedURLContent = bookmarkedURL.GetContent();
   NSString* bookmarkTitle = @"my bookmark";
 
-  [ChromeEarlGrey loadURL:bookmarkedURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:bookmarkedURL]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(expectedURLContent)]
       assertWithMatcher:grey_notNil()];
 
@@ -272,9 +273,9 @@
       "http://ios/testing/data/http_server_files/pony.html");
   const GURL secondURL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/destination.html");
-  [ChromeEarlGrey loadURL:firstURL];
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:secondURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:firstURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:secondURL]);
 
   [BookmarksTestCase bookmarkCurrentTabWithTitle:@"my bookmark"];
   [BookmarksTestCase assertBookmarksWithTitle:@"my bookmark" expectedCount:1];
@@ -916,15 +917,16 @@
 // Tests that chrome://bookmarks is disabled.
 - (void)testBookmarksURLDisabled {
   const std::string kChromeBookmarksURL = "chrome://bookmarks";
-  [ChromeEarlGrey loadURL:GURL(kChromeBookmarksURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeBookmarksURL)]);
 
   // Verify chrome://bookmarks appears in the omnibox.
   [[EarlGrey selectElementWithMatcher:OmniboxText(kChromeBookmarksURL)]
       assertWithMatcher:grey_notNil()];
 
   // Verify that the resulting page is an error page.
-  std::string error = net::ErrorToShortString(net::ERR_INVALID_URL);
-  [ChromeEarlGrey waitForWebViewContainingText:error];
+  std::string errorMessage = net::ErrorToShortString(net::ERR_INVALID_URL);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:errorMessage]);
 }
 
 #pragma mark - Helpers
@@ -1720,7 +1722,7 @@
 - (void)setUp {
   [super setUp];
 
-  [ChromeEarlGrey waitForBookmarksToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]);
   GREYAssert(chrome_test_util::ClearBookmarks(),
              @"Not all bookmarks were removed.");
 }
@@ -2114,7 +2116,7 @@
                          IDS_IOS_BOOKMARK_CONTEXT_MENU_OPEN];
 
   // Verify there are 3 normal tabs.
-  [ChromeEarlGrey waitForMainTabCount:3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:3]);
   GREYAssertTrue(chrome_test_util::GetIncognitoTabCount() == 0,
                  @"Incognito tab count should be 0");
 
@@ -2122,7 +2124,7 @@
   [BookmarksTestCase verifyOrderOfTabsWithCurrentTabIndex:0];
 
   // Switch to Incognito mode by adding a new incognito tab.
-  [ChromeEarlGrey openNewIncognitoTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
 
   [BookmarksTestCase openBookmarks];
 
@@ -2131,12 +2133,12 @@
                          IDS_IOS_BOOKMARK_CONTEXT_MENU_OPEN];
 
   // Verify there are 6 normal tabs and no new incognito tabs.
-  [ChromeEarlGrey waitForMainTabCount:6];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:6]);
   GREYAssertTrue(chrome_test_util::GetIncognitoTabCount() == 1,
                  @"Incognito tab count should be 1");
 
   // Close the incognito tab to go back to normal mode.
-  [ChromeEarlGrey closeAllIncognitoTabs];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey closeAllIncognitoTabs]);
 
   // The following verifies the selected bookmarks are open in the same order as
   // in folder.
@@ -2157,7 +2159,7 @@
                          IDS_IOS_BOOKMARK_CONTEXT_MENU_OPEN_INCOGNITO];
 
   // Verify there are 3 incognito tabs and no new normal tab.
-  [ChromeEarlGrey waitForIncognitoTabCount:3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:3]);
   GREYAssertTrue(chrome_test_util::GetMainTabCount() == 1,
                  @"Main tab count should be 1");
 
@@ -2178,7 +2180,7 @@
   // there will be 2 new tabs only.
 
   // Verify there are 5 incognito tabs and no new normal tab.
-  [ChromeEarlGrey waitForIncognitoTabCount:5];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:5]);
   GREYAssertTrue(chrome_test_util::GetMainTabCount() == 1,
                  @"Main tab count should be 1");
 
@@ -2211,7 +2213,7 @@
       performAction:grey_tap()];
 
   // Verify there is 1 new normal tab created and no new incognito tab created.
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   GREYAssertTrue(chrome_test_util::GetIncognitoTabCount() == 0,
                  @"Incognito tab count should be 0");
 
@@ -2231,7 +2233,7 @@
       performAction:grey_tap()];
 
   // Verify there is 1 incognito tab created and no new normal tab created.
-  [ChromeEarlGrey waitForIncognitoTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]);
   GREYAssertTrue(chrome_test_util::GetMainTabCount() == 2,
                  @"Main tab count should be 2");
 
@@ -2275,7 +2277,7 @@
       performAction:grey_tap()];
 
   // Verify a new incognito tab is created.
-  [ChromeEarlGrey waitForIncognitoTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:2]);
   GREYAssertTrue(chrome_test_util::GetMainTabCount() == 2,
                  @"Main tab count should be 2");
 
@@ -2299,7 +2301,7 @@
       performAction:grey_tap()];
 
   // Verify a new normal tab is created and no incognito tab is created.
-  [ChromeEarlGrey waitForMainTabCount:3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:3]);
   GREYAssertTrue(chrome_test_util::GetIncognitoTabCount() == 2,
                  @"Incognito tab count should be 2");
 
@@ -2713,7 +2715,7 @@
 - (void)setUp {
   [super setUp];
 
-  [ChromeEarlGrey waitForBookmarksToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]);
   GREYAssert(chrome_test_util::ClearBookmarks(),
              @"Not all bookmarks were removed.");
 }
@@ -2927,7 +2929,7 @@
 - (void)setUp {
   [super setUp];
 
-  [ChromeEarlGrey waitForBookmarksToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]);
   GREYAssert(chrome_test_util::ClearBookmarks(),
              @"Not all bookmarks were removed.");
 }
@@ -3104,7 +3106,7 @@
 - (void)setUp {
   [super setUp];
 
-  [ChromeEarlGrey waitForBookmarksToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]);
   GREYAssert(chrome_test_util::ClearBookmarks(),
              @"Not all bookmarks were removed.");
 }
@@ -3866,7 +3868,7 @@
                                 expectedCount:0];
   // Open the page.
   std::string expectedURLContent = bookmarkedURL.GetContent();
-  [ChromeEarlGrey loadURL:bookmarkedURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:bookmarkedURL]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(expectedURLContent)]
       assertWithMatcher:grey_notNil()];
 
@@ -3991,7 +3993,7 @@
       "http://ios/testing/data/http_server_files/pony.html");
   std::string expectedURLContent = bookmarkedURL.GetContent();
 
-  [ChromeEarlGrey loadURL:bookmarkedURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:bookmarkedURL]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(expectedURLContent)]
       assertWithMatcher:grey_notNil()];
 
@@ -4045,7 +4047,7 @@
 - (void)setUp {
   [super setUp];
 
-  [ChromeEarlGrey waitForBookmarksToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]);
   GREYAssert(chrome_test_util::ClearBookmarks(),
              @"Not all bookmarks were removed.");
 }
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index 5348e930..fa38fbe3 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -166,6 +166,7 @@
 #import "ios/chrome/browser/ui/voice/text_to_speech_playback_controller.h"
 #import "ios/chrome/browser/ui/voice/text_to_speech_playback_controller_factory.h"
 #include "ios/chrome/browser/upgrade/upgrade_center.h"
+#import "ios/chrome/browser/url_loading/image_search_param_generator.h"
 #import "ios/chrome/browser/url_loading/url_loading_notifier.h"
 #import "ios/chrome/browser/url_loading/url_loading_notifier_factory.h"
 #import "ios/chrome/browser/url_loading/url_loading_observer_bridge.h"
@@ -218,7 +219,6 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/l10n/l10n_util_mac.h"
 #include "ui/base/page_transition_types.h"
-#import "ui/gfx/image/image_util.h"
 #include "url/gurl.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -3338,61 +3338,26 @@
 // Performs a search using |data| and |imageURL| as inputs. Opens the results in
 // a new tab based on |inNewTab|.
 - (void)searchByImageData:(NSData*)data atURL:(const GURL&)imageURL {
-  NSData* imageData = data;
-  UIImage* image = [UIImage imageWithData:data];
-  gfx::Image gfxImage(image);
-  // Converting to gfx::Image creates an empty image if UIImage is nil. However,
-  // we still want to do the image search with nil data because that gives
-  // the user the best error experience.
-  if (gfxImage.IsEmpty()) {
-    [self searchByResizedImageData:imageData atURL:&imageURL inNewTab:YES];
-    return;
-  }
-  UIImage* resizedImage =
-      gfx::ResizedImageForSearchByImage(gfxImage).ToUIImage();
-  if (![image isEqual:resizedImage]) {
-    imageData = UIImageJPEGRepresentation(resizedImage, 1.0);
-  }
-  [self searchByResizedImageData:imageData atURL:&imageURL inNewTab:YES];
+  web::NavigationManager::WebLoadParams loadParams =
+      ImageSearchParamGenerator::LoadParamsForImageData(
+          data, imageURL,
+          ios::TemplateURLServiceFactory::GetForBrowserState(_browserState));
+  [self searchByImageWithWebLoadParams:loadParams inNewTab:YES];
 }
 
 // Performs a search with the given image data. The data should alread have
 // been scaled down in |ResizedImageForSearchByImage|.
-- (void)searchByResizedImageData:(NSData*)data
-                           atURL:(const GURL*)imageURL
-                        inNewTab:(BOOL)inNewTab {
-  char const* bytes = reinterpret_cast<const char*>([data bytes]);
-  std::string byteString(bytes, [data length]);
-
-  TemplateURLService* templateUrlService =
-      ios::TemplateURLServiceFactory::GetForBrowserState(_browserState);
-  const TemplateURL* defaultURL =
-      templateUrlService->GetDefaultSearchProvider();
-  DCHECK(!defaultURL->image_url().empty());
-  DCHECK(defaultURL->image_url_ref().IsValid(
-      templateUrlService->search_terms_data()));
-  TemplateURLRef::SearchTermsArgs search_args(base::ASCIIToUTF16(""));
-  if (imageURL) {
-    search_args.image_url = *imageURL;
-  }
-  search_args.image_thumbnail_content = byteString;
-
-  // Generate the URL and populate |post_content| with the content type and
-  // HTTP body for the request.
-  TemplateURLRef::PostContent postContent;
-  GURL result(defaultURL->image_url_ref().ReplaceSearchTerms(
-      search_args, templateUrlService->search_terms_data(), &postContent));
-  web::NavigationManager::WebLoadParams loadParams =
-      web_navigation_util::CreateWebLoadParams(
-          result, ui::PAGE_TRANSITION_TYPED, &postContent);
+- (void)searchByImageWithWebLoadParams:
+            (web::NavigationManager::WebLoadParams)webParams
+                              inNewTab:(BOOL)inNewTab {
   if (inNewTab) {
-    UrlLoadParams params = UrlLoadParams::InNewTab(loadParams);
+    UrlLoadParams params = UrlLoadParams::InNewTab(webParams);
     params.in_incognito = self.isOffTheRecord;
     UrlLoadingServiceFactory::GetForBrowserState(self.browserState)
         ->Load(params);
   } else {
     UrlLoadingServiceFactory::GetForBrowserState(self.browserState)
-        ->Load(UrlLoadParams::InCurrentTab(loadParams));
+        ->Load(UrlLoadParams::InCurrentTab(webParams));
   }
 }
 
@@ -4297,11 +4262,11 @@
 }
 
 - (void)searchByImage:(UIImage*)image {
-  gfx::Image gfxImage(image);
-  UIImage* resizedImage =
-      gfx::ResizedImageForSearchByImage(gfxImage).ToUIImage();
-  NSData* data = UIImageJPEGRepresentation(resizedImage, 1.0);
-  [self searchByResizedImageData:data atURL:nil inNewTab:NO];
+  [self searchByImageWithWebLoadParams:
+            ImageSearchParamGenerator::LoadParamsForImage(
+                image, ios::TemplateURLServiceFactory::GetForBrowserState(
+                           _browserState))
+                              inNewTab:NO];
 }
 
 #pragma mark - FindInPageResponseDelegate
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm
index 243c7597..df16929 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller_egtest.mm
@@ -19,6 +19,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/web/public/test/http_server/html_response_provider.h"
@@ -55,10 +56,11 @@
   web::test::SetUpSimpleHttpServer(responses);
 
   // Just load the first URL.
-  [ChromeEarlGrey loadURL:startURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:startURL]);
 
   // Waits for the page to load and check it is the expected content.
-  [ChromeEarlGrey waitForWebViewContainingText:responses[startURL]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:responses[startURL]]);
 
   // In the omnibox, the URL should be present, without the http:// prefix.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
@@ -81,7 +83,8 @@
                   @"Did not navigate to the destination url.");
 
   // Verifies that the destination page is shown.
-  [ChromeEarlGrey waitForWebViewContainingText:responses[destinationURL]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:responses[destinationURL]]);
 }
 
 // Tests the fix for the regression reported in https://crbug.com/801165.  The
@@ -97,12 +100,13 @@
   web::test::SetUpSimpleHttpServer(responses);
 
   // Load the test page.
-  [ChromeEarlGrey loadURL:testURL];
-  [ChromeEarlGrey waitForWebViewContainingText:"File Picker Test"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"File Picker Test"]);
 
   // Invoke the file picker and tap on the "Cancel" button to dismiss the file
   // picker.
-  [ChromeEarlGrey tapWebViewElementWithID:@"file"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"file"]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::CancelButton()]
       performAction:grey_tap()];
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
@@ -126,13 +130,13 @@
   int mainTabCount = 1;
   if (base::FeatureList::IsEnabled(kBlockNewTabPagePendingLoad))
     mainTabCount = 2;
-  [ChromeEarlGrey waitForMainTabCount:mainTabCount];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:mainTabCount]);
 }
 
 // Tests that BVC properly handles open URL. When BVC is showing a non-NTP
 // tab, the URL should be opened in a new tab, adding to the tab count.
 - (void)testOpenURLFromTab {
-  [ChromeEarlGrey loadURL:GURL("https://invalid")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("https://invalid")]);
   id<UIApplicationDelegate> appDelegate =
       [[UIApplication sharedApplication] delegate];
   [appDelegate application:[UIApplication sharedApplication]
@@ -141,14 +145,14 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           "https://anything")]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests that BVC properly handles open URL. When tab switcher is showing,
 // the URL should be opened in a new tab, and BVC should be shown.
 - (void)testOpenURLFromTabSwitcher {
   chrome_test_util::CloseCurrentTab();
-  [ChromeEarlGrey waitForMainTabCount:0];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:0]);
   id<UIApplicationDelegate> appDelegate =
       [[UIApplication sharedApplication] delegate];
   [appDelegate application:[UIApplication sharedApplication]
@@ -157,7 +161,7 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           "https://anything")]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 #pragma mark - WebState visibility
@@ -173,14 +177,16 @@
   web::test::SetUpSimpleHttpServer(responses);
 
   // Load the test page.
-  [ChromeEarlGrey loadURL:testURL];
-  [ChromeEarlGrey waitForWebViewContainingText:testPageContents];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:testPageContents]);
   web::WebState* firstWebState = chrome_test_util::GetCurrentTab().webState;
 
   // And do the same in a second tab.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:testURL];
-  [ChromeEarlGrey waitForWebViewContainingText:testPageContents];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:testPageContents]);
   web::WebState* secondWebState = chrome_test_util::GetCurrentTab().webState;
 
   // Check visibility before and after switching tabs.
diff --git a/ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h b/ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h
index 9a54899..eec1c43 100644
--- a/ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h
+++ b/ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h
@@ -22,10 +22,14 @@
 // Yellow palette.
 + (MDCPalette*)cr_yellowPalette;
 
+// Grey palette.
++ (MDCPalette*)cr_greyPalette;
+
 + (void)cr_setBluePalette:(MDCPalette*)palette;
 + (void)cr_setRedPalette:(MDCPalette*)palette;
 + (void)cr_setGreenPalette:(MDCPalette*)palette;
 + (void)cr_setYellowPalette:(MDCPalette*)palette;
++ (void)cr_setGreyPalette:(MDCPalette*)palette;
 
 @end
 
diff --git a/ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.mm b/ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.mm
index 22d6691..d4523976 100644
--- a/ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.mm
+++ b/ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.mm
@@ -17,6 +17,7 @@
 static MDCPalette* g_redPalette = nil;
 static MDCPalette* g_greenPalette = nil;
 static MDCPalette* g_yellowPalette = nil;
+static MDCPalette* g_greyPalette = nil;
 }
 
 + (MDCPalette*)cr_bluePalette {
@@ -51,6 +52,14 @@
   return g_yellowPalette;
 }
 
++ (MDCPalette*)cr_greyPalette {
+  DCHECK(!web::WebThread::IsThreadInitialized(web::WebThread::UI) ||
+         web::WebThread::CurrentlyOn(web::WebThread::UI));
+  if (!g_greyPalette)
+    return [MDCPalette greyPalette];
+  return g_greyPalette;
+}
+
 + (void)cr_setBluePalette:(MDCPalette*)palette {
   DCHECK(!web::WebThread::IsThreadInitialized(web::WebThread::UI) ||
          web::WebThread::CurrentlyOn(web::WebThread::UI));
@@ -75,4 +84,10 @@
   g_yellowPalette = palette;
 }
 
++ (void)cr_setGreyPalette:(MDCPalette*)palette {
+  DCHECK(!web::WebThread::IsThreadInitialized(web::WebThread::UI) ||
+         web::WebThread::CurrentlyOn(web::WebThread::UI));
+  g_greyPalette = palette;
+}
+
 @end
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
index de262151e..98d87e3a 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_egtest.mm
@@ -38,6 +38,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "net/test/embedded_test_server/http_request.h"
@@ -227,7 +228,7 @@
   // Open a new Tab.
   ScrollUp();
   [ChromeEarlGreyUI openNewTab];
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Go back to the previous tab.
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
@@ -290,12 +291,13 @@
       performAction:grey_tap()];
 
   // Check that the page has been opened.
-  [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           pageURL.GetContent())]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForMainTabCount:1];
-  [ChromeEarlGrey waitForIncognitoTabCount:0];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:0]);
 
   // Go back.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
@@ -342,8 +344,8 @@
       performAction:grey_tap()];
 
   // Check a new page in normal model is opened.
-  [ChromeEarlGrey waitForMainTabCount:2];
-  [ChromeEarlGrey waitForIncognitoTabCount:0];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:0]);
 
   // Check that the tab has been opened in background.
   ConditionBlock condition = ^{
@@ -360,7 +362,8 @@
 
   // Check the page has been correctly opened.
   chrome_test_util::SelectTabAtIndexInCurrentMode(1);
-  [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           pageURL.GetContent())]
       assertWithMatcher:grey_notNil()];
@@ -378,11 +381,12 @@
                      IDS_IOS_CONTENT_CONTEXT_OPENLINKNEWINCOGNITOTAB)]
       performAction:grey_tap()];
 
-  [ChromeEarlGrey waitForMainTabCount:1];
-  [ChromeEarlGrey waitForIncognitoTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]);
 
   // Check that the tab has been opened in foreground.
-  [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           pageURL.GetContent())]
       assertWithMatcher:grey_notNil()];
@@ -492,15 +496,16 @@
   GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
                  @"Clearing Browsing History timed out");
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-  [ChromeEarlGrey loadURL:pageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
 
   // After loading URL, need to do another action before opening a new tab
   // with the icon present.
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   [[self class] closeAllTabs];
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 
   [[EarlGrey selectElementWithMatcher:
                  chrome_test_util::StaticTextWithAccessibilityLabel(pageTitle)]
diff --git a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
index 9e8cba0..95de9ad 100644
--- a/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
+++ b/ios/chrome/browser/ui/content_suggestions/ntp_home_egtest.mm
@@ -44,6 +44,7 @@
 #include "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/chrome/test/scoped_eg_synchronization_disabler.h"
@@ -430,8 +431,9 @@
                  chrome_test_util::StaticTextWithAccessibilityLabel(
                      base::SysUTF8ToNSString(kPageTitle))]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString];
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   // Check that the new position is the same.
   omnibox = ntp_home::FakeOmnibox();
@@ -468,8 +470,9 @@
                  chrome_test_util::StaticTextWithAccessibilityLabel(
                      base::SysUTF8ToNSString(kPageTitle))]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString];
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   // Check that the new position is the same.
   omnibox = ntp_home::FakeOmnibox();
@@ -498,7 +501,8 @@
       performAction:grey_typeText([URL stringByAppendingString:@"\n"])];
 
   // Check that the page is loaded.
-  [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
 }
 
 // Tests that tapping the omnibox search button logs correctly.
@@ -629,8 +633,9 @@
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
                                           kToolbarOmniboxButtonIdentifier)]
       performAction:grey_tap()];
-  [ChromeEarlGrey
-      waitForElementWithMatcherSufficientlyVisible:chrome_test_util::Omnibox()];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+                          chrome_test_util::Omnibox()]);
 }
 
 - (void)testOpeningNewTab {
@@ -721,22 +726,24 @@
   GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
                  @"Clearing Browsing History timed out");
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
-  [ChromeEarlGrey loadURL:pageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
 
   // After loading URL, need to do another action before opening a new tab
   // with the icon present.
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   [[self class] closeAllTabs];
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 }
 
 // Taps the fake omnibox and waits for the real omnibox to be visible.
 - (void)focusFakebox {
   [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()]
       performAction:grey_tap()];
-  [ChromeEarlGrey
-      waitForElementWithMatcherSufficientlyVisible:chrome_test_util::Omnibox()];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+                          chrome_test_util::Omnibox()]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm b/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
index 9a80191..ca9e5b9 100644
--- a/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
+++ b/ios/chrome/browser/ui/dialogs/javascript_dialog_egtest.mm
@@ -20,6 +20,7 @@
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/testing/earl_grey/disabled_test_macros.h"
@@ -388,13 +389,15 @@
 #pragma mark - Utility
 
 - (void)loadBlankTestPage {
-  [ChromeEarlGrey loadURL:self.emptyPageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:std::string()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:self.emptyPageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:std::string()]);
 }
 
 - (void)loadPageWithLink {
-  [ChromeEarlGrey loadURL:self.linkPageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kLinkPageLinkText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:self.linkPageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLinkPageLinkText]);
 }
 
 #pragma mark - Tests
@@ -408,7 +411,8 @@
   [[EarlGrey selectElementWithMatcher:OKButton()] performAction:grey_tap()];
 
   // Wait for the html body to be reset to the correct value.
-  [ChromeEarlGrey waitForWebViewContainingText:kAlertResultBody];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kAlertResultBody]);
 }
 
 // Tests that a confirmation dialog is shown, and that the completion block is
@@ -421,7 +425,8 @@
   [[EarlGrey selectElementWithMatcher:OKButton()] performAction:grey_tap()];
 
   // Wait for the html body to be reset to the correct value.
-  [ChromeEarlGrey waitForWebViewContainingText:kConfirmationResultBodyOK];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kConfirmationResultBodyOK]);
 }
 
 // Tests that a confirmation dialog is shown, and that the completion block is
@@ -435,8 +440,8 @@
   TapCancel();
 
   // Wait for the html body to be reset to the correct value.
-  [ChromeEarlGrey
-      waitForWebViewContainingText:kConfirmationResultBodyCancelled];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:kConfirmationResultBodyCancelled]);
 }
 
 // Tests that a prompt dialog is shown, and that the completion block is called
@@ -458,7 +463,8 @@
   [[EarlGrey selectElementWithMatcher:OKButton()] performAction:grey_tap()];
 
   // Wait for the html body to be reset to the input text.
-  [ChromeEarlGrey waitForWebViewContainingText:kPromptTestUserInput];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPromptTestUserInput]);
 }
 
 // Tests that a prompt dialog is shown, and that the completion block is called
@@ -481,7 +487,8 @@
   TapCancel();
 
   // Wait for the html body to be reset to the cancel text.
-  [ChromeEarlGrey waitForWebViewContainingText:kPromptResultBodyCancelled];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPromptResultBodyCancelled]);
 }
 
 // Tests that JavaScript alerts that are shown in a loop can be suppressed.
@@ -508,7 +515,8 @@
   TapSuppressDialogsButton();
 
   // Wait for the html body to be reset to the loop finished text.
-  [ChromeEarlGrey waitForWebViewContainingText:kAlertLoopFinishedText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kAlertLoopFinishedText]);
 }
 
 // Tests to ensure crbug.com/658260 does not regress.
@@ -545,7 +553,8 @@
   [[EarlGrey selectElementWithMatcher:OKButton()] performAction:grey_tap()];
 
   // Wait for the html body to be reset to the correct value.
-  [ChromeEarlGrey waitForWebViewContainingText:kAlertResultBody];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kAlertResultBody]);
 }
 
 // Tests that an alert is presented after displaying the share menu.
@@ -571,7 +580,8 @@
   [[EarlGrey selectElementWithMatcher:OKButton()] performAction:grey_tap()];
 
   // Wait for the html body to be reset to the correct value.
-  [ChromeEarlGrey waitForWebViewContainingText:kAlertResultBody];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kAlertResultBody]);
 }
 
 // Tests that an alert is presented after a new tab animation is finished.
diff --git a/ios/chrome/browser/ui/download/ar_quick_look_egtest.mm b/ios/chrome/browser/ui/download/ar_quick_look_egtest.mm
index b5dda116..56417f2 100644
--- a/ios/chrome/browser/ui/download/ar_quick_look_egtest.mm
+++ b/ios/chrome/browser/ui/download/ar_quick_look_egtest.mm
@@ -17,6 +17,7 @@
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "net/http/http_status_code.h"
 #include "net/test/embedded_test_server/http_request.h"
@@ -88,9 +89,11 @@
          "below 12 because QLPreviewController is not available.");
   }
 
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Good"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"good"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Good"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"good"]);
 
   // QLPreviewController UI is rendered out of host process so EarlGrey matcher
   // can not find QLPreviewController UI. Instead this test relies on view
@@ -113,9 +116,12 @@
          "below 12 because QLPreviewController is not available.");
   }
 
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Unauthorized"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"unauthorized"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Unauthorized"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"unauthorized"]);
 
   // QLPreviewController UI is rendered out of host process so EarlGrey matcher
   // can not find QLPreviewController UI. Instead this test relies on view
@@ -138,9 +144,12 @@
          "below 12 because QLPreviewController is not available.");
   }
 
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Forbidden"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"forbidden"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Forbidden"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"forbidden"]);
 
   // QLPreviewController UI is rendered out of host process so EarlGrey matcher
   // can not find QLPreviewController UI. Instead this test relies on view
@@ -163,9 +172,12 @@
          "below 12 because QLPreviewController is not available.");
   }
 
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Changing Mime Type"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"changing-mime-type"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Changing Mime Type"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"changing-mime-type"]);
 
   // QLPreviewController UI is rendered out of host process so EarlGrey matcher
   // can not find QLPreviewController UI. Instead this test relies on view
diff --git a/ios/chrome/browser/ui/download/download_manager_egtest.mm b/ios/chrome/browser/ui/download/download_manager_egtest.mm
index a12f702..0a735e9 100644
--- a/ios/chrome/browser/ui/download/download_manager_egtest.mm
+++ b/ios/chrome/browser/ui/download/download_manager_egtest.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/chrome/test/scoped_eg_synchronization_disabler.h"
@@ -107,9 +108,12 @@
 // presented. EarlGrey does not allow testing "Open in..." dialog, because it
 // is run in a separate process.
 - (void)testSucessfullDownload {
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Download"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"download"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
@@ -122,10 +126,13 @@
 // presented. EarlGrey does not allow testing "Open in..." dialog, because it
 // is run in a separate process. Performs download in Incognito.
 - (void)testSucessfullDownloadInIncognito {
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Download"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"download"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
@@ -136,9 +143,12 @@
 
 // Tests cancelling download UI.
 - (void)testCancellingDownload {
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Download"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"download"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
@@ -157,9 +167,12 @@
 // separate tabs and loads the URL there. Then closes the tab and waits for
 // the download completion.
 - (void)testDownloadWhileBrowsing {
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Download"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"download"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
@@ -170,21 +183,24 @@
     // does not wait until the download progress bar becomes idle (which will
     // not happen until the download is complete).
     ScopedSynchronizationDisabler disabler;
-    [ChromeEarlGrey openNewTab];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   }
 
   // Load a URL in a separate Tab and close that tab.
-  [ChromeEarlGrey loadURL:GURL(kChromeUITermsURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeUITermsURL)]);
   const char kTermsText[] = "Google Chrome Terms of Service";
-  [ChromeEarlGrey waitForWebViewContainingText:kTermsText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTermsText]);
   [ChromeEarlGrey closeCurrentTab];
   GREYAssert(WaitForOpenInButton(), @"Open in... button did not show up");
 }
 
 // Tests "Open in New Tab" on download link.
 - (void)testDownloadInNewTab {
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Download"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
 
   // Open context menu for download link.
   [[EarlGrey selectElementWithMatcher:WebViewInWebState(GetCurrentWebState())]
@@ -199,7 +215,7 @@
       performAction:grey_tap()];
 
   // Wait until the new tab is open and switch to that tab.
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(1U);
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
 
@@ -211,9 +227,12 @@
 
 // Tests accessibility on Download Manager UI when download is not started.
 - (void)testAccessibilityOnNotStartedDownloadToolbar {
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Download"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"download"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
@@ -224,9 +243,12 @@
 
 // Tests accessibility on Download Manager UI when download is complete.
 - (void)testAccessibilityOnCompletedDownloadToolbar {
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Download"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"download"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Download"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"download"]);
 
   GREYAssert(WaitForDownloadButton(), @"Download button did not show up");
   [[EarlGrey selectElementWithMatcher:DownloadButton()]
diff --git a/ios/chrome/browser/ui/download/pass_kit_egtest.mm b/ios/chrome/browser/ui/download/pass_kit_egtest.mm
index 7f78a910..5bf9db5 100644
--- a/ios/chrome/browser/ui/download/pass_kit_egtest.mm
+++ b/ios/chrome/browser/ui/download/pass_kit_egtest.mm
@@ -17,6 +17,7 @@
 #include "ios/chrome/grit/ios_strings.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "net/test/embedded_test_server/http_response.h"
@@ -78,9 +79,11 @@
 // Tests that Chrome presents PassKit error infobar if pkpass file cannot be
 // parsed.
 - (void)testPassKitParsingError {
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Bad"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"bad"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Bad"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"bad"]);
 
   bool infobarShown = WaitUntilConditionOrTimeout(kWaitForDownloadTimeout, ^{
     NSError* error = nil;
@@ -99,9 +102,11 @@
     EARL_GREY_TEST_SKIPPED(@"Wallet app is not supported on iPads.");
   }
 
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Good"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"good"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Good"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"good"]);
 
   // PKAddPassesViewController UI is rendered out of host process so EarlGrey
   // matcher can not find PassKit Dialog UI. Instead this test relies on view
diff --git a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm b/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
index 02696a7..8bd03184 100644
--- a/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
+++ b/ios/chrome/browser/ui/find_bar/find_in_page_egtest.mm
@@ -16,6 +16,7 @@
 #import "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -222,10 +223,11 @@
 
 - (void)navigateToTestPage {
   // Navigate to a page with some text.
-  [ChromeEarlGrey loadURL:self.testURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:self.testURL]);
 
   // Verify web page finished loading.
-  [ChromeEarlGrey waitForWebViewContainingText:kFindInPageResponse];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kFindInPageResponse]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm b/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm
index 88a3216..4a12f9a 100644
--- a/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm
+++ b/ios/chrome/browser/ui/fullscreen/fullscreen_egtest.mm
@@ -95,7 +95,7 @@
   web::test::SetUpFileBasedHttpServer();
   GURL URL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/two_pages.pdf");
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGreyUI waitForToolbarVisible:YES]);
 
@@ -123,7 +123,7 @@
   web::test::SetUpFileBasedHttpServer();
   GURL URL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/single_page_wide.pdf");
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   // TODO(crbug.com/852393): Investigate why synchronization isn't working.  Is
   // an animation going on forever?
@@ -168,7 +168,7 @@
   web::test::SetUpFileBasedHttpServer();
   GURL URL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/two_pages.pdf");
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   // Test that the toolbar is hidden after a user swipes up.
   HideToolbarUsingUI();
@@ -190,8 +190,9 @@
 // header being shown even if was not previously shown.
 - (void)testChromeToChromeURLKeepsHeaderOnScreen {
   const GURL kChromeAboutURL("chrome://chrome-urls");
-  [ChromeEarlGrey loadURL:kChromeAboutURL];
-  [ChromeEarlGrey waitForWebViewContainingText:"chrome://version"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:kChromeAboutURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"chrome://version"]);
 
   // Hide the toolbar. The page is not long enough to dismiss the toolbar using
   // the UI so we have to zoom in.
@@ -244,7 +245,7 @@
       base::StringPrintf("<p style='height:%dem'>a</p><p>b</p>", kPageHeightEM);
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGreyUI waitForToolbarVisible:YES]);
   // Simulate a user scroll down.
   HideToolbarUsingUI();
@@ -270,8 +271,9 @@
       kPageHeightEM);
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:"Tall page"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Tall page"]);
 
   // Hide the toolbar.
   HideToolbarUsingUI();
@@ -310,9 +312,10 @@
   web::test::SetUpSimpleHttpServer(responses);
   chrome_test_util::SetContentSettingsBlockPopups(CONTENT_SETTING_ALLOW);
 
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:"link1"];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"link1"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Hide the toolbar.
   HideToolbarUsingUI();
@@ -322,8 +325,9 @@
   GREYAssert(TapWebViewElementWithId("link1"), @"Failed to tap \"link1\"");
 
   // Check that a new Tab was created.
-  [ChromeEarlGrey waitForWebViewContainingText:"link2"];
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"link2"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   AssertURLIs(destinationURL);
 
@@ -345,10 +349,11 @@
                @"Failed to receive WKErrorDomain error");
   }
 
-  [ChromeEarlGrey waitForWebViewContainingText:"link1"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"link1"]);
 
   // Make sure the toolbar is on the screen.
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGreyUI waitForToolbarVisible:YES]);
 }
 
@@ -374,16 +379,18 @@
                               "id='link2'>link2</a>";
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:originURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:originURL]);
 
-  [ChromeEarlGrey waitForWebViewContainingText:"link1"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"link1"]);
   // Dismiss the toolbar.
   HideToolbarUsingUI();
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGreyUI waitForToolbarVisible:NO]);
 
   // Navigate to the other page.
   GREYAssert(TapWebViewElementWithId("link1"), @"Failed to tap \"link1\"");
-  [ChromeEarlGrey waitForWebViewContainingText:"link2"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"link2"]);
 
   // Make sure toolbar is shown since a new load has started.
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGreyUI waitForToolbarVisible:YES]);
@@ -413,8 +420,9 @@
   responses[URL] = manyLines;
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForWebViewContainingText:"link"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"link"]);
 
   // Dismiss the toolbar.
   HideToolbarUsingUI();
@@ -443,7 +451,7 @@
       new ErrorPageResponseProvider(responses));
   web::test::SetUpHttpServer(std::move(provider));
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   HideToolbarUsingUI();
   CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGreyUI waitForToolbarVisible:NO]);
 
diff --git a/ios/chrome/browser/ui/history/history_ui_egtest.mm b/ios/chrome/browser/ui/history/history_ui_egtest.mm
index 5d9e900..f8db91be 100644
--- a/ios/chrome/browser/ui/history/history_ui_egtest.mm
+++ b/ios/chrome/browser/ui/history/history_ui_egtest.mm
@@ -30,6 +30,7 @@
 #import "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/public/provider/chrome/browser/signin/chrome_identity.h"
@@ -148,7 +149,7 @@
   _URL1 = web::test::HttpServer::MakeUrl(kURL1);
   _URL2 = web::test::HttpServer::MakeUrl(kURL2);
   _URL3 = web::test::HttpServer::MakeUrl(kURL3);
-  [ChromeEarlGrey clearBrowsingHistory];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   // Some tests rely on a clean state for the "Clear Browsing Data" settings
   // screen.
   [self resetBrowsingDataPrefs];
@@ -196,17 +197,19 @@
   // Tap a history entry and assert that navigation to that entry's URL occurs.
   [[EarlGrey selectElementWithMatcher:HistoryEntry(_URL1, kTitle1)]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponse1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponse1]);
 }
 
 // Tests that history is not changed after performing back navigation.
 - (void)testHistoryUpdateAfterBackNavigation {
-  [ChromeEarlGrey loadURL:_URL1];
-  [ChromeEarlGrey loadURL:_URL2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL1]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL2]);
 
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponse1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponse1]);
 
   [self openHistoryPanel];
 
@@ -353,7 +356,7 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           _URL1.GetContent())]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests display and selection of 'Open in New Incognito Tab' in a context menu
@@ -373,8 +376,8 @@
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           _URL1.GetContent())]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForMainTabCount:1];
-  [ChromeEarlGrey waitForIncognitoTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]);
 }
 
 // Tests display and selection of 'Copy URL' in a context menu on a history
@@ -419,14 +422,17 @@
 #pragma mark Helper Methods
 
 - (void)loadTestURLs {
-  [ChromeEarlGrey loadURL:_URL1];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponse1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL1]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponse1]);
 
-  [ChromeEarlGrey loadURL:_URL2];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponse2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL2]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponse2]);
 
-  [ChromeEarlGrey loadURL:_URL3];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponse3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL3]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponse3]);
 }
 
 - (void)openHistoryPanel {
diff --git a/ios/chrome/browser/ui/infobars/coordinators/BUILD.gn b/ios/chrome/browser/ui/infobars/coordinators/BUILD.gn
index 30f3d9ec..e87f773 100644
--- a/ios/chrome/browser/ui/infobars/coordinators/BUILD.gn
+++ b/ios/chrome/browser/ui/infobars/coordinators/BUILD.gn
@@ -17,7 +17,7 @@
     "//base",
     "//components/infobars/core",
     "//ios/chrome/browser/infobars:public",
-    "//ios/chrome/browser/passwords:public",
+    "//ios/chrome/browser/passwords:infobar_delegates",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/coordinators:chrome_coordinators",
     "//ios/chrome/browser/ui/fullscreen",
diff --git a/ios/chrome/browser/ui/infobars/infobar_egtest.mm b/ios/chrome/browser/ui/infobars/infobar_egtest.mm
index 17dbfab..b78b7c7 100644
--- a/ios/chrome/browser/ui/infobars/infobar_egtest.mm
+++ b/ios/chrome/browser/ui/infobars/infobar_egtest.mm
@@ -16,6 +16,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -96,8 +97,8 @@
   // Open a new tab and navigate to the test page.
   const GURL testURL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/pony.html");
-  [ChromeEarlGrey loadURL:testURL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Infobar Message
   NSString* infoBarMessage = @"TestInfoBar";
@@ -111,7 +112,7 @@
 
   // Navigate to a different page.  Verify that the infobar is dismissed and no
   // longer visible on screen.
-  [ChromeEarlGrey loadURL:GURL(url::kAboutBlankURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(url::kAboutBlankURL)]);
   VerifyTestInfoBarVisibleForCurrentTab(false, infoBarMessage);
   VerifyNumberOfInfobarsInManager(0);
 }
@@ -126,16 +127,16 @@
   web::test::SetUpFileBasedHttpServer();
 
   // Create the first tab and navigate to the test page.
-  [ChromeEarlGrey loadURL:destinationURL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:destinationURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Infobar Message
   NSString* infoBarMessage = @"TestInfoBar";
 
   // Create the second tab, navigate to the test page, and add the test infobar.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:ponyURL];
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:ponyURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   VerifyTestInfoBarVisibleForCurrentTab(false, infoBarMessage);
   VerifyNumberOfInfobarsInManager(0);
   GREYAssert(AddTestInfoBarToCurrentTabWithMessage(infoBarMessage),
@@ -150,12 +151,12 @@
 
   // Navigate to a different URL in the first tab, to verify that this
   // navigation does not hide the infobar in the second tab.
-  [ChromeEarlGrey loadURL:ponyURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:ponyURL]);
 
   // Close the first tab.  Verify that there is only one tab remaining and its
   // infobar is visible.
   [ChromeEarlGrey closeCurrentTab];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
   VerifyTestInfoBarVisibleForCurrentTab(true, infoBarMessage);
   VerifyNumberOfInfobarsInManager(1);
 }
@@ -167,8 +168,8 @@
   // Open a new tab and navigate to the test page.
   const GURL testURL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/pony.html");
-  [ChromeEarlGrey loadURL:testURL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Infobar Message
   NSString* infoBarMessage = @"TestInfoBar";
@@ -196,8 +197,8 @@
   // Open a new tab and navigate to the test page.
   const GURL testURL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/pony.html");
-  [ChromeEarlGrey loadURL:testURL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // First Infobar Message
   NSString* firstInfoBarMessage = @"TestFirstInfoBar";
@@ -229,8 +230,8 @@
   // Open a new tab and navigate to the test page.
   const GURL testURL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/pony.html");
-  [ChromeEarlGrey loadURL:testURL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Infobar Message
   NSString* firstInfoBarMessage =
@@ -263,8 +264,8 @@
   // Open a new tab and navigate to the test page.
   const GURL testURL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/pony.html");
-  [ChromeEarlGrey loadURL:testURL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // First Infobar Message
   NSString* firstInfoBarMessage =
diff --git a/ios/chrome/browser/ui/keyboard/keyboard_commands_egtest.mm b/ios/chrome/browser/ui/keyboard/keyboard_commands_egtest.mm
index 40d48b4..8d3c02c 100644
--- a/ios/chrome/browser/ui/keyboard/keyboard_commands_egtest.mm
+++ b/ios/chrome/browser/ui/keyboard/keyboard_commands_egtest.mm
@@ -19,6 +19,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -115,7 +116,7 @@
 // Tests that keyboard commands are not registered when the bookmark UI is
 // shown.
 - (void)testKeyboardCommandsNotRegistered_AddBookmarkPresented {
-  [ChromeEarlGrey waitForBookmarksToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]);
   BOOL success = chrome_test_util::ClearBookmarks();
   GREYAssert(success, @"Not all bookmarks were removed.");
 
@@ -123,7 +124,7 @@
   web::test::SetUpFileBasedHttpServer();
   GURL URL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/pony.html");
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   // Bookmark page
   if (IsIPadIdiom()) {
@@ -192,7 +193,7 @@
   web::test::SetUpFileBasedHttpServer();
   GURL URL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/pony.html");
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [self verifyKeyboardCommandsAreRegistered];
 
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm b/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm
index 9b60270..3a1f15a7 100644
--- a/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm
+++ b/ios/chrome/browser/ui/ntp/new_tab_page_egtest.mm
@@ -18,6 +18,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -61,10 +62,10 @@
 
 // Tests that all items are accessible on the incognito page.
 - (void)testAccessibilityOnIncognitoTab {
-  [ChromeEarlGrey openNewIncognitoTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
   WaitForHistoryToDisappear();
   chrome_test_util::VerifyAccessibilityForCurrentScreen();
-  [ChromeEarlGrey closeAllIncognitoTabs];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey closeAllIncognitoTabs]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
index 788b9e54..e161042 100644
--- a/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
+++ b/ios/chrome/browser/ui/omnibox/popup/BUILD.gn
@@ -72,6 +72,7 @@
     "//components/omnibox/common",
     "//ios/chrome/app/strings:ios_strings_grit",
     "//ios/chrome/app/theme",
+    "//ios/chrome/browser/ui/colors",
     "//ios/chrome/browser/ui/commands",
     "//ios/chrome/browser/ui/elements",
     "//ios/chrome/browser/ui/omnibox:omnibox_popup_shared",
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_egtest.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_egtest.mm
index 09bfd38..0184aaf5 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_egtest.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_egtest.mm
@@ -15,6 +15,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "net/test/embedded_test_server/http_request.h"
@@ -109,7 +110,7 @@
       base::BindRepeating(&StandardResponse));
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
 
-  [ChromeEarlGrey clearBrowsingHistory];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
 }
 
 // Tests that tapping the switch to open tab button, switch to the open tab,
@@ -117,13 +118,16 @@
 - (void)testSwitchToOpenTab {
   // Open the first page.
   GURL firstPageURL = self.testServer->GetURL(kPage1URL);
-  [ChromeEarlGrey loadURL:firstPageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:firstPageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
 
   // Open the second page in another tab.
   [ChromeEarlGreyUI openNewTab];
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kPage2URL)];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kPage2URL)]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
 
   // Type the URL of the first page in the omnibox to trigger it as suggestion.
   [ChromeEarlGreyUI focusOmniboxAndType:base::SysUTF8ToNSString(kPage1URL)];
@@ -131,7 +135,8 @@
   // Switch to the first tab.
   [[EarlGrey selectElementWithMatcher:SwitchTabElementForUrl(firstPageURL)]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
 
   // Check that both tabs are opened (and that we switched tab and not just
   // navigated.
@@ -150,13 +155,16 @@
   GURL URL2 = self.testServer->GetURL(kPage2URL);
 
   // Open the first page.
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kPage1URL)];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kPage1URL)]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
 
   // Open the second page in another tab.
   [ChromeEarlGreyUI openNewTab];
-  [ChromeEarlGrey loadURL:URL2];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
 
   // Type the URL of the first page in the omnibox to trigger it as suggestion.
   [ChromeEarlGreyUI focusOmniboxAndType:base::SysUTF8ToNSString(kPage2URL)];
@@ -177,27 +185,33 @@
   GURL URL3 = self.testServer->GetURL(kPage3URL);
 
   // Add all the pages to the history.
-  [ChromeEarlGrey loadURL:URL1];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
-  [ChromeEarlGrey loadURL:URL2];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage2];
-  [ChromeEarlGrey loadURL:URL3];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL3]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage3]);
   [[self class] closeAllTabs];
 
   // Load page 1 in non-incognito and page 2 in incognito.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:URL1];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
 
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey loadURL:URL2];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
 
   // Open page 3 in non-incognito.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:URL3];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL3]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage3]);
 
   [ChromeEarlGreyUI focusOmniboxAndType:base::SysUTF8ToNSString(URL3.host())];
 
@@ -216,9 +230,10 @@
       assertWithMatcher:grey_nil()];
 
   // Open page 3 in incognito.
-  [ChromeEarlGrey openNewIncognitoTab];
-  [ChromeEarlGrey loadURL:URL3];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL3]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage3]);
 
   [ChromeEarlGreyUI focusOmniboxAndType:base::SysUTF8ToNSString(URL3.host())];
 
@@ -240,42 +255,47 @@
 - (void)testCloseNTPWhenSwitching {
   // Open the first page.
   GURL URL1 = self.testServer->GetURL(kPage1URL);
-  [ChromeEarlGrey loadURL:URL1];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
 
   // Open a new tab and switch to the first tab.
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()]
       performAction:grey_typeText(base::SysUTF8ToNSString(URL1.host()))];
   [[EarlGrey selectElementWithMatcher:SwitchTabElementForUrl(URL1)]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
 
   // Check that the other tab is closed.
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 - (void)testDontCloseNTPWhenSwitchingWithForwardHistory {
   // Open the first page.
   GURL URL1 = self.testServer->GetURL(kPage1URL);
-  [ChromeEarlGrey loadURL:URL1];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
 
   // Open a new tab, navigate to a page and go back to have forward history.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:URL1];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   // Navigate to the other tab.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()]
       performAction:grey_typeText(base::SysUTF8ToNSString(URL1.host()))];
   [[EarlGrey selectElementWithMatcher:SwitchTabElementForUrl(URL1)]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
 
   // Check that the other tab is not closed.
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests that switching to closed tab opens the tab in foreground, except if it
@@ -284,13 +304,16 @@
   GURL URL1 = self.testServer->GetURL(kPage1URL);
 
   // Open the first page.
-  [ChromeEarlGrey loadURL:URL1];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
 
   // Open a new tab and load another URL.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kPage2URL)];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kPage2URL)]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
 
   // Start typing url of the first page.
   [ChromeEarlGreyUI focusOmniboxAndType:base::SysUTF8ToNSString(kPage1URL)];
@@ -301,15 +324,16 @@
 
   // Close the first page.
   chrome_test_util::CloseTabAtIndex(0);
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Try to switch to the first tab.
   [[EarlGrey selectElementWithMatcher:SwitchTabElementForUrl(URL1)]
       performAction:grey_tap()];
 
   // Check that the URL has been opened in a new foreground tab.
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests that having multiple suggestions with corresponding opened tabs display
@@ -317,17 +341,19 @@
 - (void)testMultiplePageOpened {
   // Open the first page.
   GURL URL1 = self.testServer->GetURL(kPage1URL);
-  [ChromeEarlGrey loadURL:URL1];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage1]);
 
   // Open the second page in a new tab.
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   GURL URL2 = self.testServer->GetURL(kPage2URL);
-  [ChromeEarlGrey loadURL:URL2];
-  [ChromeEarlGrey waitForWebViewContainingText:kPage2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPage2]);
 
   // Start typing url of the two opened pages in a new tab.
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()]
       performAction:grey_typeText(@"page")];
 
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.h b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.h
index 4ceac98..6c08fdd 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.h
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.h
@@ -8,12 +8,15 @@
 #import <UIKit/UIKit.h>
 
 @protocol AutocompleteSuggestion;
+@protocol FaviconRetriever;
 @protocol ImageRetriever;
 @class OmniboxPopupRowCell;
-@protocol FaviconRetriever;
 
 namespace {
 NSString* OmniboxPopupRowCellReuseIdentifier = @"OmniboxPopupRowCell";
+// This mimimum height causes most of the rows to be the same height. Some have
+// multiline answers, so those heights may be taller than this minimum.
+const CGFloat kOmniboxPopupCellMinimumHeight = 58;
 }  // namespace
 
 // Protocol for informing delegate that the trailing button for this cell
@@ -44,6 +47,12 @@
 @property(nonatomic, assign)
     UISemanticContentAttribute omniboxSemanticContentAttribute;
 
+// Whether the table row separator appears. This can't use the default
+// UITableView separators because the leading edge of the separator must be
+// aligned with the text, which is positioned using a layout guide, so the
+// tableView's separatorInsets can't be calculated.
+@property(nonatomic, assign) BOOL showsSeparator;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_OMNIBOX_POPUP_OMNIBOX_POPUP_ROW_CELL_H_
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm
index 49ffeaaa..8bc600086 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm
@@ -7,6 +7,7 @@
 #include "base/feature_list.h"
 #include "base/logging.h"
 #include "components/omnibox/common/omnibox_features.h"
+#import "ios/chrome/browser/ui/colors/MDCPalette+CrAdditions.h"
 #import "ios/chrome/browser/ui/elements/extended_touch_target_button.h"
 #import "ios/chrome/browser/ui/omnibox/popup/autocomplete_suggestion.h"
 #import "ios/chrome/browser/ui/omnibox/popup/favicon_retriever.h"
@@ -26,7 +27,6 @@
 
 namespace {
 const CGFloat kImageViewCornerRadius = 7;
-const CGFloat kRowMinimumHeight = 58;
 const CGFloat kTextTopMargin = 6;
 const CGFloat kTrailingButtonSize = 24;
 const CGFloat kTrailingButtonTrailingMargin = 14;
@@ -59,6 +59,8 @@
 @property(nonatomic, strong) ExtendedTouchTargetButton* trailingButton;
 // Trailing image view for images from suggestions (e.g. weather).
 @property(nonatomic, strong) UIImageView* answerImageView;
+// Separator line for adjacent cells.
+@property(nonatomic, strong) UIView* separator;
 
 @end
 
@@ -112,6 +114,11 @@
                                         forAxis:
                                             UILayoutConstraintAxisHorizontal];
 
+    _separator = [[UIView alloc] initWithFrame:CGRectZero];
+    _separator.translatesAutoresizingMaskIntoConstraints = NO;
+    _separator.backgroundColor = [MDCPalette.cr_greyPalette tint200];
+    _separator.hidden = YES;
+
     _incognito = NO;
 
     self.backgroundColor = [UIColor clearColor];
@@ -134,11 +141,12 @@
 - (void)setupLayout {
   [self.contentView addSubview:self.leadingImageView];
   [self.contentView addSubview:self.textStackView];
+  [self.contentView addSubview:self.separator];
 
   [NSLayoutConstraint activateConstraints:@[
     // Row has a minimum height.
     [self.contentView.heightAnchor
-        constraintGreaterThanOrEqualToConstant:kRowMinimumHeight],
+        constraintGreaterThanOrEqualToConstant:kOmniboxPopupCellMinimumHeight],
 
     // Position leadingImageView at the leading edge of the view.
     // Leave the horizontal position unconstrained as that will be added via a
@@ -158,6 +166,15 @@
                                     constant:kTextTopMargin],
     [self.textStackView.centerYAnchor
         constraintEqualToAnchor:self.contentView.centerYAnchor],
+
+    [self.separator.bottomAnchor
+        constraintEqualToAnchor:self.contentView.bottomAnchor],
+    [self.separator.trailingAnchor
+        constraintEqualToAnchor:self.contentView.trailingAnchor],
+    [self.separator.heightAnchor
+        constraintEqualToConstant:1.0f / UIScreen.mainScreen.scale],
+    [self.separator.leadingAnchor
+        constraintEqualToAnchor:self.textStackView.leadingAnchor],
   ]];
 
   // If optional views have internal constraints (height is constant, etc.),
@@ -256,6 +273,14 @@
   self.textStackView.semanticContentAttribute = omniboxSemanticContentAttribute;
 }
 
+- (BOOL)showsSeparator {
+  return self.separator.hidden;
+}
+
+- (void)setShowsSeparator:(BOOL)showsSeparator {
+  self.separator.hidden = !showsSeparator;
+}
+
 - (void)prepareForReuse {
   [super prepareForReuse];
 
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
index 319a177..3e4dd1c 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
@@ -22,7 +22,7 @@
   [super viewDidLoad];
 
   self.tableView.rowHeight = UITableViewAutomaticDimension;
-  self.tableView.estimatedRowHeight = 44;
+  self.tableView.estimatedRowHeight = kOmniboxPopupCellMinimumHeight;
 
   [self.tableView registerClass:[OmniboxPopupRowCell class]
          forCellReuseIdentifier:OmniboxPopupRowCellReuseIdentifier];
@@ -102,6 +102,8 @@
                            forIndexPath:indexPath];
   [cell setupWithAutocompleteSuggestion:self.currentResult[indexPath.row]
                               incognito:self.incognito];
+  cell.showsSeparator =
+      (NSUInteger)indexPath.row < self.currentResult.count - 1;
   cell.delegate = self;
   cell.faviconRetriever = self.faviconRetriever;
   cell.imageRetriever = self.imageRetriever;
diff --git a/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm b/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm
index 375989e..daad6e2a 100644
--- a/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/shortcuts/shortcuts_egtest.mm
@@ -15,6 +15,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "net/test/embedded_test_server/http_request.h"
@@ -82,7 +83,7 @@
       base::BindRepeating(&StandardResponse));
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
 
-  [ChromeEarlGrey clearBrowsingHistory];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   [self prepareMostVisitedTiles];
   // Clear pasteboard
   [[UIPasteboard generalPasteboard] setItems:@[]];
@@ -121,7 +122,8 @@
   [ChromeEarlGreyUI focusOmnibox];
   [[EarlGrey selectElementWithMatcher:[self mostVisitedTileMatcher]]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kTilePageLoadedString];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTilePageLoadedString]);
 }
 
 - (void)testBookmarksShortcut {
@@ -237,14 +239,15 @@
 // Tests that on the NTP the shortcuts don't show up.
 - (void)testNTPShortcutsDontShowUp {
   [[self class] closeAllTabs];
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 
   // Tap the fake omnibox.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::FakeOmnibox()]
       performAction:grey_tap()];
   // Wait for the real omnibox to be visible.
-  [ChromeEarlGrey
-      waitForElementWithMatcherSufficientlyVisible:chrome_test_util::Omnibox()];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+                          chrome_test_util::Omnibox()]);
 
   // The shortcuts should not show up here.
   // The shortcuts are similar to the NTP tiles, so in this test it's necessary
@@ -259,21 +262,23 @@
 
 - (void)navigateToAPage {
   const GURL pageURL = self.testServer->GetURL(kPageURL);
-  [ChromeEarlGrey loadURL:pageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageLoadedString]);
 }
 
 - (void)prepareMostVisitedTiles {
   const GURL pageURL = self.testServer->GetURL(kTilePageURL);
-  [ChromeEarlGrey loadURL:pageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kTilePageLoadedString];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTilePageLoadedString]);
 
   // After loading URL, need to do another action before opening a new tab
   // with the icon present.
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   [[self class] closeAllTabs];
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 }
 
 - (id<GREYMatcher>)mostVisitedTileMatcher {
diff --git a/ios/chrome/browser/ui/page_info/page_info_egtest.mm b/ios/chrome/browser/ui/page_info/page_info_egtest.mm
index c26071a..8dbd79e 100644
--- a/ios/chrome/browser/ui/page_info/page_info_egtest.mm
+++ b/ios/chrome/browser/ui/page_info/page_info_egtest.mm
@@ -11,6 +11,7 @@
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -35,7 +36,7 @@
                              errorOrNil:nil];
   }
 
-  [ChromeEarlGrey loadURL:GURL("https://invalid")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("https://invalid")]);
   [ChromeEarlGreyUI openToolsMenu];
   [[[EarlGrey
       selectElementWithMatcher:grey_allOf(grey_accessibilityID(
diff --git a/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm
index 7b806459..3a1b1c2 100644
--- a/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_accessibility_egtest.mm
@@ -112,10 +112,10 @@
   _creditCard2 = autofill::test::GetCreditCard2();
   CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:_creditCard2]);
 
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kPaymentRequestDemoPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kPaymentRequestDemoPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 }
 
 #pragma mark - Tests
diff --git a/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm
index ca0e51e..14656a8 100644
--- a/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_can_make_payment_egtest.mm
@@ -58,9 +58,10 @@
 - (void)testCanMakePaymentIsSupported {
   CHROME_EG_ASSERT_NO_ERROR(
       [self addCreditCard:autofill::test::GetCreditCard()]);  // visa.
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"true"}];
 }
@@ -75,22 +76,25 @@
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
                                           kToolsMenuNewIncognitoTabId)]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForIncognitoTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"true"}];
 }
 
 // Tests canMakePayment() when visa is required, but user doesn't have one.
 - (void)testCanMakePaymentIsNotSupported {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
@@ -103,11 +107,12 @@
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
                                           kToolsMenuNewIncognitoTabId)]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForIncognitoTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
@@ -122,9 +127,10 @@
   CHROME_EG_ASSERT_NO_ERROR(
       [self addCreditCard:autofill::test::GetCreditCard()]);  // visa.
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
@@ -145,13 +151,15 @@
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(
                                           kToolsMenuNewIncognitoTabId)]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForIncognitoTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
@@ -186,17 +194,18 @@
         @"available.");
   }
 
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentCreditCardPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kCanMakePaymentCreditCardPage)]);
 
   // Query visa payment method.
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // User does not have a visa card.
   [self waitForWebViewContainingTexts:{"false"}];
 
   // Query Mastercard payment method.
-  [ChromeEarlGrey tapWebViewElementWithID:@"other-buy"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"other-buy"]);
 
   // Query quota exceeded.
   [self
@@ -207,13 +216,14 @@
       [self addCreditCard:autofill::test::GetCreditCard()]);  // visa.
 
   // Query visa payment method.
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // User has a visa card. While the query is cached, result is always fresh.
   [self waitForWebViewContainingTexts:{"true"}];
 
   // Query Mastercard payment method.
-  [ChromeEarlGrey tapWebViewElementWithID:@"other-buy"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"other-buy"]);
 
   // Query quota exceeded.
   [self
@@ -251,18 +261,21 @@
         @"available.");
   }
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(
-                              kCanMakePaymentMethodIdentifierPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(
+                                  kCanMakePaymentMethodIdentifierPage)]);
 
   // Query basic-card payment method with "supportedNetworks": ["visa"] in the
   // payment method specific data.
-  [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicVisa"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicVisa"]);
 
   // User does not have a visa card.
   [self waitForWebViewContainingTexts:{"false"}];
 
   // Query basic-card payment method without "supportedNetworks" parameter.
-  [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicCard"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicCard"]);
 
   // Query quota exceeded.
   [self
@@ -274,13 +287,15 @@
 
   // Query basic-card payment method with "supportedNetworks": ["visa"] in the
   // payment method specific data.
-  [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicVisa"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicVisa"]);
 
   // User has a visa card. While the query is cached, result is always fresh.
   [self waitForWebViewContainingTexts:{"true"}];
 
   // Query basic-card payment method without "supportedNetworks" parameter.
-  [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicCard"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"checkBasicCard"]);
 
   // Query quota exceeded.
   [self
diff --git a/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm
index 4dd64e0..d225e71 100644
--- a/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_cancel_pay_abort_egtest.mm
@@ -52,15 +52,17 @@
 
 // Tests that navigating to a URL closes the Payment Request UI.
 - (void)testOpenAndNavigateToURL {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
       assertWithMatcher:grey_notNil()];
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]);
 
   // Confirm that the Payment Request UI is not showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -69,15 +71,16 @@
 
 // Tests that reloading the page closes the Payment Request UI.
 - (void)testOpenAndReload {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
       assertWithMatcher:grey_notNil()];
 
-  [ChromeEarlGrey reload];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
 
   // Confirm that the Payment Request UI is not showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -86,15 +89,16 @@
 
 // Tests that navigating to the previous page closes the Payment Request UI.
 - (void)testOpenAndNavigateBack {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
       assertWithMatcher:grey_notNil()];
 
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   // Confirm that the Payment Request UI is not showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -110,9 +114,10 @@
         @"available.");
   }
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -140,9 +145,10 @@
         @"available.");
   }
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -175,9 +181,10 @@
   card.set_billing_address_id(profile.guid());
   CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:card]);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -211,15 +218,16 @@
 
 // Tests that calling request.abort() successfully aborts the Payment Request.
 - (void)testAbort {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kAbortPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
       assertWithMatcher:grey_notNil()];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"abort"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"abort"]);
 
   // Confirm that the error confirmation UI is showing.
   [[EarlGrey
diff --git a/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm
index 5c80300..d60aff3 100644
--- a/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_data_url_egtest.mm
@@ -7,6 +7,7 @@
 #import "ios/chrome/browser/ui/payments/payment_request_egtest_base.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -24,7 +25,7 @@
 
 // Tests that PaymentRequest's constructor throws a SecurityError.
 - (void)testSecurityError {
-  [ChromeEarlGrey
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       loadURL:GURL("data:text/html,<html><head><meta name=\"viewport\" "
                    "content=\"width=device-width, initial-scale=1, "
                    "maximum-scale=1\"></head><body><button id=\"buy\" "
@@ -34,9 +35,9 @@
                    "'1.00'}}})).show(); } "
                    "catch(e) { document.getElementById('result').innerHTML = "
                    "e; }\">Data URL Test</button><div "
-                   "id='result'></div></body></html>")];
+                   "id='result'></div></body></html>")]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"SecurityError",
                                        "Failed to construct 'PaymentRequest': "
diff --git a/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm
index e0c6c65e..b637d41b 100644
--- a/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_debit_egtest.mm
@@ -99,11 +99,13 @@
   featureList.InitAndEnableFeature(
       payments::features::kReturnGooglePayInBasicCard);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]);
 
   [self addServerCardWithType:DEBIT];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"]);
 
   [self waitForWebViewContainingTexts:{"true"}];
 }
@@ -114,23 +116,27 @@
   featureList.InitAndEnableFeature(
       payments::features::kReturnGooglePayInBasicCard);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]);
 
   [self addServerCardWithType:UNKNOWN];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"]);
 
   [self waitForWebViewContainingTexts:{"true"}];
 }
 
 // Tests that canMakePayment() resolves with false with credit or prepaid cards.
 - (void)testCannotMakePaymentWithCreditAndPrepaidCard {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]);
 
   [self addServerCardWithType:CREDIT];
   [self addServerCardWithType:PREPAID];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
@@ -141,11 +147,12 @@
   featureList.InitAndEnableFeature(
       payments::features::kReturnGooglePayInBasicCard);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]);
 
   [self addServerCardWithType:DEBIT];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -159,11 +166,12 @@
 
 // Tests that an "unknown" card is not preselected.
 - (void)testUnknownCardTypeIsNotPreselected {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]);
 
   [self addServerCardWithType:UNKNOWN];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -183,9 +191,10 @@
   card.set_billing_address_id(_profile->guid());
   CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:card]);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kDebitPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
diff --git a/ios/chrome/browser/ui/payments/payment_request_egtest_base.mm b/ios/chrome/browser/ui/payments/payment_request_egtest_base.mm
index 0bb82f6..2936e218 100644
--- a/ios/chrome/browser/ui/payments/payment_request_egtest_base.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_egtest_base.mm
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #import "ios/chrome/browser/ui/payments/payment_request_egtest_base.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 
 #import <EarlGrey/EarlGrey.h>
 
@@ -21,6 +22,7 @@
 #include "ios/chrome/browser/payments/ios_payment_request_cache_factory.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/testing/nserror_util.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -129,7 +131,8 @@
 
 - (void)waitForWebViewContainingTexts:(const std::vector<std::string>&)texts {
   for (const std::string& text : texts)
-    [ChromeEarlGrey waitForWebViewContainingText:text];
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewContainingText:text]);
 }
 
 - (autofill::PersonalDataManager*)personalDataManager {
@@ -139,7 +142,8 @@
 - (void)loadTestPage:(const std::string&)page {
   std::string fullPath = base::StringPrintf(
       "https://components/test/data/payments/%s", page.c_str());
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(fullPath)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(fullPath)]);
 }
 
 - (void)payWithCreditCardUsingCVC:(NSString*)cvc {
diff --git a/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm
index 7c85bca..d3bfec4 100644
--- a/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_journey_logger_egtest.mm
@@ -73,7 +73,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_no_shipping_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
   [self payWithCreditCardUsingCVC:@"123"];
 
   // Make sure the correct events were logged.
@@ -129,7 +129,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_bobpay_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
   [self waitForWebViewContainingTexts:{"rejected"}];
 
   FailureBlock failureBlock = ^(NSString* error) {
@@ -193,8 +193,9 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_multiple_show_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"showAgain"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"showAgain"]);
   [self payWithCreditCardUsingCVC:@"123"];
 
   // Trying to show the same request twice is not considered a concurrent
@@ -267,7 +268,7 @@
 
   [self loadTestPage:
             "payment_request_contact_details_and_free_shipping_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
   [self payWithCreditCardUsingCVC:@"123"];
 
   FailureBlock failureBlock = ^(NSString* error) {
@@ -340,7 +341,7 @@
 
   [self loadTestPage:
             "payment_request_contact_details_and_free_shipping_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId(
                                    IDS_CANCEL)] performAction:grey_tap()];
@@ -417,7 +418,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_contact_details_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
   [self payWithCreditCardUsingCVC:@"123"];
 
   FailureBlock failureBlock = ^(NSString* error) {
@@ -491,7 +492,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_contact_details_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId(
                                    IDS_CANCEL)] performAction:grey_tap()];
@@ -571,7 +572,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_free_shipping_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
   [self payWithCreditCardUsingCVC:@"123"];
 
   FailureBlock failureBlock = ^(NSString* error) {
@@ -646,7 +647,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_free_shipping_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::ButtonWithAccessibilityLabelId(
                                    IDS_CANCEL)] performAction:grey_tap()];
@@ -719,7 +720,8 @@
   chrome_test_util::HistogramTester histogramTester;
 
   [self loadTestPage:"payment_request_can_make_payment_metrics_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"queryNoShow"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"queryNoShow"]);
 
   // Navigate away to abort the Payment Request and trigger the logs.
   [self loadTestPage:"payment_request_email_test.html"];
@@ -765,7 +767,7 @@
   [self addCard1];
 
   [self loadTestPage:"payment_request_email_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Navigate away to abort the Payment Request and trigger the logs.
   [self loadTestPage:"payment_request_email_test.html"];
@@ -816,7 +818,7 @@
   [self addProfiles];  // The user has no form of payment on file.
 
   [self loadTestPage:"payment_request_email_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Navigate away to abort the Payment Request and trigger the logs.
   [self loadTestPage:"payment_request_email_test.html"];
@@ -868,7 +870,7 @@
   [self addCard2];  // AMEX is not supported by the merchant.
 
   [self loadTestPage:"payment_request_email_test.html"];
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Navigate away to abort the Payment Request and trigger the logs.
   [self loadTestPage:"payment_request_email_test.html"];
diff --git a/ios/chrome/browser/ui/payments/payment_request_misc_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_misc_egtest.mm
index 64efcca..8822751e 100644
--- a/ios/chrome/browser/ui/payments/payment_request_misc_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_misc_egtest.mm
@@ -8,6 +8,7 @@
 #import "ios/chrome/browser/ui/payments/payment_request_egtest_base.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/web/public/test/http_server/http_server.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -36,8 +37,8 @@
 
 // Tests that the page can create multiple PaymentRequest objects.
 - (void)testMultipleRequests {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kMultipleRequestsPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kMultipleRequestsPage)]);
 
   const payments::PaymentRequestCache::PaymentRequestSet& payment_requests =
       [self paymentRequestsForWebState:GetCurrentWebState()];
diff --git a/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm
index 455e23c..a98c489 100644
--- a/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_modifiers_egtest.mm
@@ -101,9 +101,10 @@
 
 // Tests that no modifier should be applied if there is no selected instrument.
 - (void)testNoModifierAppliedNoSelectedInstrument {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Verify there's no line item.
   [[EarlGrey selectElementWithMatcher:PriceCellMatcher(@"Total, USD $5.00", NO)]
@@ -113,11 +114,12 @@
 // Tests that modifiers should be applied if there is a selected local credit
 // card instrument and the modifiers are for basic-card.
 - (void)testModifierAppliedSelectedLocalInstrumentWithoutTypeOrNetwork {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]);
 
   [self addLocalCard];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_localCard)]
@@ -141,11 +143,12 @@
   featureList.InitAndEnableFeature(
       payments::features::kReturnGooglePayInBasicCard);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]);
 
   [self addServerCardWithType:CREDIT];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)]
@@ -169,11 +172,13 @@
   featureList.InitAndEnableFeature(
       payments::features::kReturnGooglePayInBasicCard);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]);
 
   [self addServerCardWithType:CREDIT];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"credit_supported_type"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"credit_supported_type"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)]
@@ -193,11 +198,13 @@
 // Tests that no modifier should be applied if there is a selected credit card
 // instrument but the modifiers are for basic-card of mismatching type.
 - (void)testNoModifierAppliedSelectedInstrumentWithMismatchingSupportedType {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]);
 
   [self addServerCardWithType:CREDIT];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"debit_supported_type"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"debit_supported_type"]);
 
   // Verify there's no line item.
   [[EarlGrey selectElementWithMatcher:PriceCellMatcher(@"Total, USD $5.00", NO)]
@@ -211,11 +218,13 @@
   featureList.InitAndEnableFeature(
       payments::features::kReturnGooglePayInBasicCard);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]);
 
   [self addServerCardWithType:CREDIT];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"mastercard_any_supported_type"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebViewElementWithID:@"mastercard_any_supported_type"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)]
@@ -235,11 +244,13 @@
 // Tests that no modifier should be applied if there is a selected credit card
 // instrument but the modifiers are for basic-card of mismatching network.
 - (void)testNoModifierAppliedSelectedInstrumentWithMismatchingSupportedNetwork {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]);
 
   [self addLocalCard];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"mastercard_any_supported_type"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebViewElementWithID:@"mastercard_any_supported_type"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_localCard)]
@@ -258,11 +269,13 @@
   featureList.InitAndEnableFeature(
       payments::features::kReturnGooglePayInBasicCard);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kModifiersPage)]);
 
   [self addServerCardWithType:CREDIT];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"mastercard_supported_network"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"mastercard_supported_network"]);
 
   // Verify there's a selected payment method.
   [[EarlGrey selectElementWithMatcher:PaymentMethodCellMatcher(_serverCard)]
diff --git a/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm
index 61601c0..cc893ab 100644
--- a/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_payment_app_egtest.mm
@@ -7,6 +7,7 @@
 #include "base/ios/ios_util.h"
 #import "ios/chrome/browser/ui/payments/payment_request_egtest_base.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/web/public/test/http_server/http_server.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -41,9 +42,10 @@
         @"available.");
   }
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kBobPayPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kBobPayPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   [self waitForWebViewContainingTexts:{"NotSupportedError",
                                        "The payment method is not supported"}];
@@ -52,9 +54,11 @@
 // Tests that the Promise returned by canMakePayment() gets resolved with false
 // if the requested payment methods are payment apps that are not installed.
 - (void)testCanMakePaymentPaymentAppNotInstalled {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kBobPayPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kBobPayPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"canMakePayment"]);
 
   [self waitForWebViewContainingTexts:{"false"}];
 }
diff --git a/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm
index da02630..22da94e0 100644
--- a/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_payment_method_identifier_egtest.mm
@@ -10,6 +10,7 @@
 #import "ios/chrome/browser/ui/payments/payment_request_egtest_base.h"
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/web/public/test/http_server/http_server.h"
 #import "ios/web/public/test/web_view_interaction_test_util.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -42,10 +43,10 @@
 
 // One network is specified in 'basic-card' data, one in supportedMethods.
 - (void)testBasicCardNetworksSpecified {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   const payments::PaymentRequestCache::PaymentRequestSet& requests =
       [self paymentRequestsForWebState:GetCurrentWebState()];
@@ -63,10 +64,11 @@
 // Only specifying 'basic-card' with no supportedNetworks means all networks are
 // supported.
 - (void)testBasicCardNoNetworksSpecified {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buyBasicCard"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"buyBasicCard"]);
 
   const payments::PaymentRequestCache::PaymentRequestSet& requests =
       [self paymentRequestsForWebState:GetCurrentWebState()];
@@ -89,8 +91,8 @@
 // Specifying 'basic-card' after having explicitely included a network yields
 // the expected order when in different supportedMethods lists.
 - (void)testBasicCardNetworkThenBasicCardDifferentList {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]);
 
   web::test::ExecuteJavaScript(GetCurrentWebState(),
                                "buyHelper([{"
@@ -121,8 +123,8 @@
 // Specifying 'basic-card' after having explicitely included a network yields
 // the expected order when in the same supportedMethods list.
 - (void)testBasicCardNetworkThenBasicCardSameList {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]);
 
   web::test::ExecuteJavaScript(GetCurrentWebState(),
                                "buyHelper([{"
@@ -153,8 +155,8 @@
 // Specifying 'basic-card' with some networks after having explicitely included
 // the same networks does not yield duplicates and has the expected order.
 - (void)testBasicCardNetworkThenBasicCardWithSameNetwork {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]);
 
   web::test::ExecuteJavaScript(
       GetCurrentWebState(),
@@ -184,8 +186,8 @@
 // A url-based payment method identifier is only supported if it has an https
 // scheme.
 - (void)testValidURLBasedPaymentMethodIdentifier {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]);
 
   web::test::ExecuteJavaScript(GetCurrentWebState(),
                                "buyHelper([{"
@@ -207,8 +209,8 @@
 
 // An invalid URL-based payment method identifier results in a RangeError.
 - (void)testURLBasedPaymentMethodIdentifierWithInvalidScheme {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]);
 
   web::test::ExecuteJavaScript(GetCurrentWebState(),
                                "buyHelper([{"
@@ -229,8 +231,8 @@
 
 // An invalid standard payment method identifier results in a RangeError.
 - (void)testStandardPaymentMethodIdentifierWithInvalidCharacters {
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kPaymentMethodIdentifierPage)]);
 
   web::test::ExecuteJavaScript(
       GetCurrentWebState(),
diff --git a/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm
index 132e867..7a52850 100644
--- a/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_payment_response_egtest.mm
@@ -68,9 +68,10 @@
   card.set_billing_address_id(billingAddress.guid());
   CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:card]);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Tap the buy button.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
@@ -135,9 +136,10 @@
   shippingAddress.set_use_count(2000);
   CHROME_EG_ASSERT_NO_ERROR([self addAutofillProfile:shippingAddress]);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kFreeShippingPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kFreeShippingPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Tap the buy button.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
@@ -189,9 +191,10 @@
   card.set_billing_address_id(billingAddress.guid());
   CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:card]);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kContactDetailsPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kContactDetailsPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Tap the buy button.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
@@ -225,9 +228,10 @@
   card.set_billing_address_id(billingAddress.guid());
   CHROME_EG_ASSERT_NO_ERROR([self addCreditCard:card]);
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kRequestEmailPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kRequestEmailPage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Tap the buy button.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
diff --git a/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm
index b33ef4074..b5ba08c 100644
--- a/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_show_egtest.mm
@@ -62,9 +62,11 @@
 // Tests when PaymentRequest.show() is called without a promise the payment
 // sheet is displayed with the payment details.
 - (void)testBuyWithNoPromise {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buyWithNoPromise"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"buyWithNoPromise"]);
 
   // Confirm that the Payment Request UI is showing.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::PaymentRequestView()]
@@ -85,7 +87,8 @@
 // the promise resolves, the payment sheet displays the payment details and the
 // Buy button is enabled.
 - (void)testBuyWithResolvingPromise {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)]);
 
   // Disable EarlGrey's synchronization. Needed likely due to
   // MDCActivityIndicator being present on the payment request view.
@@ -93,7 +96,8 @@
           setValue:@NO
       forConfigKey:kGREYConfigKeySynchronizationEnabled];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buyWithResolvingPromise"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"buyWithResolvingPromise"]);
 
   // Wait until the payment request view shows.
   ConditionBlock condition = ^{
@@ -137,7 +141,8 @@
 // is initially displayed with a spinner and the Buy button is not enabled. Once
 // the promise rejects, the payment is aborted.
 - (void)testBuyWithRejectingPromise {
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kShowPromisePage)]);
 
   // Disable EarlGrey's synchronization. Needed likely due to
   // MDCActivityIndicator being present on the payment request view.
@@ -145,7 +150,8 @@
           setValue:@NO
       forConfigKey:kGREYConfigKeySynchronizationEnabled];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"buyWithRejectingPromise"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"buyWithRejectingPromise"]);
 
   // Wait until the payment request view shows.
   ConditionBlock condition = ^{
diff --git a/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm b/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm
index 361e571..eaaa728 100644
--- a/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm
+++ b/ios/chrome/browser/ui/payments/payment_request_use_stats_egtest.mm
@@ -67,7 +67,7 @@
 
 // Completes the Payment Request.
 - (void)completePayment {
-  [ChromeEarlGrey tapWebViewElementWithID:@"buy"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"buy"]);
 
   // Tap the buy button.
   [[EarlGrey selectElementWithMatcher:ButtonWithAccessibilityLabelId(
@@ -113,7 +113,8 @@
   EXPECT_EQ(1U, initialBilling->use_count());
   EXPECT_EQ(kSomeDate, initialBilling->use_date());
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kNoShippingPage)]);
 
   testClock.SetNow(kSomeLaterDate);
   [self completePayment];
@@ -151,7 +152,8 @@
   EXPECT_EQ(3U, initialShipping->use_count());
   EXPECT_EQ(kSomeDate, initialShipping->use_date());
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kFreeShippingPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kFreeShippingPage)]);
 
   testClock.SetNow(kSomeLaterDate);
   [self completePayment];
@@ -183,7 +185,8 @@
   EXPECT_EQ(3U, initialContact->use_count());
   EXPECT_EQ(kSomeDate, initialContact->use_date());
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kRequestNamePage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kRequestNamePage)]);
 
   testClock.SetNow(kSomeLaterDate);
   [self completePayment];
@@ -215,8 +218,8 @@
   EXPECT_EQ(3U, initialAddress->use_count());
   EXPECT_EQ(kSomeDate, initialAddress->use_date());
 
-  [ChromeEarlGrey
-      loadURL:web::test::HttpServer::MakeUrl(kContactDetailsFreeShippingPage)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kContactDetailsFreeShippingPage)]);
 
   testClock.SetNow(kSomeLaterDate);
   [self completePayment];
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm
index 5613455..22575cb 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_egtest.mm
@@ -12,6 +12,7 @@
 #include "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -67,10 +68,10 @@
   web::test::SetUpSimpleHttpServer(responses);
 
   // Load 4 pages.
-  [ChromeEarlGrey loadURL:URL1];
-  [ChromeEarlGrey loadURL:URL2];
-  [ChromeEarlGrey loadURL:URL3];
-  [ChromeEarlGrey loadURL:URL4];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL3]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL4]);
 
   // Long press on back button.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
@@ -157,7 +158,7 @@
   const GURL URL = web::test::HttpServer::MakeUrl(kPDFURL);
 
   // Navigate to a mock pdf and verify that the find button is disabled.
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   [ChromeEarlGreyUI openToolsMenu];
   [[EarlGrey
       selectElementWithMatcher:grey_accessibilityID(kToolsMenuFindInPageId)]
diff --git a/ios/chrome/browser/ui/popup_menu/request_desktop_mobile_site_egtest.mm b/ios/chrome/browser/ui/popup_menu/request_desktop_mobile_site_egtest.mm
index 6139ffe..8be3e09 100644
--- a/ios/chrome/browser/ui/popup_menu/request_desktop_mobile_site_egtest.mm
+++ b/ios/chrome/browser/ui/popup_menu/request_desktop_mobile_site_egtest.mm
@@ -14,6 +14,7 @@
 #import "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/web/public/test/http_server/data_response_provider.h"
@@ -103,18 +104,23 @@
       new UserAgentResponseProvider());
   web::test::SetUpHttpServer(std::move(provider));
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")]);
   // Verify initial reception of the mobile site.
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
 
   // Verify that desktop user agent propagates.
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://2.com")];
-  [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://2.com")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
 }
 
 // Tests that requesting desktop site of a page works and desktop user agent
@@ -124,19 +130,24 @@
       new UserAgentResponseProvider());
   web::test::SetUpHttpServer(std::move(provider));
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")]);
   // Verify initial reception of the mobile site.
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
 
   // Verify that desktop user agent does not propagate to new tab.
   [ChromeEarlGreyUI openNewTab];
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://2.com")];
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://2.com")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 }
 
 // Tests that requesting desktop site of a page works and going back re-opens
@@ -146,19 +157,23 @@
       new UserAgentResponseProvider());
   web::test::SetUpHttpServer(std::move(provider));
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")]);
   // Verify initial reception of the mobile site.
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
 
   // Verify that going back returns to the mobile site.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 }
 
 // Tests that requesting mobile site of a page works and the user agent
@@ -168,23 +183,29 @@
       new UserAgentResponseProvider());
   web::test::SetUpHttpServer(std::move(provider));
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")]);
   // Verify initial reception of the mobile site.
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
 
   // Request and verify reception of the mobile site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestMobileButton() performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 
   // Verify that mobile user agent propagates.
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://2.com")];
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://2.com")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 }
 
 // Tests that requesting mobile site of a page works and going back re-opens
@@ -194,24 +215,29 @@
       new UserAgentResponseProvider());
   web::test::SetUpHttpServer(std::move(provider));
 
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl("http://1.com")]);
   // Verify initial reception of the mobile site.
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
 
   // Request and verify reception of the mobile site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestMobileButton() performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 
   // Verify that going back returns to the desktop site.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
 }
 
 // Tests that requesting desktop site button is not enabled on new tab pages.
@@ -225,7 +251,7 @@
 
 // Tests that requesting desktop site button is not enabled on WebUI pages.
 - (void)testRequestDesktopSiteNotEnabledOnWebUIPage {
-  [ChromeEarlGrey loadURL:GURL("chrome://version")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://version")]);
 
   // Verify tapping on request desktop button is no-op.
   [ChromeEarlGreyUI openToolsMenu];
@@ -238,33 +264,40 @@
 // desktop User Agent.
 - (void)testAppVersionJSAPIWithDesktopUserAgent {
   web::test::SetUpFileBasedHttpServer();
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUserAgentTestURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kUserAgentTestURL)]);
   // Verify initial reception of the mobile site.
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
 }
 
 // Tests that navigator.appVersion JavaScript API returns correct string for
 // mobile User Agent.
 - (void)testAppVersionJSAPIWithMobileUserAgent {
   web::test::SetUpFileBasedHttpServer();
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUserAgentTestURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kUserAgentTestURL)]);
   // Verify initial reception of the mobile site.
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 
   // Request and verify reception of the desktop site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestDesktopButton() performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDesktopSiteLabel]);
 
   // Request and verify reception of the mobile site.
   [ChromeEarlGreyUI openToolsMenu];
   [RequestMobileButton() performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kMobileSiteLabel]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/print/print_controller_egtest.mm b/ios/chrome/browser/ui/print/print_controller_egtest.mm
index 1a7e9eb9..bdff2940 100644
--- a/ios/chrome/browser/ui/print/print_controller_egtest.mm
+++ b/ios/chrome/browser/ui/print/print_controller_egtest.mm
@@ -13,6 +13,7 @@
 #include "ios/chrome/test/app/navigation_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/testing/earl_grey/disabled_test_macros.h"
@@ -58,7 +59,8 @@
   web::test::SetUpSimpleHttpServer(responses);
 
   chrome_test_util::LoadUrl(url);
-  [ChromeEarlGrey waitForWebViewContainingText:response];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:response]);
 
   [self printCurrentPage];
 }
diff --git a/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm b/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm
index 3236b90..c231d56e 100644
--- a/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm
+++ b/ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller_egtest.mm
@@ -29,6 +29,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/base/scoped_block_swizzler.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -115,8 +116,9 @@
   // Tap the omnibox to get the keyboard accessory view to show up.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::NewTabPageOmnibox()]
       performAction:grey_tap()];
-  [ChromeEarlGrey
-      waitForElementWithMatcherSufficientlyVisible:chrome_test_util::Omnibox()];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+                          chrome_test_util::Omnibox()]);
 
   // Tap the QR Code scanner button in the keyboard accessory view.
   id<GREYMatcher> matcher =
@@ -775,7 +777,8 @@
   } else {
     TapKeyboardReturnKeyInOmniboxWithText(result);
   }
-  [ChromeEarlGrey waitForWebViewContainingText:response];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:response]);
 
   // Press the back button to get back to the NTP.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
index b627612..7cada1d 100644
--- a/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
+++ b/ios/chrome/browser/ui/reading_list/reading_list_egtest.mm
@@ -33,6 +33,7 @@
 #import "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
@@ -400,7 +401,8 @@
 void AssertIsShowingDistillablePageNoNativeContent(
     bool online,
     const GURL& distillable_url) {
-  [ChromeEarlGrey waitForWebViewContainingText:kContentToKeep];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kContentToKeep]);
 
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           distillable_url.GetContent())]
@@ -408,11 +410,15 @@
 
   // Test that the offline and online pages are properly displayed.
   if (online) {
-    [ChromeEarlGrey waitForWebViewContainingText:kContentToRemove];
-    [ChromeEarlGrey waitForWebViewContainingText:kContentToKeep];
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewContainingText:kContentToRemove]);
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewContainingText:kContentToKeep]);
   } else {
-    [ChromeEarlGrey waitForWebViewNotContainingText:kContentToRemove];
-    [ChromeEarlGrey waitForWebViewContainingText:kContentToKeep];
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewNotContainingText:kContentToRemove]);
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewContainingText:kContentToKeep]);
   }
 
   // Test the presence of the omnibox offline chip.
@@ -441,7 +447,8 @@
                    }),
                @"Waiting for online page.");
   } else {
-    [ChromeEarlGrey waitForStaticHTMLViewContainingText:contentToKeep];
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForStaticHTMLViewContainingText:contentToKeep]);
   }
 
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
@@ -450,12 +457,15 @@
 
   // Test that the offline and online pages are properly displayed.
   if (online) {
-    [ChromeEarlGrey
-        waitForWebViewContainingText:base::SysNSStringToUTF8(contentToKeep)];
-    [ChromeEarlGrey waitForStaticHTMLViewNotContainingText:contentToKeep];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+        waitForWebViewContainingText:base::SysNSStringToUTF8(contentToKeep)]);
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForStaticHTMLViewNotContainingText:contentToKeep]);
   } else {
-    [ChromeEarlGrey waitForWebViewNotContainingText:kContentToKeep];
-    [ChromeEarlGrey waitForStaticHTMLViewContainingText:contentToKeep];
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewNotContainingText:kContentToKeep]);
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForStaticHTMLViewContainingText:contentToKeep]);
   }
 
   // Test the presence of the omnibox offline chip.
@@ -532,13 +542,13 @@
   GURL nonDistillablePageURL(self.testServer->GetURL(kNonDistillableURL));
   std::string pageTitle(kDistillableTitle);
   // Open http://potato
-  [ChromeEarlGrey loadURL:distillablePageURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:distillablePageURL]);
 
   AddCurrentPageToReadingList();
 
   // Navigate to http://beans
-  [ChromeEarlGrey loadURL:nonDistillablePageURL];
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:nonDistillablePageURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   // Verify that an entry with the correct title is present in the reading list.
   OpenReadingList();
@@ -576,13 +586,14 @@
   std::string pageTitle(kDistillableTitle);
   GURL distillableURL = self.testServer->GetURL(kDistillableURL);
   // Open http://potato
-  [ChromeEarlGrey loadURL:distillableURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:distillableURL]);
 
   AddCurrentPageToReadingList();
 
   // Navigate to http://beans
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)];
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   // Verify that an entry with the correct title is present in the reading list.
   OpenReadingList();
@@ -613,14 +624,15 @@
   std::string pageTitle(kDistillableTitle);
   GURL distillableURL = self.testServer->GetURL(kDistillableURL);
   // Open http://potato
-  [ChromeEarlGrey loadURL:distillableURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:distillableURL]);
 
   AddCurrentPageToReadingList();
 
   // Navigate to http://beans
 
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)];
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   // Verify that an entry with the correct title is present in the reading list.
   OpenReadingList();
@@ -642,8 +654,8 @@
 
   // TODO(crbug.com/954248) This DCHECK's (but works) with slimnav disabled.
   if (base::FeatureList::IsEnabled(web::features::kSlimNavigationManager)) {
-    [ChromeEarlGrey goBack];
-    [ChromeEarlGrey goForward];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]);
     AssertIsShowingDistillablePage(false, distillableURL);
   }
 
@@ -667,13 +679,14 @@
   std::string pageTitle(kDistillableTitle);
   GURL distillableURL = self.testServer->GetURL(kDistillableURL);
   // Open http://potato
-  [ChromeEarlGrey loadURL:distillableURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:distillableURL]);
 
   AddCurrentPageToReadingList();
 
   // Navigate to http://beans
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)];
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kNonDistillableURL)]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   // Verify that an entry with the correct title is present in the reading
   OpenReadingList();
@@ -686,8 +699,8 @@
 
   AssertIsShowingDistillablePage(false, distillableURL);
 
-  [ChromeEarlGrey goBack];
-  [ChromeEarlGrey goForward];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]);
   AssertIsShowingDistillablePage(false, distillableURL);
 
   // Reload should load online page.
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm
index 2dc4e83..b49218b 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_egtest.mm
@@ -21,6 +21,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity_service.h"
@@ -44,7 +45,7 @@
 void OpenRecentTabsPanel() {
   // At least one tab is needed to be able to open the recent tabs panel.
   if (chrome_test_util::GetMainTabCount() == 0)
-    [ChromeEarlGrey openNewTab];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 
   [ChromeEarlGreyUI openToolsMenu];
   [ChromeEarlGreyUI tapToolsMenuButton:RecentTabsMenuButton()];
@@ -68,7 +69,7 @@
 @implementation RecentTabsTestCase
 
 - (void)setUp {
-  [ChromeEarlGrey clearBrowsingHistory];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey clearBrowsingHistory]);
   [super setUp];
   web::test::SetUpSimpleHttpServer(std::map<GURL, std::string>{{
       web::test::HttpServer::MakeUrl(kURLOfTestPage),
@@ -93,8 +94,9 @@
   const GURL testPageURL = web::test::HttpServer::MakeUrl(kURLOfTestPage);
 
   // Open the test page in a new tab.
-  [ChromeEarlGrey loadURL:testPageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:"hello"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testPageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"hello"]);
 
   // Open the Recent Tabs panel, check that the test page is not
   // present.
diff --git a/ios/chrome/browser/ui/sad_tab/sad_tab_view_egtest.mm b/ios/chrome/browser/ui/sad_tab/sad_tab_view_egtest.mm
index 3fc9d82..e2afb81 100644
--- a/ios/chrome/browser/ui/sad_tab/sad_tab_view_egtest.mm
+++ b/ios/chrome/browser/ui/sad_tab/sad_tab_view_egtest.mm
@@ -11,6 +11,7 @@
 #import "ios/chrome/test/app/navigation_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -92,8 +93,9 @@
 
   // Prepare a helper block to test Sad Tab navigating from and to normal pages.
   void (^loadAndCheckSimpleURL)() = ^void() {
-    [ChromeEarlGrey loadURL:simple_URL];
-    [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:simple_URL]);
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"]);
     [[EarlGrey selectElementWithMatcher:reloadSadTabTitleText()]
         assertWithMatcher:grey_nil()];
     [[EarlGrey selectElementWithMatcher:feedbackSadTabTitleContainsText()]
@@ -134,7 +136,7 @@
       grey_accessibilityID(kToolsMenuNewIncognitoTabId);
   [[EarlGrey selectElementWithMatcher:newIncognitoTabButtonMatcher]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForIncognitoTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]);
   loadAndCheckSimpleURL();
 
   // Test an initial crash, and then a second crash in Incognito mode, as above.
diff --git a/ios/chrome/browser/ui/settings/block_popups_egtest.mm b/ios/chrome/browser/ui/settings/block_popups_egtest.mm
index 20b23dd..ccc7d863 100644
--- a/ios/chrome/browser/ui/settings/block_popups_egtest.mm
+++ b/ios/chrome/browser/ui/settings/block_popups_egtest.mm
@@ -18,6 +18,7 @@
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/chrome/test/scoped_block_popups_pref.h"
@@ -132,14 +133,14 @@
 
   ScopedBlockPopupsPref prefSetter(CONTENT_SETTING_ALLOW,
                                    GetOriginalBrowserState());
-  [ChromeEarlGrey loadURL:blockPopupsURL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:blockPopupsURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Request popup and make sure the popup opened in a new tab.
   NSError* error = nil;
   chrome_test_util::ExecuteJavaScript(kOpenPopupScript, &error);
   GREYAssert(!error, @"Error during script execution: %@", error);
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // No infobar should be displayed.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::
@@ -163,8 +164,8 @@
 
   ScopedBlockPopupsPref prefSetter(CONTENT_SETTING_BLOCK,
                                    GetOriginalBrowserState());
-  [ChromeEarlGrey loadURL:blockPopupsURL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:blockPopupsURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Request popup, then make sure it was blocked and an infobar was displayed.
   // The window.open() call is run via async JS, so the infobar may not open
@@ -185,7 +186,7 @@
                                     error:&error];
                     return error == nil;
                   }] waitWithTimeout:4.0];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 // Tests that the "exceptions" section on the settings page is hidden and
diff --git a/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm b/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm
index 5649674..cccd747 100644
--- a/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/password/passwords_settings_egtest.mm
@@ -35,6 +35,7 @@
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/third_party/material_components_ios/src/components/Snackbar/src/MaterialSnackbar.h"
@@ -1496,7 +1497,7 @@
   std::map<GURL, std::string> responses;
   responses[kPasswordURL] = "<input id='password' type='password'>";
   web::test::SetUpSimpleHttpServer(responses);
-  [ChromeEarlGrey loadURL:kPasswordURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:kPasswordURL]);
 
   // Focus the password field.
   // Brings up the keyboard by tapping on one of the form's field.
diff --git a/ios/chrome/browser/ui/settings/settings_egtest.mm b/ios/chrome/browser/ui/settings/settings_egtest.mm
index 2f65735..3eb18b3 100644
--- a/ios/chrome/browser/ui/settings/settings_egtest.mm
+++ b/ios/chrome/browser/ui/settings/settings_egtest.mm
@@ -33,6 +33,7 @@
 #include "ios/chrome/test/earl_grey/accessibility_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -460,18 +461,24 @@
   web::test::SetUpSimpleHttpServerWithSetCookies(response);
 
   // Load |kUrl| and check that cookie is not set.
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponse];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponse]);
 
   NSDictionary* cookies = [ChromeEarlGrey cookies];
   GREYAssertEqual(0U, cookies.count, @"No cookie should be found.");
 
   // Visit |kUrlWithSetCookie| to set a cookie and then load |kUrl| to check it
   // is still set.
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrlWithSetCookie)];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponseWithSetCookie];
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponse];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      loadURL:web::test::HttpServer::MakeUrl(kUrlWithSetCookie)]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponseWithSetCookie]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponse]);
 
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqualObjects(kCookieValue, cookies[kCookieName],
@@ -489,8 +496,10 @@
   [self clearCookiesAndSiteData];
 
   // Reload and test that there are no cookies left.
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponse];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kUrl)]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponse]);
 
   cookies = [ChromeEarlGrey cookies];
   GREYAssertEqual(0U, cookies.count, @"No cookie should be found.");
@@ -537,14 +546,14 @@
 // Verifies that Settings opens when signed-out and in Incognito mode.
 // This tests that crbug.com/607335 has not regressed.
 - (void)testSettingsSignedOutIncognito {
-  [ChromeEarlGrey openNewIncognitoTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewIncognitoTab]);
   [ChromeEarlGreyUI openSettingsMenu];
   [[EarlGrey selectElementWithMatcher:SettingsCollectionView()]
       assertWithMatcher:grey_notNil()];
 
   [[EarlGrey selectElementWithMatcher:SettingsDoneButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey closeAllIncognitoTabs];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey closeAllIncognitoTabs]);
 }
 
 // Verifies the UI elements are accessible on the Settings page.
diff --git a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
index 72d5951..9acdc537 100644
--- a/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
+++ b/ios/chrome/browser/ui/settings/sync/utils/sync_fake_server_egtest.mm
@@ -27,6 +27,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h"
@@ -97,7 +98,7 @@
 @implementation SyncFakeServerTestCase
 
 - (void)tearDown {
-  [ChromeEarlGrey waitForBookmarksToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]);
   chrome_test_util::ClearBookmarks();
   AssertNumberOfEntities(0, syncer::BOOKMARKS);
 
@@ -361,9 +362,9 @@
   web::test::SetUpSimpleHttpServer(responses);
 
   // Load both URLs in separate tabs.
-  [ChromeEarlGrey loadURL:URL1];
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:URL2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
 
   // Sign in to sync, after opening two tabs.
   ChromeIdentity* identity = [SigninEarlGreyUtils fakeIdentity1];
@@ -558,7 +559,7 @@
 // TODO(crbug.com/646164): This is copied from bookmarks_egtest.mm and should
 // move to common location.
 - (void)addBookmark:(const GURL)url withTitle:(NSString*)title {
-  [ChromeEarlGrey waitForBookmarksToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]);
   bookmarks::BookmarkModel* bookmark_model =
       ios::BookmarkModelFactory::GetForBrowserState(
           chrome_test_util::GetOriginalBrowserState());
diff --git a/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm b/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm
index 5436056b..17fb838 100644
--- a/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm
+++ b/ios/chrome/browser/ui/side_swipe/side_swipe_egtest.mm
@@ -10,6 +10,7 @@
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/testing/earl_grey/disabled_test_macros.h"
@@ -52,22 +53,27 @@
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
 
   // Load the first page.
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Echo"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Echo"]);
 
   // Open a new Tab to have a tab to switch to.
   [ChromeEarlGreyUI openNewTab];
 
   // Load the second page in the new tab.
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/defaultresponse")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Default response"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/defaultresponse")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Default response"]);
 
   // Side swipe on the toolbar.
   [[EarlGrey selectElementWithMatcher:grey_kindOfClass(klass)]
       performAction:grey_swipeSlowInDirection(kGREYDirectionRight)];
 
   // Check that we swiped back to our web page.
-  [ChromeEarlGrey waitForWebViewContainingText:"Echo"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Echo"]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm
index 0bd2c17..1650142 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_egtest.mm
@@ -9,6 +9,7 @@
 #import "ios/chrome/browser/ui/tab_grid/tab_grid_egtest_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -142,14 +143,17 @@
 }
 
 - (void)loadTestURLs {
-  [ChromeEarlGrey loadURL:_URL1];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponse1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL1]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponse1]);
 
-  [ChromeEarlGrey loadURL:_URL2];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponse2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL2]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponse2]);
 
-  [ChromeEarlGrey loadURL:_URL3];
-  [ChromeEarlGrey waitForWebViewContainingText:kResponse3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_URL3]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kResponse3]);
 }
 
 // Test that Clear Browsing Data can be successfully done from tab grid.
diff --git a/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm b/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm
index 078d4f0..e08a4a7 100644
--- a/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm
+++ b/ios/chrome/browser/ui/tab_grid/tab_grid_transition_egtest.mm
@@ -18,6 +18,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "net/test/embedded_test_server/http_request.h"
@@ -194,15 +195,16 @@
   [self setUpTestServer];
 
   // Load a test URL in the current tab.
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]);
 
   // Enter and leave the switcher.
   ShowTabSwitcher();
   ShowTabViewController();
 
   // Verify that the original tab is visible again.
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)]);
 }
 
 // Tests exiting the switcher by tapping the new tab button or selecting new tab
@@ -217,9 +219,10 @@
   [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()];
 
   // Load a URL in this newly-created tab and verify that the tab is visible.
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]];
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)]);
 }
 
 // Tests exiting the switcher by tapping the new incognito tab button or
@@ -238,9 +241,10 @@
   [[EarlGrey selectElementWithMatcher:matcher] performAction:grey_tap()];
 
   // Load a URL in this newly-created tab and verify that the tab is visible.
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]];
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)]);
 }
 
 // Tests exiting the switcher by opening a new tab in the other tab model.
@@ -257,9 +261,10 @@
       performAction:grey_tap()];
 
   // Load a URL in this newly-created tab and verify that the tab is visible.
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:incognito_title]];
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(incognito_title)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:incognito_title]]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(incognito_title)]);
 
   // Go from incognito mode to normal mode.
   ShowTabSwitcher();
@@ -269,9 +274,10 @@
       performAction:grey_tap()];
 
   // Load a URL in this newly-created tab and verify that the tab is visible.
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:normal_title]];
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(normal_title)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:normal_title]]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(normal_title)]);
 }
 
 // Tests exiting the tab switcher by selecting a normal tab.
@@ -282,21 +288,24 @@
   [self setUpTestServer];
 
   // Create a few tabs and give them all unique titles.
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]);
   [ChromeEarlGreyUI openNewTab];
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:tab2_title]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:tab2_title]]);
   [ChromeEarlGreyUI openNewTab];
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:tab3_title]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:tab3_title]]);
 
   ShowTabSwitcher();
   SelectTab(tab1_title);
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)]);
 
   ShowTabSwitcher();
   SelectTab(tab3_title);
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab3_title)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(tab3_title)]);
 }
 
 // Tests exiting the tab switcher by selecting an incognito tab.
@@ -308,22 +317,25 @@
 
   // Create a few tabs and give them all unique titles.
   [ChromeEarlGreyUI openNewIncognitoTab];
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:tab1_title]]);
   [ChromeEarlGreyUI openNewIncognitoTab];
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:tab2_title]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:tab2_title]]);
   [ChromeEarlGreyUI openNewIncognitoTab];
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:tab3_title]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:tab3_title]]);
   [GetNormalTabModel() closeAllTabs];
 
   ShowTabSwitcher();
   SelectTab(tab1_title);
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(tab1_title)]);
 
   ShowTabSwitcher();
   SelectTab(tab3_title);
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab3_title)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(tab3_title)]);
 }
 
 // Tests exiting the tab switcher by selecting a tab in the other tab model.
@@ -333,17 +345,19 @@
   [self setUpTestServer];
 
   // Create a few tabs and give them all unique titles.
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:normal_title]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:normal_title]]);
   [ChromeEarlGreyUI openNewIncognitoTab];
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:incognito_title]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:incognito_title]]);
 
   ShowTabSwitcher();
   // Switch to the normal panel and select the one tab that is there.
   [[EarlGrey selectElementWithMatcher:TabGridOpenTabsPanelButton()]
       performAction:grey_tap()];
   SelectTab(normal_title);
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(normal_title)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(normal_title)]);
 
   ShowTabSwitcher();
   // Switch to the incognito panel and select the one tab that is there.
@@ -351,8 +365,8 @@
       performAction:grey_tap()];
 
   SelectTab(incognito_title);
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(incognito_title)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(incognito_title)]);
 }
 
 // Tests switching back and forth between the normal and incognito BVCs.
@@ -377,31 +391,32 @@
 - (void)testRotationsWhileSwitcherIsNotActive {
   NSString* tab_title = @"NormalTabLongerStringForRotationTest";
   [self setUpTestServer];
-  [ChromeEarlGrey loadURL:[self makeURLForTitle:tab_title]];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:[self makeURLForTitle:tab_title]]);
 
   // Show the tab switcher and return to the BVC, in portrait.
   [EarlGrey rotateDeviceToOrientation:UIDeviceOrientationPortrait
                            errorOrNil:nil];
   ShowTabSwitcher();
   SelectTab(tab_title);
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab_title)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(tab_title)]);
 
   // Show the tab switcher and return to the BVC, in landscape.
   [EarlGrey rotateDeviceToOrientation:UIDeviceOrientationLandscapeLeft
                            errorOrNil:nil];
   ShowTabSwitcher();
   SelectTab(tab_title);
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab_title)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(tab_title)]);
 
   // Show the tab switcher and return to the BVC, in portrait.
   [EarlGrey rotateDeviceToOrientation:UIDeviceOrientationPortrait
                            errorOrNil:nil];
   ShowTabSwitcher();
   SelectTab(tab_title);
-  [ChromeEarlGrey
-      waitForWebViewContainingText:base::SysNSStringToUTF8(tab_title)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingText:base::SysNSStringToUTF8(tab_title)]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/tabs/tab_strip_egtest.mm b/ios/chrome/browser/ui/tabs/tab_strip_egtest.mm
index 20266db..6668ffc 100644
--- a/ios/chrome/browser/ui/tabs/tab_strip_egtest.mm
+++ b/ios/chrome/browser/ui/tabs/tab_strip_egtest.mm
@@ -13,6 +13,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -44,9 +45,9 @@
   // case.
   const int kNumberOfTabs = 3;
   [ChromeEarlGreyUI openNewTab];
-  [ChromeEarlGrey loadURL:GURL("chrome://about")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://about")]);
   [ChromeEarlGreyUI openNewTab];
-  [ChromeEarlGrey loadURL:GURL("chrome://version")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://version")]);
 
   // Note that the tab ordering wraps.  E.g. if A, B, and C are open,
   // and C is the current tab, the 'next' tab is 'A'.
diff --git a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
index bfa4f4f..5cad7f8 100644
--- a/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
+++ b/ios/chrome/browser/ui/toolbar/adaptive_toolbar_egtest.mm
@@ -25,6 +25,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/testing/earl_grey/disabled_test_macros.h"
@@ -407,7 +408,7 @@
   }
 
   // Setup the bookmarks.
-  [ChromeEarlGrey waitForBookmarksToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForBookmarksToFinishLoading]);
   GREYAssert(chrome_test_util::ClearBookmarks(),
              @"Not all bookmarks were removed.");
 
@@ -417,7 +418,8 @@
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
 
   // Navigate to a page and check the bookmark button is not spotlighted.
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL)]);
   [[EarlGrey selectElementWithMatcher:BookmarkButton()]
       assertWithMatcher:grey_allOf(grey_kindOfClass([UIControl class]),
                                    grey_not(Spotlighted()), nil)];
@@ -429,13 +431,15 @@
       assertWithMatcher:Spotlighted()];
 
   // Navigate to a different page and check the button is not selected.
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL2)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL2)]);
   [[EarlGrey selectElementWithMatcher:BookmarkButton()]
       assertWithMatcher:grey_allOf(grey_kindOfClass([UIControl class]),
                                    grey_not(Spotlighted()), nil)];
 
   // Navigate back to the bookmarked page and check the button.
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL)]);
   [[EarlGrey selectElementWithMatcher:BookmarkButton()]
       assertWithMatcher:Spotlighted()];
 
@@ -451,7 +455,7 @@
   }
 
   // Navigate to a page to enable the back button.
-  [ChromeEarlGrey loadURL:GURL("chrome://version")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://version")]);
 
   FocusOmnibox();
 
@@ -466,7 +470,7 @@
 // different orientation than the default one.
 - (void)testFocusOmniboxFromOtherOrientation {
   // Load a page to have the toolbar visible (hidden on NTP).
-  [ChromeEarlGrey loadURL:GURL("chrome://version")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://version")]);
 
   // Get the original trait collection.
   UIViewController* topViewController =
@@ -504,7 +508,7 @@
 // the default orientation.
 - (void)testFocusOmniboxFromPortrait {
   // Load a page to have the toolbar visible (hidden on NTP).
-  [ChromeEarlGrey loadURL:GURL("chrome://version")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://version")]);
 
   FocusOmnibox();
 
@@ -556,7 +560,8 @@
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
 
   // Navigate to a page.
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL)]);
 
   GREYAssert(AddInfobar(), @"Failed to add infobar.");
 
@@ -635,8 +640,10 @@
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
 
   // Loads two url and check the navigation buttons status.
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL)];
-  [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL2)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL)]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL(kPageURL2)]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
       assertWithMatcher:grey_interactable()];
   [[EarlGrey selectElementWithMatcher:chrome_test_util::ForwardButton()]
@@ -714,7 +721,7 @@
   const GURL pageURL = self.testServer->GetURL(kPageURL);
 
   // Navigate to another page and check that the share button is enabled.
-  [ChromeEarlGrey loadURL:pageURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:pageURL]);
   [[EarlGrey selectElementWithMatcher:ShareButton()]
       assertWithMatcher:grey_interactable()];
 
@@ -747,7 +754,7 @@
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdleWithTimeout:2];
 
   [[self class] closeAllTabs];
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 
   // Check that the bottom toolbar is visible.
   [[EarlGrey selectElementWithMatcher:SearchButton()]
@@ -757,7 +764,7 @@
 // Verifies the existence and state of toolbar UI elements.
 - (void)testToolbarUI {
   // Load a page to have the toolbar visible (hidden on NTP).
-  [ChromeEarlGrey loadURL:GURL("chrome://version")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://version")]);
 
   // Get the original trait collection.
   UIViewController* topViewController =
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
index cd5357e..d7262a5 100644
--- a/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
+++ b/ios/chrome/browser/ui/toolbar/toolbar_egtest.mm
@@ -18,6 +18,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -46,15 +47,16 @@
   web::test::SetUpFileBasedHttpServer();
   const GURL URL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/destination.html");
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(URL.GetContent())]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"]);
 }
 
 // Verifies opening a new tab from the tools menu.
 - (void)testNewTabFromMenu {
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Open tab via the UI.
   [ChromeEarlGreyUI openToolsMenu];
@@ -63,12 +65,12 @@
   [[EarlGrey selectElementWithMatcher:newTabButtonMatcher]
       performAction:grey_tap()];
 
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Verifies opening a new incognito tab from the tools menu.
 - (void)testNewIncognitoTabFromMenu {
-  [ChromeEarlGrey waitForIncognitoTabCount:0];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:0]);
 
   // Open incognito tab.
   [ChromeEarlGreyUI openToolsMenu];
@@ -77,7 +79,7 @@
   [[EarlGrey selectElementWithMatcher:newIncognitoTabButtonMatcher]
       performAction:grey_tap()];
 
-  [ChromeEarlGrey waitForIncognitoTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:1]);
 }
 
 // Tests whether input mode in an omnibox can be canceled via "Cancel" button
@@ -90,11 +92,10 @@
 
   const GURL URL = web::test::HttpServer::MakeUrl("http://origin");
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
-    [[EarlGrey
-        selectElementWithMatcher:chrome_test_util::DefocusedLocationView()]
-        performAction:grey_tap()];
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::DefocusedLocationView()]
+      performAction:grey_tap()];
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
       assertWithMatcher:chrome_test_util::OmniboxText(URL.GetContent())];
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
@@ -124,7 +125,7 @@
 
   const GURL URL = web::test::HttpServer::MakeUrl("http://origin");
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
       assertWithMatcher:chrome_test_util::OmniboxText(URL.GetContent())];
@@ -153,7 +154,7 @@
 
   const GURL URL = web::test::HttpServer::MakeUrl("http://origin");
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
       assertWithMatcher:chrome_test_util::OmniboxText(URL.GetContent())];
@@ -179,8 +180,8 @@
   // (Subsequent steps in this test require the omnibox to be tappable, but in
   // some configurations the NTP only has a fakebox and does not display the
   // omnibox.)
-  [ChromeEarlGrey loadURL:GURL("about:blank")];
-  [ChromeEarlGrey loadURL:GURL("chrome://version")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("about:blank")]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://version")]);
 
   // First test: check that the keyboard is opened when tapping the omnibox,
   // and that it is dismissed when the "Back" button is tapped.
@@ -229,7 +230,7 @@
   const GURL URL = web::test::HttpServer::MakeUrl("http://veryLongURLTestPage");
   const GURL secondURL = web::test::HttpServer::MakeUrl("http://pastePage");
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
       assertWithMatcher:chrome_test_util::OmniboxText(URL.GetContent())];
@@ -262,7 +263,7 @@
         performAction:grey_tap()];
   }
 
-  [ChromeEarlGrey loadURL:secondURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:secondURL]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
       performAction:grey_longPress()];
 
@@ -286,10 +287,9 @@
 
   const GURL URL = web::test::HttpServer::MakeUrl("http://origin");
 
-  [ChromeEarlGrey loadURL:URL];
-    [[EarlGrey
-        selectElementWithMatcher:chrome_test_util::DefocusedLocationView()]
-        performAction:grey_tap()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  [[EarlGrey selectElementWithMatcher:chrome_test_util::DefocusedLocationView()]
+      performAction:grey_tap()];
 
   [[EarlGrey selectElementWithMatcher:chrome_test_util::Omnibox()]
       performAction:grey_typeText(@"foo")];
@@ -316,7 +316,7 @@
   GURL URL = web::test::HttpServer::MakeUrl("http://foo");
   responses[URL] = "bar";
   web::test::SetUpSimpleHttpServer(responses);
-  [ChromeEarlGrey loadURL:GURL(URL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(URL)]);
 
   [ChromeEarlGreyUI focusOmniboxAndType:@"javascript:alert('Hello');\n"];
 
@@ -332,7 +332,7 @@
   if (IsIPadIdiom()) {
     EARL_GREY_TEST_DISABLED(@"Disabled for iPad due to a typing bug.");
   }
-  [ChromeEarlGrey loadURL:GURL("chrome://version")];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://version")]);
   [ChromeEarlGreyUI focusOmniboxAndType:@"javascript:alert('Hello');\n"];
 
   [[EarlGrey selectElementWithMatcher:grey_accessibilityLabel(@"Hello")]
@@ -433,8 +433,9 @@
   // Select the omnibox to get the keyboard up.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::NewTabPageOmnibox()]
       performAction:grey_tap()];
-  [ChromeEarlGrey
-      waitForElementWithMatcherSufficientlyVisible:chrome_test_util::Omnibox()];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:
+                          chrome_test_util::Omnibox()]);
 
   // Tap the "/" keyboard accessory button.
   id<GREYMatcher> slashButtonMatcher = grey_allOf(
diff --git a/ios/chrome/browser/ui/webui/inspect/inspect_ui_egtest.mm b/ios/chrome/browser/ui/webui/inspect/inspect_ui_egtest.mm
index 61c69d1..7cad473 100644
--- a/ios/chrome/browser/ui/webui/inspect/inspect_ui_egtest.mm
+++ b/ios/chrome/browser/ui/webui/inspect/inspect_ui_egtest.mm
@@ -13,6 +13,7 @@
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/web/public/test/element_selector.h"
@@ -112,76 +113,100 @@
 
 // Tests that chrome://inspect allows the user to enable and disable logging.
 - (void)testStartStopLogging {
-  [ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)]);
 
-  [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
 
   ElementSelector* stopLoggingButton = [ElementSelector
       selectorWithElementID:base::SysNSStringToUTF8(kStopLoggingButtonId)];
-  [ChromeEarlGrey waitForWebViewContainingElement:stopLoggingButton];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:stopLoggingButton]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:kStopLoggingButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kStopLoggingButtonId]);
 
-  [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
 }
 
 // Tests that log messages from a page's main frame are displayed.
 - (void)testMainFrameLogging {
-  [ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)]);
 
   // Start logging.
-  [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()];
-  [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   const GURL consoleTestsURL = self.testServer->GetURL(kConsolePage);
-  [ChromeEarlGrey loadURL:consoleTestsURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
   std::string debugButtonID = base::SysNSStringToUTF8(kDebugMessageButtonId);
-  [ChromeEarlGrey
-      waitForWebViewContainingElement:[ElementSelector
-                                          selectorWithElementID:debugButtonID]];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingElement:
+          [ElementSelector selectorWithElementID:debugButtonID]]);
 
   // Log messages.
-  [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId];
-  [ChromeEarlGrey tapWebViewElementWithID:kErrorMessageButtonId];
-  [ChromeEarlGrey tapWebViewElementWithID:kInfoMessageButtonId];
-  [ChromeEarlGrey tapWebViewElementWithID:kLogMessageButtonId];
-  [ChromeEarlGrey tapWebViewElementWithID:kWarningMessageButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kErrorMessageButtonId]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kInfoMessageButtonId]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kLogMessageButtonId]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kWarningMessageButtonId]);
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   // Validate messages and labels are displayed.
-  [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText];
-  [ChromeEarlGrey waitForWebViewContainingText:kErrorMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kErrorMessageText];
-  [ChromeEarlGrey waitForWebViewContainingText:kInfoMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kInfoMessageText];
-  [ChromeEarlGrey waitForWebViewContainingText:kLogMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kLogMessageText];
-  [ChromeEarlGrey waitForWebViewContainingText:kWarningMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kWarningMessageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kErrorMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kErrorMessageText]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kInfoMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kInfoMessageText]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLogMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLogMessageText]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWarningMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWarningMessageText]);
 }
 
 // Tests that log messages from an iframe are displayed.
 - (void)testIframeLogging {
-  [ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)]);
 
   // Start logging.
-  [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()];
-  [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   const GURL consoleTestsURL = self.testServer->GetURL(kConsolePage);
-  [ChromeEarlGrey loadURL:consoleTestsURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
 
   std::string debugButtonID = base::SysNSStringToUTF8(kDebugMessageButtonId);
-  [ChromeEarlGrey
-      waitForWebViewContainingElement:[ElementSelector
-                                          selectorWithElementID:debugButtonID]];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingElement:
+          [ElementSelector selectorWithElementID:debugButtonID]]);
 
   // Log messages.
   GREYAssertTrue(TapWebViewElementWithIdInIframe(debugButtonID),
@@ -205,142 +230,182 @@
 
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   // Validate messages and labels are displayed.
-  [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kIFrameDebugMessageText];
-  [ChromeEarlGrey waitForWebViewContainingText:kErrorMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kIFrameErrorMessageText];
-  [ChromeEarlGrey waitForWebViewContainingText:kInfoMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kIFrameInfoMessageText];
-  [ChromeEarlGrey waitForWebViewContainingText:kLogMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kIFrameLogMessageText];
-  [ChromeEarlGrey waitForWebViewContainingText:kWarningMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kIFrameWarningMessageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kIFrameDebugMessageText]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kErrorMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kIFrameErrorMessageText]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kInfoMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kIFrameInfoMessageText]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLogMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kIFrameLogMessageText]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWarningMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kIFrameWarningMessageText]);
 }
 
 // Tests that log messages are correctly displayed from multiple tabs.
 - (void)testLoggingFromMultipleTabs {
-  [ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)]);
 
   // Start logging.
-  [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()];
-  [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   const GURL consoleTestsURL = self.testServer->GetURL(kConsolePage);
-  [ChromeEarlGrey loadURL:consoleTestsURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
   std::string logButtonID = base::SysNSStringToUTF8(kLogMessageButtonId);
-  [ChromeEarlGrey
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       waitForWebViewContainingElement:[ElementSelector
-                                          selectorWithElementID:logButtonID]];
+                                          selectorWithElementID:logButtonID]]);
 
   // Log a message and verify it is displayed.
-  [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
-  [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText]);
 
   // Open console test page again.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey loadURL:consoleTestsURL];
-  [ChromeEarlGrey
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       waitForWebViewContainingElement:[ElementSelector
-                                          selectorWithElementID:logButtonID]];
+                                          selectorWithElementID:logButtonID]]);
 
   // Log another message and verify it is displayed.
-  [ChromeEarlGrey tapWebViewElementWithID:kLogMessageButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kLogMessageButtonId]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
-  [ChromeEarlGrey waitForWebViewContainingText:kLogMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kLogMessageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLogMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLogMessageText]);
 
   // Ensure the log from the first tab still exists.
-  [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText]);
 }
 
 // Tests that messages are cleared after stopping logging.
 - (void)testMessagesClearedOnStopLogging {
-  [ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)]);
 
   // Start logging.
-  [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()];
-  [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   const GURL consoleTestsURL = self.testServer->GetURL(kConsolePage);
-  [ChromeEarlGrey loadURL:consoleTestsURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
   std::string logButtonID = base::SysNSStringToUTF8(kLogMessageButtonId);
-  [ChromeEarlGrey
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       waitForWebViewContainingElement:[ElementSelector
-                                          selectorWithElementID:logButtonID]];
+                                          selectorWithElementID:logButtonID]]);
 
   // Log a message and verify it is displayed.
-  [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
-  [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText]);
 
   // Stop logging.
-  [ChromeEarlGrey tapWebViewElementWithID:kStopLoggingButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kStopLoggingButtonId]);
   // Ensure message was cleared.
-  [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageLabel];
-  [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageText]);
 }
 
 // Tests that messages are cleared after a page reload.
 - (void)testMessagesClearedOnReload {
-  [ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)]);
 
   // Start logging.
-  [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()];
-  [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   const GURL consoleTestsURL = self.testServer->GetURL(kConsolePage);
-  [ChromeEarlGrey loadURL:consoleTestsURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
   std::string logButtonID = base::SysNSStringToUTF8(kLogMessageButtonId);
-  [ChromeEarlGrey
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
       waitForWebViewContainingElement:[ElementSelector
-                                          selectorWithElementID:logButtonID]];
+                                          selectorWithElementID:logButtonID]]);
 
   // Log a message and verify it is displayed.
-  [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
-  [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel];
-  [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDebugMessageText]);
 
   // Reload page.
-  [ChromeEarlGrey reload];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
   // Ensure message was cleared.
-  [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageLabel];
-  [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageText]);
 }
 
 // Tests that messages are cleared for a tab which is closed.
 - (void)testMessagesClearedOnTabClosure {
-  [ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeUIInspectURL)]);
 
   // Start logging.
-  [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()];
-  [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingElement:StartLoggingButton()]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kStartLoggingButtonId]);
 
   // Open console test page.
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
   const GURL consoleTestsURL = self.testServer->GetURL(kConsolePage);
-  [ChromeEarlGrey loadURL:consoleTestsURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:consoleTestsURL]);
   std::string debugButtonID = base::SysNSStringToUTF8(kDebugMessageButtonId);
-  [ChromeEarlGrey
-      waitForWebViewContainingElement:[ElementSelector
-                                          selectorWithElementID:debugButtonID]];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForWebViewContainingElement:
+          [ElementSelector selectorWithElementID:debugButtonID]]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kDebugMessageButtonId]);
   [ChromeEarlGrey closeCurrentTab];
 
   // Validate message and label are not displayed.
-  [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageLabel];
-  [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageLabel]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:kDebugMessageText]);
 }
 
 @end
diff --git a/ios/chrome/browser/ui/webui/web_ui_egtest.mm b/ios/chrome/browser/ui/webui/web_ui_egtest.mm
index 37bab22..7b63d26 100644
--- a/ios/chrome/browser/ui/webui/web_ui_egtest.mm
+++ b/ios/chrome/browser/ui/webui/web_ui_egtest.mm
@@ -17,6 +17,7 @@
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/web_client.h"
@@ -37,7 +38,7 @@
 // Loads WebUI page with given |host|.
 void LoadWebUIUrl(const std::string& host) {
   GURL web_ui_url(url::SchemeHostPort(kChromeUIScheme, host, 0).Serialize());
-  [ChromeEarlGrey loadURL:web_ui_url];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:web_ui_url]);
 }
 
 // Adds wait for omnibox text matcher so that omnibox text can be updated.
@@ -86,12 +87,14 @@
 
   // Verify that app version is present on the page.
   const std::string version = version_info::GetVersionNumber();
-  [ChromeEarlGrey waitForWebViewContainingText:version];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:version]);
 
   // Verify that mobile User Agent string is present on the page.
   const std::string userAgent =
       web::GetWebClient()->GetUserAgent(web::UserAgentType::MOBILE);
-  [ChromeEarlGrey waitForWebViewContainingText:userAgent];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:userAgent]);
 }
 
 // Tests that clicking on a chrome://terms link from chrome://chrome-urls
@@ -107,7 +110,8 @@
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText("chrome://terms")]
       assertWithMatcher:grey_notNil()];
   const std::string kTermsText = "Google Chrome Terms of Service";
-  [ChromeEarlGrey waitForWebViewContainingText:kTermsText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTermsText]);
 }
 
 // Tests that back navigation functions properly after navigation via anchor
@@ -122,7 +126,8 @@
   // Verify that the resulting page is chrome://version.
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText("chrome://version")]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForWebViewContainingText:"The Chromium Authors"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"The Chromium Authors"]);
 
   // Tap the back button in the toolbar and verify that the resulting page is
   // the previously visited page chrome://chrome-urls.
@@ -130,7 +135,8 @@
   [[EarlGrey
       selectElementWithMatcher:WaitForOmniboxText("chrome://chrome-urls")]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForWebViewContainingText:"List of Chrome URLs"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"List of Chrome URLs"]);
 }
 
 // Tests that back and forward navigation between chrome URLs functions
@@ -158,8 +164,8 @@
   // Tap the back button in the toolbar then reload, and verify that the
   // resulting page corresponds to the first URL.
   [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()];
-  [ChromeEarlGrey waitForPageToFinishLoading];
-  [ChromeEarlGrey reload];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText("chrome://version")]
       assertWithMatcher:grey_notNil()];
 
@@ -197,8 +203,9 @@
   // Verify that the resulting page is an error page.
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText(kChromeInvalidURL)]
       assertWithMatcher:grey_notNil()];
-  std::string error = net::ErrorToShortString(net::ERR_INVALID_URL);
-  [ChromeEarlGrey waitForWebViewContainingText:error];
+  std::string errorMessage = net::ErrorToShortString(net::ERR_INVALID_URL);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:errorMessage]);
 }
 
 // Tests that repeated back/forward navigation from web URL is allowed.
@@ -214,24 +221,29 @@
   LoadWebUIUrl(kChromeUIVersionHost);
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText(kChromeVersionURL)]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForWebViewContainingText:kChromeVersionWebText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kChromeVersionWebText]);
 
   GURL webURL = self.testServer->GetURL("/pony.html");
-  [ChromeEarlGrey loadURL:webURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kWebPageText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:webURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWebPageText]);
 
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText(kChromeVersionURL)]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForWebViewContainingText:kChromeVersionWebText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kChromeVersionWebText]);
 
-  [ChromeEarlGrey goForward];
-  [ChromeEarlGrey waitForWebViewContainingText:kWebPageText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWebPageText]);
 
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   [[EarlGrey selectElementWithMatcher:WaitForOmniboxText(kChromeVersionURL)]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForWebViewContainingText:kChromeVersionWebText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kChromeVersionWebText]);
 }
 
 @end
diff --git a/ios/chrome/browser/url_loading/BUILD.gn b/ios/chrome/browser/url_loading/BUILD.gn
index 6d03f8e..abfc2bf 100644
--- a/ios/chrome/browser/url_loading/BUILD.gn
+++ b/ios/chrome/browser/url_loading/BUILD.gn
@@ -7,6 +7,8 @@
   sources = [
     "app_url_loading_service.h",
     "app_url_loading_service.mm",
+    "image_search_param_generator.h",
+    "image_search_param_generator.mm",
     "test_app_url_loading_service.h",
     "test_app_url_loading_service.mm",
     "test_url_loading_service.h",
@@ -29,6 +31,7 @@
   deps = [
     "//base",
     "//components/keyed_service/ios",
+    "//components/search_engines",
     "//components/sessions",
     "//ios/chrome/app:mode",
     "//ios/chrome/browser",
@@ -53,6 +56,7 @@
   configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
   sources = [
+    "image_search_param_generator_unittest.mm",
     "url_loading_service_unittest.mm",
   ]
   deps = [
@@ -63,6 +67,7 @@
     "//ios/chrome/browser/browser_state",
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/main:test_support",
+    "//ios/chrome/browser/search_engines",
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/web",
     "//ios/chrome/browser/web:web_internal",
diff --git a/ios/chrome/browser/url_loading/image_search_param_generator.h b/ios/chrome/browser/url_loading/image_search_param_generator.h
new file mode 100644
index 0000000..a594341
--- /dev/null
+++ b/ios/chrome/browser/url_loading/image_search_param_generator.h
@@ -0,0 +1,38 @@
+// Copyright 2019 The Chromium 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_URL_LOADING_IMAGE_SEARCH_PARAM_GENERATOR_H_
+#define IOS_CHROME_BROWSER_URL_LOADING_IMAGE_SEARCH_PARAM_GENERATOR_H_
+
+#import <UIKit/UIKit.h>
+
+#import "ios/chrome/browser/web/web_navigation_util.h"
+
+class GURL;
+class TemplateURLService;
+
+class ImageSearchParamGenerator {
+ public:
+  // Create loading parameters using the given |data|, which should represent
+  // an image and |url|, the web url the image came from. This can be useful to
+  // avoid having to convert from UIImage back to NSData, which can be slow. If
+  // the image data didn't come from a url, use an empty GURL to indicate that.
+  static web::NavigationManager::WebLoadParams LoadParamsForImageData(
+      NSData* data,
+      const GURL& url,
+      TemplateURLService* template_url_service);
+
+  // Create loading parameters using the given |image|.
+  static web::NavigationManager::WebLoadParams LoadParamsForImage(
+      UIImage* image,
+      TemplateURLService* template_url_service);
+
+ private:
+  static web::NavigationManager::WebLoadParams LoadParamsForResizedImageData(
+      NSData* data,
+      const GURL& url,
+      TemplateURLService* template_url_service);
+};
+
+#endif  // IOS_CHROME_BROWSER_URL_LOADING_IMAGE_SEARCH_PARAM_GENERATOR_H_
diff --git a/ios/chrome/browser/url_loading/image_search_param_generator.mm b/ios/chrome/browser/url_loading/image_search_param_generator.mm
new file mode 100644
index 0000000..7d6fd24d
--- /dev/null
+++ b/ios/chrome/browser/url_loading/image_search_param_generator.mm
@@ -0,0 +1,88 @@
+// Copyright 2019 The Chromium 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/url_loading/image_search_param_generator.h"
+
+#include "base/strings/utf_string_conversions.h"
+#include "components/search_engines/template_url_service.h"
+#import "ui/gfx/image/image.h"
+#import "ui/gfx/image/image_util.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+web::NavigationManager::WebLoadParams
+ImageSearchParamGenerator::LoadParamsForImageData(
+    NSData* data,
+    const GURL& url,
+    TemplateURLService* template_url_service) {
+  NSData* image_data = data;
+  UIImage* image = [UIImage imageWithData:image_data];
+  gfx::Image gfx_image(image);
+  // Converting to gfx::Image creates an empty image if UIImage is nil. However,
+  // we still want to do the image search with nil data because that gives
+  // the user the best error experience.
+  if (gfx_image.IsEmpty()) {
+    return LoadParamsForResizedImageData(image_data, url, template_url_service);
+  }
+  UIImage* resized_image =
+      gfx::ResizedImageForSearchByImage(gfx_image).ToUIImage();
+  if (![image isEqual:resized_image]) {
+    image_data = UIImageJPEGRepresentation(resized_image, 1.0);
+  }
+
+  return LoadParamsForResizedImageData(image_data, url, template_url_service);
+}
+
+web::NavigationManager::WebLoadParams
+ImageSearchParamGenerator::LoadParamsForImage(
+    UIImage* image,
+    TemplateURLService* template_url_service) {
+  gfx::Image gfx_image(image);
+  // Converting to gfx::Image creates an empty image if UIImage is nil. However,
+  // we still want to do the image search with nil data because that gives
+  // the user the best error experience.
+  if (gfx_image.IsEmpty()) {
+    return LoadParamsForResizedImageData(nil, GURL(), template_url_service);
+  }
+  UIImage* resized_image =
+      gfx::ResizedImageForSearchByImage(gfx_image).ToUIImage();
+  NSData* data = UIImageJPEGRepresentation(resized_image, 1.0);
+  return LoadParamsForResizedImageData(data, GURL(), template_url_service);
+}
+
+// This method does all the work of constructing the parameters. Internally,
+// the class uses an empty GURL to signify that the url is not present, and
+// shouldn't be added to the search arguments.
+web::NavigationManager::WebLoadParams
+ImageSearchParamGenerator::LoadParamsForResizedImageData(
+    NSData* data,
+    const GURL& url,
+    TemplateURLService* template_url_service) {
+  char const* bytes = reinterpret_cast<const char*>([data bytes]);
+  std::string byte_string(bytes, [data length]);
+
+  const TemplateURL* default_url =
+      template_url_service->GetDefaultSearchProvider();
+  DCHECK(!default_url->image_url().empty());
+  DCHECK(default_url->image_url_ref().IsValid(
+      template_url_service->search_terms_data()));
+  TemplateURLRef::SearchTermsArgs search_args(base::ASCIIToUTF16(""));
+  if (!url.is_empty()) {
+    search_args.image_url = url;
+  }
+  search_args.image_thumbnail_content = byte_string;
+
+  // Generate the URL and populate |post_content| with the content type and
+  // HTTP body for the request.
+  TemplateURLRef::PostContent post_content;
+  GURL result(default_url->image_url_ref().ReplaceSearchTerms(
+      search_args, template_url_service->search_terms_data(), &post_content));
+  web::NavigationManager::WebLoadParams web_load_params =
+      web_navigation_util::CreateWebLoadParams(
+          result, ui::PAGE_TRANSITION_TYPED, &post_content);
+
+  return web_load_params;
+}
diff --git a/ios/chrome/browser/url_loading/image_search_param_generator_unittest.mm b/ios/chrome/browser/url_loading/image_search_param_generator_unittest.mm
new file mode 100644
index 0000000..07e26460
--- /dev/null
+++ b/ios/chrome/browser/url_loading/image_search_param_generator_unittest.mm
@@ -0,0 +1,44 @@
+// Copyright 2019 The Chromium 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/url_loading/image_search_param_generator.h"
+
+#include "base/test/scoped_task_environment.h"
+#import "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
+#include "ios/chrome/browser/search_engines/template_url_service_factory.h"
+#include "testing/platform_test.h"
+#include "third_party/ocmock/gtest_support.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+class ImageSearchParamGeneratorTest : public PlatformTest {
+ public:
+  ImageSearchParamGeneratorTest() {}
+
+ protected:
+  void SetUp() override {
+    // Set up a TestChromeBrowserState instance.
+    TestChromeBrowserState::Builder test_cbs_builder;
+    test_cbs_builder.AddTestingFactory(
+        ios::TemplateURLServiceFactory::GetInstance(),
+        ios::TemplateURLServiceFactory::GetDefaultFactory());
+    chrome_browser_state_ = test_cbs_builder.Build();
+  }
+
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+  std::unique_ptr<TestChromeBrowserState> chrome_browser_state_;
+};
+
+TEST_F(ImageSearchParamGeneratorTest, TestNilImage) {
+  TemplateURLService* template_url_service =
+      ios::TemplateURLServiceFactory::GetForBrowserState(
+          chrome_browser_state_.get());
+  web::NavigationManager::WebLoadParams load_params =
+      ImageSearchParamGenerator::LoadParamsForImageData(nil, GURL(),
+                                                        template_url_service);
+  ASSERT_EQ(load_params.url,
+            GURL("https://www.google.com/searchbyimage/upload"));
+}
diff --git a/ios/chrome/browser/web/browsing_egtest.mm b/ios/chrome/browser/web/browsing_egtest.mm
index 0ca5dc8..eaf6df1 100644
--- a/ios/chrome/browser/web/browsing_egtest.mm
+++ b/ios/chrome/browser/web/browsing_egtest.mm
@@ -17,6 +17,7 @@
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/chrome/test/scoped_block_popups_pref.h"
@@ -101,15 +102,17 @@
   web::test::SetUpHttpServer(std::move(provider));
 
   GURL URL = ReloadResponseProvider::GetReloadTestUrl();
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   std::string expectedBodyBeforeReload(
       ReloadResponseProvider::GetResponseBody(0 /* request number */));
-  [ChromeEarlGrey waitForWebViewContainingText:expectedBodyBeforeReload];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:expectedBodyBeforeReload]);
 
   [ChromeEarlGreyUI reload];
   std::string expectedBodyAfterReload(
       ReloadResponseProvider::GetResponseBody(1 /* request_number */));
-  [ChromeEarlGrey waitForWebViewContainingText:expectedBodyAfterReload];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:expectedBodyAfterReload]);
 }
 
 // Tests that a tab's title is based on the URL when no other information is
@@ -123,7 +126,7 @@
 
   const GURL destinationURL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/destination.html");
-  [ChromeEarlGrey loadURL:destinationURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:destinationURL]);
 
   // Add 3 for the "://" which is not considered part of the scheme
   std::string URLWithoutScheme =
@@ -143,7 +146,7 @@
 
   const GURL destinationURL = web::test::HttpServer::MakeUrl(
       "http://ios/testing/data/http_server_files/testpage.pdf");
-  [ChromeEarlGrey loadURL:destinationURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:destinationURL]);
 
   // Add 3 for the "://" which is not considered part of the scheme
   std::string URLWithoutScheme =
@@ -164,7 +167,7 @@
       "data:text/html;charset=utf-8,<script>document.title = "
       "\"%s\"</script>",
       kPageTitle));
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   [[EarlGrey selectElementWithMatcher:TabWithTitle(kPageTitle)]
       assertWithMatcher:grey_sufficientlyVisible()];
@@ -190,12 +193,12 @@
   ScopedBlockPopupsPref prefSetter(CONTENT_SETTING_ALLOW,
                                    GetOriginalBrowserState());
 
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
 
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Verify the new tab was opened with the expected URL.
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
@@ -221,12 +224,12 @@
   ScopedBlockPopupsPref prefSetter(CONTENT_SETTING_ALLOW,
                                    GetOriginalBrowserState());
 
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
 
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Verify the new tab was opened with the expected URL.
   const std::string omniboxText =
@@ -264,12 +267,12 @@
   ScopedBlockPopupsPref prefSetter(CONTENT_SETTING_ALLOW,
                                    GetOriginalBrowserState());
 
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
 
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Verify the new tab was opened with the expected URL.
   [[EarlGrey selectElementWithMatcher:OmniboxText(anchorURL.GetContent())]
@@ -304,12 +307,12 @@
   ScopedBlockPopupsPref prefSetter(CONTENT_SETTING_ALLOW,
                                    GetOriginalBrowserState());
 
-  [ChromeEarlGrey loadURL:URL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
 
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Verify the new tab was opened with the expected URL.
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
@@ -331,15 +334,16 @@
   responses[destURL] = "You've arrived!";
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
   GREYAssert(TapWebViewElementWithId("link"), @"Failed to tap \"link\"");
 
   [[EarlGrey selectElementWithMatcher:OmniboxText(destURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
-  [ChromeEarlGrey waitForWebViewContainingText:"Link"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Link"]);
   if (web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
     // Using partial match for Omnibox text because the displayed URL is now
     // "http://origin/#" due to the link click. This is consistent with all
@@ -374,22 +378,23 @@
   web::test::SetUpSimpleHttpServer(responses);
 
   // Assert that test is starting with one tab.
-  [ChromeEarlGrey waitForMainTabCount:1];
-  [ChromeEarlGrey waitForIncognitoTabCount:0];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForIncognitoTabCount:0]);
 
-  [ChromeEarlGrey loadURL:URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL]);
 
   // Tap on chrome://version link.
-  [ChromeEarlGrey tapWebViewElementWithID:@"link"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"link"]);
 
   // Verify that page did not change by checking its URL and message printed by
   // onclick event.
   [[EarlGrey selectElementWithMatcher:OmniboxText("chrome://version")]
       assertWithMatcher:grey_nil()];
-  [ChromeEarlGrey waitForWebViewContainingText:"Hello world!"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Hello world!"]);
 
   // Verify that no new tabs were open which could load chrome://version.
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 // Tests that evaluating user JavaScript that causes navigation correctly
@@ -410,7 +415,7 @@
 
   // Load the first page and run JS (using the codepath that user-entered JS in
   // the omnibox would take, not page-triggered) that should navigate.
-  [ChromeEarlGrey loadURL:startURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:startURL]);
 
   NSString* script =
       [NSString stringWithFormat:@"javascript:window.location='%s'",
@@ -420,12 +425,12 @@
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Go")]
       performAction:grey_tap()];
 
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   [[EarlGrey selectElementWithMatcher:OmniboxText(targetURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(startURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -447,19 +452,20 @@
   responses[secondURL] = secondResponse;
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:firstURL];
-  [ChromeEarlGrey loadURL:secondURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:firstURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:secondURL]);
 
   // Execute some JavaScript in the omnibox.
   [ChromeEarlGreyUI focusOmniboxAndType:@"javascript:document.write('foo')\n"];
-  [ChromeEarlGrey waitForWebViewContainingText:"foo"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"foo"]);
 
   // Verify that the JavaScript did not affect history by going back and then
   // forward again.
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(firstURL.GetContent())]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey goForward];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(secondURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
diff --git a/ios/chrome/browser/web/browsing_prevent_default_egtest.mm b/ios/chrome/browser/web/browsing_prevent_default_egtest.mm
index 3b238f6..30493324 100644
--- a/ios/chrome/browser/web/browsing_prevent_default_egtest.mm
+++ b/ios/chrome/browser/web/browsing_prevent_default_egtest.mm
@@ -11,6 +11,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/chrome/test/scoped_block_popups_pref.h"
@@ -55,17 +56,18 @@
   web::test::SetUpFileBasedHttpServer();
 
   const GURL testURL = GetTestUrl();
-  [ChromeEarlGrey loadURL:testURL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Tap on the test link and wait for the page to display "Click done", as an
   // indicator that the element was tapped.
   GREYAssert(TapWebViewElementWithId(linkID), @"Failed to tap %s",
              linkID.c_str());
-  [ChromeEarlGrey waitForWebViewContainingText:"Click done"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Click done"]);
 
   // Check that no navigation occurred and no new tabs were opened.
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
   const GURL& currentURL =
       chrome_test_util::GetCurrentWebState()->GetVisibleURL();
   GREYAssert(currentURL == testURL, @"Page navigated unexpectedly %s",
@@ -94,11 +96,12 @@
   web::test::SetUpFileBasedHttpServer();
 
   const GURL testURL = GetTestUrl();
-  [ChromeEarlGrey loadURL:testURL];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 
   // Tap on the test link.
-  [ChromeEarlGrey tapWebViewElementWithID:@"overrides-window-open"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"overrides-window-open"]);
 
   // Check that the tab navigated to about:blank and no new tabs were opened.
   [[GREYCondition
@@ -108,7 +111,7 @@
                         chrome_test_util::GetCurrentWebState()->GetVisibleURL();
                     return currentURL == url::kAboutBlankURL;
                   }] waitWithTimeout:kConditionTimeout];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 @end
diff --git a/ios/chrome/browser/web/cache_egtest.mm b/ios/chrome/browser/web/cache_egtest.mm
index 94a3626..d91cdf5 100644
--- a/ios/chrome/browser/web/cache_egtest.mm
+++ b/ios/chrome/browser/web/cache_egtest.mm
@@ -15,6 +15,7 @@
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/chrome/test/scoped_block_popups_pref.h"
@@ -134,26 +135,31 @@
       HttpServer::MakeUrl(kCacheTestFirstPageURL);
 
   // 1st hit to server. Verify that the server has the correct hit count.
-  [ChromeEarlGrey loadURL:cacheTestFirstPageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:cacheTestFirstPageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"]);
 
   // Navigate to another page. 2nd hit to server.
   GREYAssert(chrome_test_util::TapWebViewElementWithId(kCacheTestLinkID),
              @"Failed to tap %s", kCacheTestLinkID);
-  [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 2"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 2"]);
 
   // Navigate back. This should not hit the server. Verify the page has been
   // loaded from cache. The serverHitCounter will remain the same.
-  [ChromeEarlGrey goBack];
-  [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"]);
 
   // Reload page. 3rd hit to server. Verify that page reload causes the
   // hitCounter to show updated value.
-  [ChromeEarlGrey reload];
-  [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 3"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 3"]);
 
   // Verify that page reload causes Cache-Control value to be sent with request.
-  [ChromeEarlGrey waitForWebViewContainingText:"cacheControl: max-age=0"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"cacheControl: max-age=0"]);
 }
 
 // Tests caching behavior when opening new tab. New tab should not use the
@@ -167,13 +173,16 @@
       HttpServer::MakeUrl(kCacheTestThirdPageURL);
 
   // 1st hit to server. Verify title and hitCount.
-  [ChromeEarlGrey loadURL:cacheTestFirstPageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:"First Page"];
-  [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:cacheTestFirstPageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"First Page"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"]);
 
   // 2nd hit to server. Verify hitCount.
-  [ChromeEarlGrey loadURL:cacheTestThirdPageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 2"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:cacheTestThirdPageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 2"]);
 
   // Open the first page in a new tab. Verify that cache was not used. Must
   // first allow popups.
@@ -181,10 +190,12 @@
                                    GetOriginalBrowserState());
   GREYAssert(chrome_test_util::TapWebViewElementWithId(kCacheTestLinkID),
              @"Failed to tap %s", kCacheTestLinkID);
-  [ChromeEarlGrey waitForMainTabCount:2];
-  [ChromeEarlGrey waitForPageToFinishLoading];
-  [ChromeEarlGrey waitForWebViewContainingText:"First Page"];
-  [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 3"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"First Page"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 3"]);
 }
 
 // Tests that cache is not used when selecting omnibox suggested website, even
@@ -206,9 +217,11 @@
       HttpServer::MakeUrl(kCacheTestFirstPageURL);
 
   // 1st hit to server. Verify title and hitCount.
-  [ChromeEarlGrey loadURL:cacheTestFirstPageURL];
-  [ChromeEarlGrey waitForWebViewContainingText:"First Page"];
-  [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:cacheTestFirstPageURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"First Page"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 1"]);
 
   // Type a search into omnnibox and select the first suggestion (second row)
   [ChromeEarlGreyUI focusOmniboxAndType:@"cachetestfirstpage"];
@@ -217,8 +230,10 @@
       performAction:grey_tap()];
 
   // Verify title and hitCount. Cache should not be used.
-  [ChromeEarlGrey waitForWebViewContainingText:"First Page"];
-  [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 2"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"First Page"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"serverHitCounter: 2"]);
 }
 
 @end
diff --git a/ios/chrome/browser/web/child_window_open_by_dom_egtest.mm b/ios/chrome/browser/web/child_window_open_by_dom_egtest.mm
index d1fdcf0..58b005a 100644
--- a/ios/chrome/browser/web/child_window_open_by_dom_egtest.mm
+++ b/ios/chrome/browser/web/child_window_open_by_dom_egtest.mm
@@ -9,6 +9,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_server.h"
@@ -57,9 +58,11 @@
   // Open the test page. There should only be one tab open.
   const char kChildWindowTestURL[] =
       "http://ios/testing/data/http_server_files/window_proxy.html";
-  [ChromeEarlGrey loadURL:HttpServer::MakeUrl(kChildWindowTestURL)];
-  [ChromeEarlGrey waitForWebViewContainingText:kNamedWindowLink];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:HttpServer::MakeUrl(kChildWindowTestURL)]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kNamedWindowLink]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 // Tests that multiple calls to window.open() with the same window name returns
@@ -68,19 +71,20 @@
   // Open two windows with the same name.
   GREYAssert(TapWebViewElementWithId(kNamedWindowLink), @"Failed to tap %s",
              kNamedWindowLink);
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   GREYAssert(TapWebViewElementWithId(kNamedWindowLink), @"Failed to tap %s",
              kNamedWindowLink);
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Check that they're the same window.
   GREYAssert(TapWebViewElementWithId("compareNamedWindows"),
              @"Failed to tap \"compareNamedWindows\"");
   const char kWindowsEqualText[] = "named windows equal: true";
-  [ChromeEarlGrey waitForWebViewContainingText:kWindowsEqualText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindowsEqualText]);
 }
 
 // Tests that multiple calls to window.open() with no window name passed in
@@ -89,19 +93,20 @@
   // Open two unnamed windows.
   GREYAssert(TapWebViewElementWithId(kUnnamedWindowLink), @"Failed to tap %s",
              kUnnamedWindowLink);
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   GREYAssert(TapWebViewElementWithId(kUnnamedWindowLink), @"Failed to tap %s",
              kUnnamedWindowLink);
-  [ChromeEarlGrey waitForMainTabCount:3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:3]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Check that they aren't the same window object.
   GREYAssert(TapWebViewElementWithId("compareUnnamedWindows"),
              @"Failed to tap \"compareUnnamedWindows\"");
   const char kWindowsEqualText[] = "unnamed windows equal: false";
-  [ChromeEarlGrey waitForWebViewContainingText:kWindowsEqualText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindowsEqualText]);
 }
 
 // Tests that calling window.open() with a name returns a different window
@@ -110,20 +115,21 @@
   // Open a named window.
   GREYAssert(TapWebViewElementWithId(kNamedWindowLink), @"Failed to tap %s",
              kNamedWindowLink);
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Open an unnamed window.
   GREYAssert(TapWebViewElementWithId(kUnnamedWindowLink), @"Failed to tap %s",
              kUnnamedWindowLink);
-  [ChromeEarlGrey waitForMainTabCount:3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:3]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Check that they aren't the same window object.
   GREYAssert(TapWebViewElementWithId("compareNamedAndUnnamedWindows"),
              @"Failed to tap \"compareNamedAndUnnamedWindows\"");
   const char kWindowsEqualText[] = "named and unnamed equal: false";
-  [ChromeEarlGrey waitForWebViewContainingText:kWindowsEqualText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindowsEqualText]);
 }
 
 // Tests that window.closed is correctly set to true when the corresponding tab
@@ -134,39 +140,45 @@
 - (void)testWindowClosedWithName {
   GREYAssert(TapWebViewElementWithId("openWindowWithName"),
              @"Failed to tap \"openWindowWithName\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Check that named window 1 is opened and named window 2 isn't.
   const char kCheckWindow1Link[] = "checkNamedWindow1Closed";
-  [ChromeEarlGrey waitForWebViewContainingText:kCheckWindow1Link];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kCheckWindow1Link]);
   GREYAssert(TapWebViewElementWithId(kCheckWindow1Link), @"Failed to tap %s",
              kCheckWindow1Link);
-  [ChromeEarlGrey waitForWebViewContainingText:kWindow1Open];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindow1Open]);
   const char kCheckWindow2Link[] = "checkNamedWindow2Closed";
   GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
              kCheckWindow2Link);
-  [ChromeEarlGrey waitForWebViewContainingText:kWindow2NeverOpen];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindow2NeverOpen]);
 
   // Open another window with the same name. Check that named window 2 is now
   // opened.
   GREYAssert(TapWebViewElementWithId("openWindowWithName"),
              @"Failed to tap \"openWindowWithName\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
              kCheckWindow2Link);
-  [ChromeEarlGrey waitForWebViewContainingText:kWindow2Open];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindow2Open]);
 
   // Close the opened window. Check that named window 1 and 2 are both closed.
   chrome_test_util::CloseTabAtIndex(1);
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
   GREYAssert(TapWebViewElementWithId(kCheckWindow1Link), @"Failed to tap %s",
              kCheckWindow1Link);
-  [ChromeEarlGrey waitForWebViewContainingText:kWindow1Closed];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindow1Closed]);
   GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
              kCheckWindow2Link);
-  [ChromeEarlGrey waitForWebViewContainingText:kWindow2Closed];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindow2Closed]);
 }
 
 // Tests that closing a tab will set window.closed to true for only
@@ -174,44 +186,51 @@
 - (void)testWindowClosedWithoutName {
   GREYAssert(TapWebViewElementWithId("openWindowNoName"),
              @"Failed to tap \"openWindowNoName\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
 
   // Check that unnamed window 1 is opened and unnamed window 2 isn't.
   const char kCheckWindow1Link[] = "checkUnnamedWindow1Closed";
-  [ChromeEarlGrey waitForWebViewContainingText:kCheckWindow1Link];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kCheckWindow1Link]);
   GREYAssert(TapWebViewElementWithId(kCheckWindow1Link), @"Failed to tap %s",
              kCheckWindow1Link);
-  [ChromeEarlGrey waitForWebViewContainingText:kWindow1Open];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindow1Open]);
   const char kCheckWindow2Link[] = "checkUnnamedWindow2Closed";
   GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
              kCheckWindow2Link);
-  [ChromeEarlGrey waitForWebViewContainingText:kWindow2NeverOpen];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindow2NeverOpen]);
 
   // Open another unnamed window. Check that unnamed window 2 is now opened.
   GREYAssert(TapWebViewElementWithId("openWindowNoName"),
              @"Failed to tap \"openWindowNoName\"");
-  [ChromeEarlGrey waitForMainTabCount:3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:3]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
              kCheckWindow2Link);
-  [ChromeEarlGrey waitForWebViewContainingText:kWindow2Open];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindow2Open]);
 
   // Close the first opened window. Check that unnamed window 1 is closed and
   // unnamed window 2 is still open.
   chrome_test_util::CloseTabAtIndex(1);
   GREYAssert(TapWebViewElementWithId(kCheckWindow1Link), @"Failed to tap %s",
              kCheckWindow1Link);
-  [ChromeEarlGrey waitForWebViewContainingText:kWindow1Closed];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindow1Closed]);
   GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
              kCheckWindow2Link);
-  [ChromeEarlGrey waitForWebViewContainingText:kWindow2Open];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindow2Open]);
 
   // Close the second opened window. Check that unnamed window 2 is closed.
   chrome_test_util::CloseTabAtIndex(1);
   GREYAssert(TapWebViewElementWithId(kCheckWindow2Link), @"Failed to tap %s",
              kCheckWindow2Link);
-  [ChromeEarlGrey waitForWebViewContainingText:kWindow2Closed];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kWindow2Closed]);
 }
 
 @end
diff --git a/ios/chrome/browser/web/error_page_egtest.mm b/ios/chrome/browser/web/error_page_egtest.mm
index d4e3c45..a2aebc3 100644
--- a/ios/chrome/browser/web/error_page_egtest.mm
+++ b/ios/chrome/browser/web/error_page_egtest.mm
@@ -9,6 +9,7 @@
 
 #include "base/bind.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/testing/embedded_test_server_handlers.h"
 #include "net/test/embedded_test_server/default_handlers.h"
@@ -53,26 +54,32 @@
 - (void)testReloadErrorPage {
   // No response leads to ERR_CONNECTION_CLOSED error.
   self.serverRespondsWithContent = NO;
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo-query?foo")];
-  [ChromeEarlGrey waitForWebViewContainingText:GetErrorMessage()];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo-query?foo")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:GetErrorMessage()]);
 
   // Reload the page, which should load without errors.
   self.serverRespondsWithContent = YES;
-  [ChromeEarlGrey reload];
-  [ChromeEarlGrey waitForWebViewContainingText:"foo"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"foo"]);
 }
 
 // Sucessfully loads the page, stops the server and reloads the page.
 - (void)testReloadPageAfterServerIsDown {
   // Sucessfully load the page.
   self.serverRespondsWithContent = YES;
-  [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo-query?foo")];
-  [ChromeEarlGrey waitForWebViewContainingText:"foo"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:self.testServer->GetURL("/echo-query?foo")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"foo"]);
 
   // Reload the page, no response leads to ERR_CONNECTION_CLOSED error.
   self.serverRespondsWithContent = NO;
-  [ChromeEarlGrey reload];
-  [ChromeEarlGrey waitForWebViewContainingText:GetErrorMessage()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:GetErrorMessage()]);
 }
 
 @end
diff --git a/ios/chrome/browser/web/forms_egtest.mm b/ios/chrome/browser/web/forms_egtest.mm
index 019dad58..eb21cac 100644
--- a/ios/chrome/browser/web/forms_egtest.mm
+++ b/ios/chrome/browser/web/forms_egtest.mm
@@ -18,6 +18,7 @@
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/testing/earl_grey/matchers.h"
@@ -211,10 +212,11 @@
   [self setUpFormTestSimpleHttpServer];
   const GURL destinationURL = GetDestinationUrl();
 
-  [ChromeEarlGrey loadURL:GetFormUrl()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
   GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
              kSubmitButtonLabel);
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -225,11 +227,12 @@
   } else {
     // Legacy navigation manager presents repost confirmation dialog after
     // loading stops.
-    [ChromeEarlGrey reload];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
   }
   [self confirmResendWarning];
 
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -240,16 +243,17 @@
   [self setUpFormTestSimpleHttpServer];
   const GURL destinationURL = GetDestinationUrl();
 
-  [ChromeEarlGrey loadURL:GetFormUrl()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
   GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
              kSubmitButtonLabel);
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Go to a new page and go back and check that the data is reposted.
-  [ChromeEarlGrey loadURL:GetGenericUrl()];
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetGenericUrl()]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   // WKBasedNavigationManager doesn't triggere repost on |goForward| due to
   // WKWebView's back-forward cache. Force reload to trigger repost. Not using
@@ -260,7 +264,8 @@
   }
 
   [self confirmResendWarning];
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -271,15 +276,16 @@
   [self setUpFormTestSimpleHttpServer];
   const GURL destinationURL = GetDestinationUrl();
 
-  [ChromeEarlGrey loadURL:GetFormUrl()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
   GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
              kSubmitButtonLabel);
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
-  [ChromeEarlGrey goBack];
-  [ChromeEarlGrey goForward];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]);
 
   // WKBasedNavigationManager doesn't triggere repost on |goForward| due to
   // WKWebView's back-forward cache. Force reload to trigger repost. Not using
@@ -290,7 +296,8 @@
   }
 
   [self confirmResendWarning];
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -301,21 +308,22 @@
   [self setUpFormTestSimpleHttpServer];
   const GURL destinationURL = GetDestinationUrl();
 
-  [ChromeEarlGrey loadURL:GetFormUrl()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
   GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
              kSubmitButtonLabel);
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Go to a new page and go back to destination through back history.
-  [ChromeEarlGrey loadURL:GetGenericUrl()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetGenericUrl()]);
   [self openBackHistory];
   [self waitForTabHistoryView];
   id<GREYMatcher> historyItem = grey_text(
       base::SysUTF16ToNSString(web::GetDisplayTitleForUrl(destinationURL)));
   [[EarlGrey selectElementWithMatcher:historyItem] performAction:grey_tap()];
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   // Back-forward navigation with WKBasedNavigationManager is served from
   // WKWebView's app-cache, so it won't trigger repost warning.
@@ -323,7 +331,8 @@
     [self confirmResendWarning];
   }
 
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -333,15 +342,16 @@
   [self setUpFormTestSimpleHttpServer];
   const GURL destinationURL = GetDestinationUrl();
 
-  [ChromeEarlGrey loadURL:GetFormUrl()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
   GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
              kSubmitButtonLabel);
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
-  [ChromeEarlGrey goBack];
-  [ChromeEarlGrey goForward];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]);
 
   // WKBasedNavigationManager doesn't triggere repost on |goForward| due to
   // WKWebView's back-forward cache. Force reload to trigger repost. Not using
@@ -353,14 +363,15 @@
 
   [[EarlGrey selectElementWithMatcher:ElementToDismissAlert(@"Cancel")]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
 
   // Expected behavior is different between the two navigation manager
   // implementations.
   if (!web::GetWebClient()->IsSlimNavigationManagerEnabled()) {
     // LegacyNavigationManager displays repost on |goBack|. So after cancelling,
     // web view should show form URL.
-    [ChromeEarlGrey waitForWebViewContainingText:kSubmitButtonLabel];
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewContainingText:kSubmitButtonLabel]);
     [[EarlGrey selectElementWithMatcher:OmniboxText(GetFormUrl().GetContent())]
         assertWithMatcher:grey_notNil()];
     [[EarlGrey selectElementWithMatcher:chrome_test_util::ForwardButton()]
@@ -368,7 +379,8 @@
   } else {
     // WKBasedNavigationManager displays repost on |reload|. So after
     // cancelling, web view should show |destinationURL|.
-    [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
     [[EarlGrey
         selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
         assertWithMatcher:grey_notNil()];
@@ -382,10 +394,11 @@
   [self setUpFormTestSimpleHttpServer];
   const GURL destinationURL = GetDestinationUrl();
 
-  [ChromeEarlGrey loadURL:GetFormUrl()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
   GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
              kSubmitButtonLabel);
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -396,17 +409,18 @@
   } else {
     // Legacy navigation manager presents repost confirmation dialog after
     // loading stops.
-    [ChromeEarlGrey reload];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
   }
 
   // Repost confirmation box should be visible.
-  [ChromeEarlGrey
-      waitForElementWithMatcherSufficientlyVisible:ResendPostButtonMatcher()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForElementWithMatcherSufficientlyVisible:ResendPostButtonMatcher()]);
 
   // Starting a new navigation while the repost dialog is presented should not
   // crash.
-  [ChromeEarlGrey loadURL:GetGenericUrl()];
-  [ChromeEarlGrey waitForWebViewContainingText:kGenericText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetGenericUrl()]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kGenericText]);
 
   // Repost dialog should not be visible anymore.
   [[EarlGrey selectElementWithMatcher:ResendPostButtonMatcher()]
@@ -419,16 +433,18 @@
   [self setUpFormTestSimpleHttpServer];
   GURL destinationURL = GetDestinationUrl();
 
-  [ChromeEarlGrey loadURL:GetFormUrl()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
   GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
              kSubmitButtonLabel);
-  [ChromeEarlGrey waitForWebViewContainingText:kDestinationText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kDestinationText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Go back and verify the browser navigates to the original URL.
-  [ChromeEarlGrey goBack];
-  [ChromeEarlGrey waitForWebViewContainingText:kSubmitButtonLabel];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kSubmitButtonLabel]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(GetFormUrl().GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -438,23 +454,25 @@
   web::test::SetUpHttpServer(std::make_unique<TestFormResponseProvider>());
   const GURL destinationURL = GetDestinationUrl();
 
-  [ChromeEarlGrey loadURL:GetRedirectFormUrl()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetRedirectFormUrl()]);
 
   // Submit the form, which redirects before printing the data.
   GREYAssert(TapWebViewElementWithId(kSubmitButtonLabel), @"Failed to tap %s",
              kSubmitButtonLabel);
 
   // Check that the redirect changes the POST to a GET.
-  [ChromeEarlGrey waitForWebViewContainingText:"GET"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"GET"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
-  [ChromeEarlGrey reload];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey reload]);
 
   // Check that the popup did not show
   [[EarlGrey selectElementWithMatcher:ResendPostButtonMatcher()]
       assertWithMatcher:grey_nil()];
-  [ChromeEarlGrey waitForWebViewContainingText:"GET"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"GET"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -473,23 +491,24 @@
   const GURL formURL = GetFormPostOnSamePageUrl();
 
   // Open the first URL so it's in history.
-  [ChromeEarlGrey loadURL:GetGenericUrl()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetGenericUrl()]);
 
   // Open the second URL, tap the button, and verify the browser navigates to
   // the expected URL.
-  [ChromeEarlGrey loadURL:formURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:formURL]);
   GREYAssert(TapWebViewElementWithId("button"), @"Failed to tap \"button\"");
-  [ChromeEarlGrey waitForWebViewContainingText:"POST"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"POST"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(formURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Go back once and verify the browser navigates to the form URL.
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(formURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Go back a second time and verify the browser navigates to the first URL.
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(GetGenericUrl().GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -501,16 +520,17 @@
   [self setUpFormTestSimpleHttpServer];
   const GURL destinationURL = GetDestinationUrl();
 
-  [ChromeEarlGrey loadURL:GetFormUrl()];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GetFormUrl()]);
   [self submitFormUsingKeyboardGoButtonWithInputID:"textfield"];
 
   // Verify that the browser navigates to the expected URL.
-  [ChromeEarlGrey waitForWebViewContainingText:"bar!"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"bar!"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Go back and verify that the browser navigates to the original URL.
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(GetFormUrl().GetContent())]
       assertWithMatcher:grey_notNil()];
 }
diff --git a/ios/chrome/browser/web/http_auth_egtest.mm b/ios/chrome/browser/web/http_auth_egtest.mm
index 7f77adc..df0e1e9 100644
--- a/ios/chrome/browser/web/http_auth_egtest.mm
+++ b/ios/chrome/browser/web/http_auth_egtest.mm
@@ -13,6 +13,7 @@
 #include "ios/chrome/grit/ios_strings.h"
 #include "ios/chrome/test/app/navigation_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server/http_auth_response_provider.h"
@@ -97,7 +98,8 @@
   [[EarlGrey selectElementWithMatcher:LoginButton()] performAction:grey_tap()];
 
   const std::string pageText = web::HttpAuthResponseProvider::page_text();
-  [ChromeEarlGrey waitForWebViewContainingText:pageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:pageText]);
 }
 
 // Tests Basic HTTP Authentication with incorrect username and password.
diff --git a/ios/chrome/browser/web/js_print_egtest.mm b/ios/chrome/browser/web/js_print_egtest.mm
index 4ad7e25..5119cf7 100644
--- a/ios/chrome/browser/web/js_print_egtest.mm
+++ b/ios/chrome/browser/web/js_print_egtest.mm
@@ -7,6 +7,7 @@
 #include <map>
 
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/testing/earl_grey/disabled_test_macros.h"
@@ -45,10 +46,11 @@
       "value='Print Page' />";
 
   web::test::SetUpSimpleHttpServer(responses);
-  [ChromeEarlGrey loadURL:testURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
 
   // Tap print button.
-  [ChromeEarlGrey tapWebViewElementWithID:@"printButton"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"printButton"]);
 
   // Test if print dialog appeared.
   [[EarlGrey selectElementWithMatcher:grey_accessibilityID(@"Printer Options")]
diff --git a/ios/chrome/browser/web/navigation_egtest.mm b/ios/chrome/browser/web/navigation_egtest.mm
index 2d828d7..16b701d 100644
--- a/ios/chrome/browser/web/navigation_egtest.mm
+++ b/ios/chrome/browser/web/navigation_egtest.mm
@@ -11,6 +11,7 @@
 #import "ios/chrome/test/app/chrome_test_util.h"
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/net/url_test_util.h"
@@ -156,16 +157,19 @@
   // Load the history test page and ensure that its onload text is visible.
   const GURL windowHistoryURL =
       self.testServer->GetURL(kWindowHistoryGoTestURL);
-  [ChromeEarlGrey loadURL:windowHistoryURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:windowHistoryURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
 
   // Tap on the window.history.go() button.  This will clear |kOnLoadText|, so
   // the subsequent check for |kOnLoadText| will only pass if a reload has
   // occurred.
-  [ChromeEarlGrey tapWebViewElementWithID:kGoNoParameterID];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kGoNoParameterID]);
 
   // Verify that the onload text is reset.
-  [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
 }
 
 // Tests reloading the current page via history.go(0).
@@ -174,16 +178,18 @@
   // Load the history test page and ensure that its onload text is visible.
   const GURL windowHistoryURL =
       self.testServer->GetURL(kWindowHistoryGoTestURL);
-  [ChromeEarlGrey loadURL:windowHistoryURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:windowHistoryURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
 
   // Tap on the window.history.go() button.  This will clear |kOnLoadText|, so
   // the subsequent check for |kOnLoadText| will only pass if a reload has
   // occurred.
-  [ChromeEarlGrey tapWebViewElementWithID:kGoZeroID];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:kGoZeroID]);
 
   // Verify that the onload text is reset.
-  [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
 }
 
 // Tests that calling window.history.go() with an offset that is out of bounds
@@ -193,20 +199,24 @@
   // Load the history test page and ensure that its onload text is visible.
   const GURL windowHistoryURL =
       self.testServer->GetURL(kWindowHistoryGoTestURL);
-  [ChromeEarlGrey loadURL:windowHistoryURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:windowHistoryURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
 
   // Tap on the window.history.go(2) button.  This will clear all div text, so
   // the subsequent check for |kNoOpText| will only pass if no navigations have
   // occurred.
-  [ChromeEarlGrey tapWebViewElementWithID:kGoTwoID];
-  [ChromeEarlGrey waitForWebViewContainingText:kNoOpText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:kGoTwoID]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kNoOpText]);
 
   // Tap on the window.history.go(-2) button.  This will clear all div text, so
   // the subsequent check for |kNoOpText| will only pass if no navigations have
   // occurred.
-  [ChromeEarlGrey tapWebViewElementWithID:kGoBackTwoID];
-  [ChromeEarlGrey waitForWebViewContainingText:kNoOpText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kGoBackTwoID]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kNoOpText]);
 }
 
 // Tests going back and forward via history.go().
@@ -218,21 +228,25 @@
   const GURL fourthURL = self.testServer->GetURL("/history.html");
 
   // Load 4 pages.
-  [ChromeEarlGrey loadURL:firstURL];
-  [ChromeEarlGrey loadURL:secondURL];
-  [ChromeEarlGrey loadURL:thirdURL];
-  [ChromeEarlGrey loadURL:fourthURL];
-  [ChromeEarlGrey waitForWebViewContainingText:"onload"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:firstURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:secondURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:thirdURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:fourthURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"onload"]);
 
   // Tap button to go back 3 pages.
-  [ChromeEarlGrey tapWebViewElementWithID:@"goBack3"];
-  [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"goBack3"]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(firstURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Tap button to go forward 2 pages.
-  [ChromeEarlGrey tapWebViewElementWithID:kGoTwoID];
-  [ChromeEarlGrey waitForWebViewContainingText:"pony"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:kGoTwoID]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(thirdURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -244,20 +258,24 @@
   // Load the history test page and ensure that its onload text is visible.
   const GURL windowHistoryURL =
       self.testServer->GetURL(kWindowHistoryGoTestURL);
-  [ChromeEarlGrey loadURL:windowHistoryURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:windowHistoryURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
 
   const GURL sampleURL = self.testServer->GetURL(kSimpleFileBasedTestURL);
-  [ChromeEarlGrey loadURL:sampleURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:sampleURL]);
 
-  [ChromeEarlGrey loadURL:windowHistoryURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:windowHistoryURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
 
   // Tap the window.history.go(-2) button.  This will clear the current page's
   // |kOnLoadText|, so the subsequent check will only pass if another load
   // occurs.
-  [ChromeEarlGrey tapWebViewElementWithID:kGoBackTwoID];
-  [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kGoBackTwoID]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
 }
 
 #pragma mark window.history.[back/forward] operations
@@ -267,15 +285,16 @@
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
   // Navigate to a URL.
   const GURL firstURL = self.testServer->GetURL(kSimpleFileBasedTestURL);
-  [ChromeEarlGrey loadURL:firstURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:firstURL]);
 
   // Navigate to an HTML page with a back button.
   const GURL secondURL = self.testServer->GetURL(kWindowHistoryGoTestURL);
-  [ChromeEarlGrey loadURL:secondURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:secondURL]);
 
   // Tap the back button in the HTML and verify the first URL is loaded.
-  [ChromeEarlGrey tapWebViewElementWithID:kGoBackID];
-  [ChromeEarlGrey waitForWebViewContainingText:"pony"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:kGoBackID]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(firstURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -291,22 +310,25 @@
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
   // Navigate to an HTML page with a forward button.
   const GURL firstURL = self.testServer->GetURL(kWindowHistoryGoTestURL);
-  [ChromeEarlGrey loadURL:firstURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:firstURL]);
 
   // Navigate to some other page.
   const GURL secondURL = self.testServer->GetURL(kSimpleFileBasedTestURL);
-  [ChromeEarlGrey loadURL:secondURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:secondURL]);
 
   // Tap the back button in the toolbar and verify the page with forward button
   // is loaded.
   [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kOnLoadText]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(firstURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Tap the forward button in the HTML and verify the second URL is loaded.
-  [ChromeEarlGrey tapWebViewElementWithID:kGoForwardID];
-  [ChromeEarlGrey waitForWebViewContainingText:"pony"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:kGoForwardID]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(secondURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -322,19 +344,21 @@
 - (void)testHistoryBackAndForwardAroundNTP {
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
   const GURL testURL = self.testServer->GetURL(kSimpleFileBasedTestURL);
-  [ChromeEarlGrey loadURL:testURL];
-  [ChromeEarlGrey waitForWebViewContainingText:"pony"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:testURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
 
   // Tap the back button and verify NTP is loaded.
   [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()];
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForPageToFinishLoading]);
   [[EarlGrey selectElementWithMatcher:ContentSuggestionCollectionView()]
       assertWithMatcher:grey_notNil()];
 
   // Tap the forward button and verify test page is loaded.
   [[EarlGrey selectElementWithMatcher:ForwardButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:"pony"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
 }
 
 #pragma mark window.location.hash operations
@@ -349,7 +373,7 @@
   const GURL hashChangedWithHistoryURL =
       self.testServer->GetURL(kHashChangedWithHistoryURL);
 
-  [ChromeEarlGrey loadURL:page1URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:page1URL]);
 
   // Click link to update location.hash and go to new URL (same page).
   GREYAssert(TapWebViewElementWithId(kHashChangeWithHistoryLabel),
@@ -363,7 +387,8 @@
       net::GetContentAndFragmentForUrl(page1URL);
   [[EarlGrey selectElementWithMatcher:OmniboxText(page1OmniboxText)]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForWebViewContainingText:backHashChangeContent];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:backHashChangeContent]);
 
   // Navigate forward to the new URL. This should fire a hashchange event.
   std::string forwardHashChangeContent = "forwardHashChange";
@@ -375,13 +400,15 @@
   [[EarlGrey
       selectElementWithMatcher:OmniboxText(hashChangedWithHistoryOmniboxText)]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForWebViewContainingText:forwardHashChangeContent];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:forwardHashChangeContent]);
 
   // Load a hash URL directly. This shouldn't fire a hashchange event.
   std::string hashChangeContent = "FAIL_loadUrlHashChange";
   [self addHashChangeListenerWithContent:hashChangeContent];
-  [ChromeEarlGrey loadURL:hashChangedWithHistoryURL];
-  [ChromeEarlGrey waitForWebViewNotContainingText:hashChangeContent];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:hashChangedWithHistoryURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewNotContainingText:hashChangeContent]);
 }
 
 // Loads a URL and replaces its location, then updates its location.hash
@@ -396,7 +423,7 @@
   const GURL hashChangedWithoutHistoryURL =
       self.testServer->GetURL(kHashChangedWithoutHistoryURL);
 
-  [ChromeEarlGrey loadURL:page1URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:page1URL]);
 
   // Tap link to replace the location value.
   GREYAssert(TapWebViewElementWithId(kHashChangeWithoutHistoryLabel),
@@ -434,7 +461,7 @@
   const GURL hashChangedWithHistoryURL =
       self.testServer->GetURL(kHashChangedWithHistoryURL);
 
-  [ChromeEarlGrey loadURL:page1URL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:page1URL]);
 
   // Tap link to update location.hash with a new value.
   GREYAssert(TapWebViewElementWithId(kHashChangeWithHistoryLabel),
@@ -477,8 +504,8 @@
   const GURL originURL = self.testServer->GetURL(kRedirectWindowURL);
   const GURL destinationURL = self.testServer->GetURL(kDestinationURL);
 
-  [ChromeEarlGrey loadURL:initialURL];
-  [ChromeEarlGrey loadURL:originURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:initialURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:originURL]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -536,24 +563,27 @@
 
   // Load index, tap on redirect link, and assert that the page is redirected
   // to the proper destination.
-  [ChromeEarlGrey loadURL:indexURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:indexURL]);
   GREYAssert(TapWebViewElementWithId(redirectLabel), @"Failed to tap %s",
              redirectLabel.c_str());
-  [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Navigate to a new URL, navigate back and assert that the resulting page is
   // the proper destination.
-  [ChromeEarlGrey loadURL:lastURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:lastURL]);
   [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Navigate back and assert that the resulting page is the initial index.
   [[EarlGrey selectElementWithMatcher:BackButton()] performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:redirectLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:redirectLabel]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(indexURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 
@@ -561,7 +591,8 @@
   // destination.
   [[EarlGrey selectElementWithMatcher:ForwardButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"You've arrived"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -571,17 +602,19 @@
 - (void)testRestoreHistoryToWebUIAndNavigateForward {
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
   const GURL destinationURL = self.testServer->GetURL(kSimpleFileBasedTestURL);
-  [ChromeEarlGrey loadURL:GURL("chrome://version")];
-  [ChromeEarlGrey loadURL:destinationURL];
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL("chrome://version")]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:destinationURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   GREYAssert(PurgeCachedWebViewPages(), @"History not restored");
 
-  [ChromeEarlGrey waitForWebViewContainingText:"Revision"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Revision"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText("chrome://version")]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey goForward];
-  [ChromeEarlGrey waitForWebViewContainingText:"pony"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -591,13 +624,14 @@
 - (void)testRestoreHistoryToNTPAndNavigateForward {
   GREYAssertTrue(self.testServer->Start(), @"Test server failed to start.");
   const GURL destinationURL = self.testServer->GetURL(kSimpleFileBasedTestURL);
-  [ChromeEarlGrey loadURL:destinationURL];
-  [ChromeEarlGrey goBack];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:destinationURL]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goBack]);
 
   GREYAssert(PurgeCachedWebViewPages(), @"History not restored");
 
-  [ChromeEarlGrey goForward];
-  [ChromeEarlGrey waitForWebViewContainingText:"pony"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey goForward]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"pony"]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(destinationURL.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
diff --git a/ios/chrome/browser/web/progress_indicator_egtest.mm b/ios/chrome/browser/web/progress_indicator_egtest.mm
index 73c94cd..646b0bc1 100644
--- a/ios/chrome/browser/web/progress_indicator_egtest.mm
+++ b/ios/chrome/browser/web/progress_indicator_egtest.mm
@@ -191,7 +191,8 @@
   chrome_test_util::LoadUrl(infinitePendingURL);
 
   // Wait until the page is half loaded.
-  [ChromeEarlGrey waitForWebViewContainingText:kPageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageText]);
 
   // Verify progress view visible and halfway progress.
   [[EarlGrey selectElementWithMatcher:ProgressViewWithProgress(0.5)]
@@ -225,13 +226,15 @@
   web::test::AddResponseProvider(std::move(uniqueInfinitePendingProvider));
 
   // Load form first.
-  [ChromeEarlGrey loadURL:formURL];
-  [ChromeEarlGrey waitForWebViewContainingText:kFormPageText];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:formURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kFormPageText]);
 
   chrome_test_util::SubmitWebViewFormWithId(kFormID);
 
   // Wait until the page is half loaded.
-  [ChromeEarlGrey waitForWebViewContainingText:kPageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageText]);
 
   // Verify progress view visible and halfway progress.
   [[EarlGrey selectElementWithMatcher:ProgressViewWithProgress(0.5)]
@@ -256,14 +259,16 @@
   responses[simplePageURL] = kPageText;
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:formURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:formURL]);
 
-  [ChromeEarlGrey waitForWebViewContainingText:kFormPageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kFormPageText]);
 
   chrome_test_util::SubmitWebViewFormWithId(kFormID);
 
   // Verify the new page has been loaded.
-  [ChromeEarlGrey waitForWebViewContainingText:kPageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageText]);
 
   // Verify progress view is not visible.
   [[EarlGrey selectElementWithMatcher:ProgressView()]
@@ -283,10 +288,11 @@
   responses[formURL] = [self formPageHTMLWithSuppressedSubmitEvent];
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:formURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:formURL]);
 
   // Verify the form page has been loaded.
-  [ChromeEarlGrey waitForWebViewContainingText:kFormPageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kFormPageText]);
 
   chrome_test_util::SubmitWebViewFormWithId(kFormID);
 
diff --git a/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm b/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm
index d66d606..17dfd5c 100644
--- a/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm
+++ b/ios/chrome/browser/web/push_and_replace_state_navigation_egtest.mm
@@ -10,6 +10,7 @@
 #include "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/net/url_test_util.h"
@@ -63,20 +64,24 @@
   const std::string pushStatePathSpaceOmniboxText =
       net::GetContentAndFragmentForUrl(pushStatePathSpaceURL);
   web::test::SetUpFileBasedHttpServer();
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kHistoryTestUrl)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kHistoryTestUrl)]);
 
   // Push 3 URLs. Verify that the URL changed and the status was updated.
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashWithObject"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashWithObject"]);
   [self assertStatusText:@"pushStateHashWithObject"
          withOmniboxText:pushStateHashWithObjectOmniboxText
               pageLoaded:NO];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushStateRootPath"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateRootPath"]);
   [self assertStatusText:@"pushStateRootPath"
          withOmniboxText:pushStateRootPathOmniboxText
               pageLoaded:NO];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushStatePathSpace"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushStatePathSpace"]);
   [self assertStatusText:@"pushStatePathSpace"
          withOmniboxText:pushStatePathSpaceOmniboxText
               pageLoaded:NO];
@@ -93,7 +98,7 @@
          withOmniboxText:pushStateHashWithObjectOmniboxText
               pageLoaded:NO];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"goBack"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey tapWebViewElementWithID:@"goBack"]);
   const GURL historyTestURL = web::test::HttpServer::MakeUrl(kHistoryTestUrl);
   [self assertStatusText:nil
          withOmniboxText:net::GetContentAndFragmentForUrl(historyTestURL)
@@ -101,7 +106,8 @@
 
   // Go forward 2 pages and check that the page doesn't load and the status text
   // is updated by the popstate event.
-  [ChromeEarlGrey tapWebViewElementWithID:@"goForward2"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"goForward2"]);
   [self assertStatusText:@"pushStateRootPath"
          withOmniboxText:pushStateRootPathOmniboxText
               pageLoaded:NO];
@@ -113,15 +119,17 @@
   const GURL initialURL = web::test::HttpServer::MakeUrl(kNonPushedUrl);
   const std::string initialOmniboxText =
       net::GetContentAndFragmentForUrl(initialURL);
-  [ChromeEarlGrey loadURL:initialURL];
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kHistoryTestUrl)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:initialURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kHistoryTestUrl)]);
 
   // Replace the URL and go back then forward.
   const GURL replaceStateHashWithObjectURL =
       web::test::HttpServer::MakeUrl(kReplaceStateHashWithObjectURL);
   const std::string replaceStateHashWithObjectOmniboxText =
       net::GetContentAndFragmentForUrl(replaceStateHashWithObjectURL);
-  [ChromeEarlGrey tapWebViewElementWithID:@"replaceStateHashWithObject"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"replaceStateHashWithObject"]);
   [self assertStatusText:@"replaceStateHashWithObject"
          withOmniboxText:replaceStateHashWithObjectOmniboxText
               pageLoaded:NO];
@@ -145,7 +153,8 @@
       web::test::HttpServer::MakeUrl(kPushStateHashStringURL);
   const std::string pushStateHashStringOmniboxText =
       net::GetContentAndFragmentForUrl(pushStateHashStringURL);
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"]);
   [self assertStatusText:@"pushStateHashString"
          withOmniboxText:pushStateHashStringOmniboxText
               pageLoaded:NO];
@@ -154,7 +163,8 @@
       web::test::HttpServer::MakeUrl(kReplaceStateHashStringURL);
   const std::string replaceStateHashStringOmniboxText =
       net::GetContentAndFragmentForUrl(replaceStateHashStringURL);
-  [ChromeEarlGrey tapWebViewElementWithID:@"replaceStateHashString"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"replaceStateHashString"]);
   [self assertStatusText:@"replaceStateHashString"
          withOmniboxText:replaceStateHashStringOmniboxText
               pageLoaded:NO];
@@ -163,7 +173,8 @@
       web::test::HttpServer::MakeUrl(kPushStatePathURL);
   const std::string pushStatePathOmniboxText =
       net::GetContentAndFragmentForUrl(pushStatePathURL);
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushStatePath"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushStatePath"]);
   [self assertStatusText:@"pushStatePath"
          withOmniboxText:pushStatePathOmniboxText
               pageLoaded:NO];
@@ -172,7 +183,8 @@
       web::test::HttpServer::MakeUrl(kReplaceStateRootPathSpaceURL);
   const std::string replaceStateRootPathSpaceOmniboxText =
       net::GetContentAndFragmentForUrl(replaceStateRootPathSpaceURL);
-  [ChromeEarlGrey tapWebViewElementWithID:@"replaceStateRootPathSpace"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"replaceStateRootPathSpace"]);
   [self assertStatusText:@"replaceStateRootPathSpace"
          withOmniboxText:replaceStateRootPathSpaceOmniboxText
               pageLoaded:NO];
@@ -188,7 +200,8 @@
               pageLoaded:NO];
 
   // Go forward and check URL.
-  [ChromeEarlGrey tapWebViewElementWithID:@"goForward2"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"goForward2"]);
   [self assertStatusText:@"replaceStateRootPathSpace"
          withOmniboxText:replaceStateRootPathSpaceOmniboxText
               pageLoaded:NO];
@@ -199,7 +212,7 @@
   GURL nonPushedURL = web::test::HttpServer::MakeUrl(kNonPushedUrl);
   web::test::SetUpFileBasedHttpServer();
   const GURL historyTestURL = web::test::HttpServer::MakeUrl(kHistoryTestUrl);
-  [ChromeEarlGrey loadURL:historyTestURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:historyTestURL]);
   const std::string historyTestOmniboxText =
       net::GetContentAndFragmentForUrl(historyTestURL);
 
@@ -208,21 +221,24 @@
       web::test::HttpServer::MakeUrl(kPushStateHashStringURL);
   const std::string pushStateHashStringOmniboxText =
       net::GetContentAndFragmentForUrl(pushStateHashStringURL);
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"]);
   [self assertStatusText:@"pushStateHashString"
          withOmniboxText:pushStateHashStringOmniboxText
               pageLoaded:NO];
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"]);
   [self assertStatusText:@"pushStateHashString"
          withOmniboxText:pushStateHashStringOmniboxText
               pageLoaded:NO];
 
   // Load a non-pushed URL.
-  [ChromeEarlGrey loadURL:nonPushedURL];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:nonPushedURL]);
 
   // Load history.html and push another URL.
-  [ChromeEarlGrey loadURL:historyTestURL];
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:historyTestURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateHashString"]);
   [self assertStatusText:@"pushStateHashString"
          withOmniboxText:pushStateHashStringOmniboxText
               pageLoaded:NO];
@@ -253,14 +269,16 @@
               pageLoaded:NO];
 
   // Go forward 4 entries at once (to third #string) and verify page did load.
-  [ChromeEarlGrey tapWebViewElementWithID:@"goForward4"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"goForward4"]);
 
   [self assertStatusText:nil
          withOmniboxText:pushStateHashStringOmniboxText
               pageLoaded:expectOnLoad];
 
   // Go back 4 entries at once (to first #string) and verify page did load.
-  [ChromeEarlGrey tapWebViewElementWithID:@"goBack4"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"goBack4"]);
 
   [self assertStatusText:nil
          withOmniboxText:pushStateHashStringOmniboxText
@@ -287,27 +305,33 @@
   NSString* pushStateUnicode2Status = @"pushStateUnicode2∢";
 
   web::test::SetUpFileBasedHttpServer();
-  [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kHistoryTestUrl)];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:web::test::HttpServer::MakeUrl(kHistoryTestUrl)]);
 
   // Do 2 push states with unicode characters.
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushStateUnicode"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateUnicode"]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::OmniboxText(pushStateUnicode)]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForWebViewContainingText:pushStateUnicodeLabel];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:pushStateUnicodeLabel]);
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushStateUnicode2"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushStateUnicode2"]);
   [[EarlGrey
       selectElementWithMatcher:chrome_test_util::OmniboxText(pushStateUnicode2)]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForWebViewContainingText:pushStateUnicode2Label];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:pushStateUnicode2Label]);
 
   // Do a push state without a unicode character.
   const GURL pushStatePathURL =
       web::test::HttpServer::MakeUrl(kPushStatePathURL);
   const std::string pushStatePathOmniboxText =
       net::GetContentAndFragmentForUrl(pushStatePathURL);
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushStatePath"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushStatePath"]);
 
   [self assertStatusText:@"pushStatePath"
          withOmniboxText:pushStatePathOmniboxText
@@ -355,13 +379,15 @@
       [NSString stringWithFormat:simplePage, baseTag, pushAndReplaceButtons]);
   web::test::SetUpSimpleHttpServer(responses);
 
-  [ChromeEarlGrey loadURL:originURL];
-  [ChromeEarlGrey tapWebViewElementWithID:@"pushState"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:originURL]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"pushState"]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           pushResultOmniboxText)]
       assertWithMatcher:grey_notNil()];
 
-  [ChromeEarlGrey tapWebViewElementWithID:@"replaceState"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey tapWebViewElementWithID:@"replaceState"]);
   [[EarlGrey selectElementWithMatcher:chrome_test_util::OmniboxText(
                                           replaceResultOmniboxText)]
       assertWithMatcher:grey_notNil()];
@@ -376,15 +402,17 @@
          withOmniboxText:(const std::string&)omniboxText
               pageLoaded:(BOOL)pageLoaded {
   if (pageLoaded) {
-    [ChromeEarlGrey waitForWebViewContainingText:"onload"];
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewContainingText:"onload"]);
   } else {
-    [ChromeEarlGrey waitForWebViewNotContainingText:"onload"];
+    CHROME_EG_ASSERT_NO_ERROR(
+        [ChromeEarlGrey waitForWebViewNotContainingText:"onload"]);
   }
 
   if (status != nil) {
     NSString* statusLabel = [NSString stringWithFormat:@"Action: %@", status];
-    [ChromeEarlGrey
-        waitForWebViewContainingText:base::SysNSStringToUTF8(statusLabel)];
+    CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+        waitForWebViewContainingText:base::SysNSStringToUTF8(statusLabel)]);
   }
 
   [[EarlGrey
diff --git a/ios/chrome/browser/web/stop_loading_egtest.mm b/ios/chrome/browser/web/stop_loading_egtest.mm
index 82f36759..f48b124 100644
--- a/ios/chrome/browser/web/stop_loading_egtest.mm
+++ b/ios/chrome/browser/web/stop_loading_egtest.mm
@@ -12,6 +12,7 @@
 #include "ios/chrome/test/app/navigation_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/web/public/test/http_server/html_response_provider.h"
@@ -108,7 +109,8 @@
   }
 
   // Wait until the page is half loaded.
-  [ChromeEarlGrey waitForWebViewContainingText:kPageText];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kPageText]);
 
   // On iPhone Stop/Reload button is a part of tools menu, so open it.
   if (!IsIPadIdiom()) {
diff --git a/ios/chrome/browser/web/tab_order_egtest.mm b/ios/chrome/browser/web/tab_order_egtest.mm
index e75aa3c..482dfb9f 100644
--- a/ios/chrome/browser/web/tab_order_egtest.mm
+++ b/ios/chrome/browser/web/tab_order_egtest.mm
@@ -9,6 +9,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_actions.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/earl_grey/web_view_matchers.h"
@@ -57,8 +58,9 @@
   const GURL URL1 = self.testServer->GetURL(kLinksTestURL1);
 
   // Create a tab that will act as the parent tab.
-  [ChromeEarlGrey loadURL:URL1];
-  [ChromeEarlGrey waitForWebViewContainingText:kLinksTestURL1Text];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLinksTestURL1Text]);
   Tab* parentTab = chrome_test_util::GetCurrentTab();
 
   // Child tab should be inserted after the parent.
@@ -68,7 +70,7 @@
                         true /* menu should appear */)];
   [[EarlGrey selectElementWithMatcher:OpenLinkInNewTabButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForMainTabCount:2U];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2U]);
   Tab* childTab1 = chrome_test_util::GetNextTab();
 
   // New child tab should be inserted AFTER |childTab1|.
@@ -78,7 +80,7 @@
                         true /* menu should appear */)];
   [[EarlGrey selectElementWithMatcher:OpenLinkInNewTabButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForMainTabCount:3U];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:3U]);
   GREYAssertEqual(childTab1, chrome_test_util::GetNextTab(),
                   @"Unexpected next tab");
 
@@ -86,13 +88,15 @@
   // grouping with the current child tabs. Total number of tabs should not
   // change.
   const GURL URL2 = self.testServer->GetURL(kLinksTestURL2);
-  [ChromeEarlGrey loadURL:URL2];
-  [ChromeEarlGrey waitForWebViewContainingText:kLinksTestURL2Text];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL2]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLinksTestURL2Text]);
   GREYAssertEqual(3U, chrome_test_util::GetMainTabCount(),
                   @"Unexpected number of tabs");
 
-  [ChromeEarlGrey loadURL:URL1];
-  [ChromeEarlGrey waitForWebViewContainingText:kLinksTestURL1Text];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:URL1]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kLinksTestURL1Text]);
   GREYAssertEqual(3U, chrome_test_util::GetMainTabCount(),
                   @"Unexpected number of tabs");
 
@@ -103,7 +107,7 @@
                         true /* menu should appear */)];
   [[EarlGrey selectElementWithMatcher:OpenLinkInNewTabButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForMainTabCount:4U];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:4U]);
   Tab* childTab3 = chrome_test_util::GetNextTab();
   GREYAssertNotEqual(childTab1, childTab3, @"Unexpected next tab");
 
@@ -114,7 +118,7 @@
                         true /* menu should appear */)];
   [[EarlGrey selectElementWithMatcher:OpenLinkInNewTabButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForMainTabCount:5U];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:5U]);
   GREYAssertEqual(childTab3, chrome_test_util::GetNextTab(),
                   @"Unexpected next tab");
 
@@ -125,8 +129,8 @@
 
   // Add a non-owned tab. It should be added at the end and marked as the
   // current tab. Next tab should wrap back to index 0, the original parent tab.
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey waitForMainTabCount:6U];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:6U]);
   GREYAssertEqual(parentTab, chrome_test_util::GetNextTab(),
                   @"Unexpected next tab");
 
diff --git a/ios/chrome/browser/web/visible_url_egtest.mm b/ios/chrome/browser/web/visible_url_egtest.mm
index d7b3217..f6e16e3 100644
--- a/ios/chrome/browser/web/visible_url_egtest.mm
+++ b/ios/chrome/browser/web/visible_url_egtest.mm
@@ -17,6 +17,7 @@
 #include "ios/chrome/test/app/navigation_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/common/features.h"
@@ -149,8 +150,8 @@
   _responseProvider = unique_provider.get();
   web::test::SetUpHttpServer(std::move(unique_provider));
 
-  [ChromeEarlGrey loadURL:_testURL1];
-  [ChromeEarlGrey loadURL:_testURL2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_testURL1]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_testURL2]);
 }
 
 - (void)tearDown {
@@ -175,7 +176,8 @@
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Tap the back button in the toolbar and verify that URL2 (committed URL) is
@@ -189,14 +191,16 @@
 
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
   [self setServerPaused:YES];
 
   // Tap the forward button in the toolbar and verify that URL1 (committed URL)
@@ -210,7 +214,8 @@
 
   // Make server respond so URL2 becomes committed.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -225,7 +230,8 @@
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Re-enable synchronization here to synchronize EarlGrey LongPress and Tap
@@ -253,7 +259,8 @@
 
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -268,7 +275,8 @@
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Tap the back button, stop pending navigation and reload.
@@ -290,7 +298,8 @@
 
   // Make server respond and verify that page2 was reloaded, not page1.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -305,12 +314,14 @@
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Tap the back button on the page and verify that URL2 (committed URL) is
   // displayed even though URL1 is a pending URL.
-  [ChromeEarlGrey tapWebViewElementWithID:base::SysUTF8ToNSString(kGoBackLink)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoBackLink)]);
   GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL1],
              @"Last request URL: %@", self.lastRequestURLSpec);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
@@ -318,20 +329,22 @@
 
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
   [self setServerPaused:YES];
 
   // Tap the forward button on the page and verify that URL1 (committed URL)
   // is displayed even though URL2 is a pending URL.
-  [ChromeEarlGrey
-      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoForwardLink)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoForwardLink)]);
   GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL2],
              @"Last request URL: %@", self.lastRequestURLSpec);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
@@ -339,7 +352,8 @@
 
   // Make server respond so URL2 becomes committed.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -354,13 +368,14 @@
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Tap the go negative delta button on the page and verify that URL2
   // (committed URL) is displayed even though URL1 is a pending URL.
-  [ChromeEarlGrey
-      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoNegativeDeltaLink)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoNegativeDeltaLink)]);
   GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL1],
              @"Last request URL: %@", self.lastRequestURLSpec);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
@@ -368,20 +383,22 @@
 
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
   [self setServerPaused:YES];
 
   // Tap go positive delta button on the page and verify that URL1 (committed
   // URL) is displayed even though URL2 is a pending URL.
-  [ChromeEarlGrey
-      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoPositiveDeltaLink)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoPositiveDeltaLink)]);
   GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL2],
              @"Last request URL: %@", self.lastRequestURLSpec);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
@@ -389,7 +406,8 @@
 
   // Make server respond so URL2 becomes committed.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -404,7 +422,8 @@
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Start reloading the page.
@@ -430,7 +449,8 @@
 
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -453,11 +473,13 @@
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Start renderer initiated navigation.
-  [ChromeEarlGrey tapWebViewElementWithID:base::SysUTF8ToNSString(kPage3Link)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebViewElementWithID:base::SysUTF8ToNSString(kPage3Link)]);
 
   // Do not wait until renderer-initiated navigation is finished, tap the back
   // button in the toolbar and verify that URL2 (committed URL) is displayed
@@ -471,7 +493,8 @@
 
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -487,7 +510,8 @@
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage2];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage2]);
   [self setServerPaused:YES];
 
   // Tap the back button in the toolbar and verify that URL2 (committed URL) is
@@ -500,13 +524,15 @@
       assertWithMatcher:grey_notNil()];
 
   // Interrupt back navigation with renderer initiated navigation.
-  [ChromeEarlGrey tapWebViewElementWithID:base::SysUTF8ToNSString(kPage3Link)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebViewElementWithID:base::SysUTF8ToNSString(kPage3Link)]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL2.GetContent())]
       assertWithMatcher:grey_notNil()];
 
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage3];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage3]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL3.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -519,12 +545,13 @@
     EARL_GREY_TEST_DISABLED(@"Test disabled on SlimNavigationManager.");
 
   // Create 3rd entry in the history, to be able to go back twice.
-  [ChromeEarlGrey loadURL:_testURL3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_testURL3]);
 
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage3];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage3]);
   [self setServerPaused:YES];
 
   // Tap the back button twice in the toolbar and verify that URL3 (committed
@@ -541,7 +568,8 @@
 
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
@@ -555,21 +583,23 @@
 
   // Create 3rd entry in the history, to be able to go back twice.
   GURL URL(kChromeUIVersionURL);
-  [ChromeEarlGrey loadURL:GURL(kChromeUIVersionURL)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:GURL(kChromeUIVersionURL)]);
 
   // Tap the back button twice in the toolbar and wait for URL 1 to load.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
       performAction:grey_tap()];
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
       performAction:grey_tap()];
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
 
   // Quickly navigate forward twice and wait for kChromeUIVersionURL to load.
   [chrome_test_util::BrowserCommandDispatcherForMainBVC() goForward];
   [chrome_test_util::BrowserCommandDispatcherForMainBVC() goForward];
 
   const std::string version = version_info::GetVersionNumber();
-  [ChromeEarlGrey waitForWebViewContainingText:version];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:version]);
 
   // Make sure that kChromeUIVersionURL URL is displayed in the omnibox.
   std::string expectedText = base::UTF16ToUTF8(web::GetDisplayTitleForUrl(URL));
@@ -585,18 +615,21 @@
     EARL_GREY_TEST_DISABLED(@"Test disabled on SlimNavigationManager.");
 
   // Create 3rd entry in the history, to be able to go back twice.
-  [ChromeEarlGrey loadURL:_testURL3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey loadURL:_testURL3]);
 
   // Purge web view caches and pause the server to make sure that tests can
   // verify omnibox state before server starts responding.
   GREYAssert(PurgeCachedWebViewPages(), @"Pages were not purged");
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage3];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage3]);
   [self setServerPaused:YES];
 
   // Tap the back button twice on the page and verify that URL3 (committed URL)
   // is displayed even though URL1 is a pending URL.
-  [ChromeEarlGrey tapWebViewElementWithID:base::SysUTF8ToNSString(kGoBackLink)];
-  [ChromeEarlGrey tapWebViewElementWithID:base::SysUTF8ToNSString(kGoBackLink)];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoBackLink)]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      tapWebViewElementWithID:base::SysUTF8ToNSString(kGoBackLink)]);
   // Server will receive only one request either for |_testURL2| or for
   // |_testURL1| depending on load timing and then will pause. So there is no
   // need to wait for particular request.
@@ -606,7 +639,8 @@
   // Make server respond so URL1 becomes committed.
   [self setServerPaused:NO];
   // TODO(crbug.com/866406): fix the test to have documented behavior.
-  [ChromeEarlGrey waitForWebViewContainingText:kTestPage1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:kTestPage1]);
   [[EarlGrey selectElementWithMatcher:OmniboxText(_testURL1.GetContent())]
       assertWithMatcher:grey_notNil()];
 }
diff --git a/ios/chrome/browser/web/window_open_by_dom_egtest.mm b/ios/chrome/browser/web/window_open_by_dom_egtest.mm
index ddd378e..fc73c76 100644
--- a/ios/chrome/browser/web/window_open_by_dom_egtest.mm
+++ b/ios/chrome/browser/web/window_open_by_dom_egtest.mm
@@ -16,6 +16,7 @@
 #import "ios/chrome/test/app/tab_test_util.h"
 #import "ios/chrome/test/app/web_view_interaction_test_util.h"
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_matchers.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "ios/net/url_test_util.h"
@@ -71,9 +72,11 @@
 - (void)setUp {
   [super setUp];
   // Open the test page. There should only be one tab open.
-  [ChromeEarlGrey loadURL:HttpServer::MakeUrl(kTestURL)];
-  [ChromeEarlGrey waitForWebViewContainingText:"Expected result"];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:HttpServer::MakeUrl(kTestURL)]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Expected result"]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 // Tests that opening a link with target=_blank which then immediately closes
@@ -83,7 +86,7 @@
       TapWebViewElementWithId(
           "webScenarioWindowOpenBlankTargetWithImmediateClose"),
       @"Failed to tap \"webScenarioWindowOpenBlankTargetWithImmediateClose\"");
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 // Tests that sessionStorage content is available for windows opened by DOM via
@@ -98,8 +101,9 @@
                         GetCurrentWebState(),
                         [ElementSelector selectorWithElementID:ID])];
 
-  [ChromeEarlGrey waitForMainTabCount:2];
-  [ChromeEarlGrey waitForWebViewContainingText:"Expected result"];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Expected result"]);
 
   id value = ExecuteJavaScript(@"sessionStorage.getItem('key');", &error);
   GREYAssert(!error, @"Error during script execution: %@", error);
@@ -113,7 +117,7 @@
       performAction:web::WebViewTapElement(
                         GetCurrentWebState(),
                         [ElementSelector selectorWithElementID:ID])];
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests executing script that clicks a link with target="_blank".
@@ -124,8 +128,9 @@
       @"document.getElementById('webScenarioWindowOpenRegularLink').click()",
       &error);
   GREYAssert(!error, @"Failed to tap 'webScenarioWindowOpenRegularLink'");
-  [ChromeEarlGrey waitForElementWithMatcherSufficientlyVisible:PopupBlocker()];
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey
+      waitForElementWithMatcherSufficientlyVisible:PopupBlocker()]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 // Tests a link with target="_blank" multiple times.
@@ -137,13 +142,13 @@
       test_page_web_state, [ElementSelector selectorWithElementID:ID]);
   [[EarlGrey selectElementWithMatcher:test_page_matcher]
       performAction:link_tap];
-  [ChromeEarlGrey waitForMainTabCount:2];
-  [ChromeEarlGrey openNewTab];
-  [ChromeEarlGrey waitForMainTabCount:3];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:3]);
   chrome_test_util::SelectTabAtIndexInCurrentMode(0);
   [[EarlGrey selectElementWithMatcher:test_page_matcher]
       performAction:link_tap];
-  [ChromeEarlGrey waitForMainTabCount:4];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:4]);
 }
 
 // Tests a window.open by assigning to window.location.
@@ -151,7 +156,7 @@
   GREYAssert(
       TapWebViewElementWithId("webScenarioWindowOpenTabWithAssignmentToHref"),
       @"Failed to tap \"webScenarioWindowOpenTabWithAssignmentToHref\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests that opening a window and calling window.location.assign works.
@@ -160,7 +165,7 @@
   GREYAssert(
       TapWebViewElementWithId("webScenarioWindowOpenAndCallLocationAssign"),
       @"Failed to tap \"webScenarioWindowOpenAndCallLocationAssign\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Ensure that the resulting tab is updated as expected.
   const GURL targetURL =
@@ -177,7 +182,7 @@
   // Open a child tab.
   GREYAssert(TapWebViewElementWithId("webScenarioWindowOpenAndSetLocation"),
              @"Failed to tap \"webScenarioWindowOpenAndSetLocation\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Ensure that the resulting tab is updated as expected.
   const GURL targetURL =
@@ -192,7 +197,7 @@
 - (void)testWindowOpenWithBlankTarget {
   GREYAssert(TapWebViewElementWithId("webScenarioWindowOpenWithBlankTarget"),
              @"Failed to tap \"webScenarioWindowOpenWithBlankTarget\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests that opening a window with target=_blank which closes itself after 1
@@ -203,23 +208,23 @@
       performAction:web::WebViewTapElement(
                         GetCurrentWebState(),
                         [ElementSelector selectorWithElementID:ID])];
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   base::test::ios::SpinRunLoopWithMinDelay(base::TimeDelta::FromSecondsD(1));
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 // Tests a window.open used in a <button onClick> element.
 - (void)testWindowOpenWithButtonOnClick {
   GREYAssert(TapWebViewElementWithId("webScenarioWindowOpenWithButtonOnClick"),
              @"Failed to tap \"webScenarioWindowOpenWithButtonOnClick\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests a button that invokes window.open with an empty target parameter.
 - (void)testWindowOpenWithEmptyTarget {
   GREYAssert(TapWebViewElementWithId("webScenarioWindowOpenWithEmptyTarget"),
              @"Failed to tap \"webScenarioWindowOpenWithEmptyTarget\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests that the correct URL is displayed for a child window opened with the
@@ -230,7 +235,7 @@
                  "webScenarioLocationReplaceInWindowOpenWithEmptyTarget"),
              @"Failed to tap "
              @"\"webScenarioLocationReplaceInWindowOpenWithEmptyTarget\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
   // WebKit doesn't parse 'about:blank#hash' as about:blank with URL fragment.
   // Instead, it percent encodes '#hash' and considers 'blank%23hash' as the
   // resource identifier. Nevertheless, the '#' is significant in triggering the
@@ -245,14 +250,14 @@
   GREYAssert(
       TapWebViewElementWithId("webScenarioWindowOpenWithJavaScriptInHref"),
       @"Failed to tap \"webScenarioWindowOpenWithJavaScriptInHref\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests a window.open by running Meta-Refresh.
 - (void)testWindowOpenWithMetaRefresh {
   GREYAssert(TapWebViewElementWithId("webScenarioWindowOpenWithMetaRefresh"),
              @"Failed to tap \"webScenarioWindowOpenWithMetaRefresh\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 // Tests that a link with an onclick that opens a tab and calls preventDefault
@@ -262,7 +267,7 @@
   GREYAssert(
       TapWebViewElementWithId("webScenarioWindowOpenWithPreventDefaultLink"),
       @"Failed to tap \"webScenarioWindowOpenWithPreventDefaultLink\"");
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 
   // Ensure that the starting tab hasn't navigated.
   [ChromeEarlGrey closeCurrentTab];
@@ -275,7 +280,7 @@
 - (void)testCloseWindowNotOpenByDOM {
   GREYAssert(TapWebViewElementWithId("webScenarioWindowClose"),
              @"Failed to tap \"webScenarioWindowClose\"");
-  [ChromeEarlGrey waitForMainTabCount:1];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:1]);
 }
 
 // Tests that popup blocking works when a popup is injected into a window before
@@ -286,7 +291,7 @@
              @"Failed to tap \"webScenarioOpenWindowAndInjectPopup\"");
   [[EarlGrey selectElementWithMatcher:PopupBlocker()]
       assertWithMatcher:grey_notNil()];
-  [ChromeEarlGrey waitForMainTabCount:2];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey waitForMainTabCount:2]);
 }
 
 @end
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.h b/ios/chrome/test/earl_grey/chrome_earl_grey.h
index 954db9f0..855e629 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.h
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.h
@@ -9,6 +9,7 @@
 
 #include <string>
 
+#include "base/compiler_specific.h"
 #include "url/gurl.h"
 
 @class ElementSelector;
@@ -32,9 +33,8 @@
 @interface ChromeEarlGrey : NSObject
 
 #pragma mark - History Utilities
-
 // Clears browsing history.
-+ (void)clearBrowsingHistory;
++ (NSError*)clearBrowsingHistory WARN_UNUSED_RESULT;
 
 #pragma mark - Cookie Utilities
 
@@ -48,91 +48,98 @@
 // Loads |URL| in the current WebState with transition type
 // ui::PAGE_TRANSITION_TYPED, and waits for the loading to complete within a
 // timeout, or a GREYAssert is induced.
-+ (void)loadURL:(const GURL&)URL;
++ (NSError*)loadURL:(const GURL&)URL WARN_UNUSED_RESULT;
 
 // Reloads the page and waits for the loading to complete within a timeout, or a
 // GREYAssert is induced.
-+ (void)reload;
++ (NSError*)reload WARN_UNUSED_RESULT;
 
 // Navigates back to the previous page and waits for the loading to complete
 // within a timeout, or a GREYAssert is induced.
-+ (void)goBack;
++ (NSError*)goBack WARN_UNUSED_RESULT;
 
 // Navigates forward to the next page and waits for the loading to complete
 // within a timeout, or a GREYAssert is induced.
-+ (void)goForward;
++ (NSError*)goForward WARN_UNUSED_RESULT;
 
 // Opens a new tab and waits for the new tab animation to complete.
-+ (void)openNewTab;
++ (NSError*)openNewTab WARN_UNUSED_RESULT;
 
 // Opens a new incognito tab and waits for the new tab animation to complete.
-+ (void)openNewIncognitoTab;
++ (NSError*)openNewIncognitoTab WARN_UNUSED_RESULT;
 
 // Closes all tabs in the current mode (incognito or normal), and waits for the
-// UI to complete. If current mode is Incognito, mode will be switched to 
+// UI to complete. If current mode is Incognito, mode will be switched to
 // normal after closing all tabs.
 + (void)closeAllTabsInCurrentMode;
 
 // Closes all incognito tabs and waits for the UI to complete.
-+ (void)closeAllIncognitoTabs;
++ (NSError*)closeAllIncognitoTabs WARN_UNUSED_RESULT;
 
 // Closes the current tab and waits for the UI to complete.
 + (void)closeCurrentTab;
 
 // Waits for the page to finish loading within a timeout, or a GREYAssert is
 // induced.
-+ (void)waitForPageToFinishLoading;
++ (NSError*)waitForPageToFinishLoading WARN_UNUSED_RESULT;
 
 // Taps html element with |elementID| in the current web view.
-+ (void)tapWebViewElementWithID:(NSString*)elementID;
++ (NSError*)tapWebViewElementWithID:(NSString*)elementID WARN_UNUSED_RESULT;
 
 // Waits for a static html view containing |text|. If the condition is not met
 // within a timeout, a GREYAssert is induced.
-+ (void)waitForStaticHTMLViewContainingText:(NSString*)text;
++ (NSError*)waitForStaticHTMLViewContainingText:(NSString*)text
+    WARN_UNUSED_RESULT;
 
 // Waits for there to be no static html view, or a static html view that does
 // not contain |text|. If the condition is not met within a timeout, a
 // GREYAssert is induced.
-+ (void)waitForStaticHTMLViewNotContainingText:(NSString*)text;
++ (NSError*)waitForStaticHTMLViewNotContainingText:(NSString*)text
+    WARN_UNUSED_RESULT;
 
 // Waits for a Chrome error page. If it is not found within a timeout, a
 // GREYAssert is induced.
-+ (void)waitForErrorPage;
++ (NSError*)waitForErrorPage WARN_UNUSED_RESULT;
 
 // Waits for the current web view to contain |text|. If the condition is not met
 // within a timeout, a GREYAssert is induced.
-+ (void)waitForWebViewContainingText:(std::string)text;
++ (NSError*)waitForWebViewContainingText:(std::string)text WARN_UNUSED_RESULT;
 
 // Waits for the current web view to contain an element matching |selector|.
 // If the condition is not met within a timeout, a GREYAssert is induced.
-+ (void)waitForWebViewContainingElement:(ElementSelector*)selector;
++ (NSError*)waitForWebViewContainingElement:(ElementSelector*)selector
+    WARN_UNUSED_RESULT;
 
 // Waits for there to be no web view containing |text|. If the condition is not
 // met within a timeout, a GREYAssert is induced.
-+ (void)waitForWebViewNotContainingText:(std::string)text;
++ (NSError*)waitForWebViewNotContainingText:(std::string)text
+    WARN_UNUSED_RESULT;
 
 // Waits for there to be |count| number of non-incognito tabs. If the condition
 // is not met within a timeout, a GREYAssert is induced.
-+ (void)waitForMainTabCount:(NSUInteger)count;
++ (NSError*)waitForMainTabCount:(NSUInteger)count WARN_UNUSED_RESULT;
 
 // Waits for there to be |count| number of incognito tabs. If the condition is
 // not met within a timeout, a GREYAssert is induced.
-+ (void)waitForIncognitoTabCount:(NSUInteger)count;
++ (NSError*)waitForIncognitoTabCount:(NSUInteger)count WARN_UNUSED_RESULT;
 
 // Waits for there to be a web view containing a blocked |image_id|.  When
 // blocked, the image element will be smaller than the actual image size.
-+ (void)waitForWebViewContainingBlockedImageElementWithID:(std::string)imageID;
++ (NSError*)waitForWebViewContainingBlockedImageElementWithID:
+    (std::string)imageID WARN_UNUSED_RESULT;
 
 // Waits for there to be a web view containing loaded image with |image_id|.
 // When loaded, the image element will have the same size as actual image.
-+ (void)waitForWebViewContainingLoadedImageElementWithID:(std::string)imageID;
++ (NSError*)waitForWebViewContainingLoadedImageElementWithID:
+    (std::string)imageID WARN_UNUSED_RESULT;
 
 // Waits for the bookmark internal state to be done loading. If it does not
 // happen within a timeout, a GREYAssert is induced.
-+ (void)waitForBookmarksToFinishLoading;
++ (NSError*)waitForBookmarksToFinishLoading WARN_UNUSED_RESULT;
 
 // Waits for the matcher to return an element that is sufficiently visible.
-+ (void)waitForElementWithMatcherSufficientlyVisible:(id<GREYMatcher>)matcher;
++ (NSError*)waitForElementWithMatcherSufficientlyVisible:
+    (id<GREYMatcher>)matcher WARN_UNUSED_RESULT;
 
 @end
 
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey.mm b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
index 93e4111..19a2f46 100644
--- a/ios/chrome/test/earl_grey/chrome_earl_grey.mm
+++ b/ios/chrome/test/earl_grey/chrome_earl_grey.mm
@@ -20,6 +20,7 @@
 #include "ios/chrome/test/app/navigation_test_util.h"
 #import "ios/chrome/test/app/static_html_view_test_util.h"
 #import "ios/chrome/test/app/tab_test_util.h"
+#import "ios/testing/nserror_util.h"
 #import "ios/web/public/test/earl_grey/js_test_util.h"
 #include "ios/web/public/test/element_selector.h"
 #import "ios/web/public/test/web_view_content_test_util.h"
@@ -71,12 +72,15 @@
 
 #pragma mark - History Utilities
 
-+ (void)clearBrowsingHistory {
-  GREYAssertTrue(chrome_test_util::ClearBrowsingHistory(),
-                 @"Clearing Browsing History timed out");
++ (NSError*)clearBrowsingHistory {
+  if (!chrome_test_util::ClearBrowsingHistory()) {
+    return testing::NSErrorWithLocalizedDescription(
+        @"Clearing Browsing History timed out");
+  }
   // After clearing browsing history via code, wait for the UI to be done
   // with any updates. This includes icons from the new tab page being removed.
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  return nil;
 }
 
 #pragma mark - Cookie Utilities
@@ -106,44 +110,57 @@
 
 #pragma mark - Navigation Utilities
 
-+ (void)loadURL:(const GURL&)URL {
++ (NSError*)loadURL:(const GURL&)URL {
   chrome_test_util::LoadUrl(URL);
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  NSError* loadingError = [ChromeEarlGrey waitForPageToFinishLoading];
+  if (loadingError) {
+    return loadingError;
+  }
 
   web::WebState* webState = chrome_test_util::GetCurrentWebState();
   if (webState->ContentIsHTML()) {
-    GREYAssert(web::WaitUntilWindowIdInjected(webState),
-               @"WindowID failed to inject");
+    if (!web::WaitUntilWindowIdInjected(webState)) {
+      return testing::NSErrorWithLocalizedDescription(
+          @"WindowID failed to inject");
+    }
   }
+
+  return nil;
 }
 
-+ (void)reload {
++ (NSError*)reload {
   [chrome_test_util::BrowserCommandDispatcherForMainBVC() reload];
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  return [ChromeEarlGrey waitForPageToFinishLoading];
 }
 
-+ (void)goBack {
++ (NSError*)goBack {
   [chrome_test_util::BrowserCommandDispatcherForMainBVC() goBack];
 
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  return [ChromeEarlGrey waitForPageToFinishLoading];
 }
 
-+ (void)goForward {
++ (NSError*)goForward {
   [chrome_test_util::BrowserCommandDispatcherForMainBVC() goForward];
 
-  [ChromeEarlGrey waitForPageToFinishLoading];
+  return [ChromeEarlGrey waitForPageToFinishLoading];
 }
 
-+ (void)openNewTab {
++ (NSError*)openNewTab {
   chrome_test_util::OpenNewTab();
-  [ChromeEarlGrey waitForPageToFinishLoading];
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  NSError* error = [ChromeEarlGrey waitForPageToFinishLoading];
+  if (!error) {
+    [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  }
+  return error;
 }
 
-+ (void)openNewIncognitoTab {
++ (NSError*)openNewIncognitoTab {
   chrome_test_util::OpenNewIncognitoTab();
-  [ChromeEarlGrey waitForPageToFinishLoading];
-  [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  NSError* error = [ChromeEarlGrey waitForPageToFinishLoading];
+  if (!error) {
+    [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  }
+  return error;
 }
 
 + (void)closeAllTabsInCurrentMode {
@@ -151,9 +168,13 @@
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
 }
 
-+ (void)closeAllIncognitoTabs {
-  GREYAssert(chrome_test_util::CloseAllIncognitoTabs(), @"Tabs did not close");
++ (NSError*)closeAllIncognitoTabs {
+  if (!chrome_test_util::CloseAllIncognitoTabs()) {
+    return testing::NSErrorWithLocalizedDescription(@"Tabs did not close");
+  }
+
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
+  return nil;
 }
 
 + (void)closeCurrentTab {
@@ -161,114 +182,198 @@
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
 }
 
-+ (void)waitForPageToFinishLoading {
-  GREYAssert(chrome_test_util::WaitForPageToFinishLoading(),
-             @"Page did not complete loading.");
++ (NSError*)waitForPageToFinishLoading {
+  if (!chrome_test_util::WaitForPageToFinishLoading()) {
+    return testing::NSErrorWithLocalizedDescription(
+        @"Page did not complete loading.");
+  }
+
+  return nil;
 }
 
-+ (void)tapWebViewElementWithID:(NSString*)elementID {
++ (NSError*)tapWebViewElementWithID:(NSString*)elementID {
   BOOL success =
       web::test::TapWebViewElementWithId(chrome_test_util::GetCurrentWebState(),
                                          base::SysNSStringToUTF8(elementID));
-  GREYAssertTrue(success, @"Failed to tap web view element with ID: %@",
-                 elementID);
+
+  if (!success) {
+    NSString* errorDescription = [NSString
+        stringWithFormat:@"Failed to tap web view element with ID: %@",
+                         elementID];
+    return testing::NSErrorWithLocalizedDescription(errorDescription);
+  }
+  return nil;
 }
 
-+ (void)waitForErrorPage {
++ (NSError*)waitForErrorPage {
   NSString* const kErrorPageText =
       l10n_util::GetNSString(IDS_ERRORPAGES_HEADING_NOT_AVAILABLE);
-  [self waitForStaticHTMLViewContainingText:kErrorPageText];
+  return [self waitForStaticHTMLViewContainingText:kErrorPageText];
 }
 
-+ (void)waitForStaticHTMLViewContainingText:(NSString*)text {
++ (NSError*)waitForStaticHTMLViewContainingText:(NSString*)text {
   bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
     return chrome_test_util::StaticHtmlViewContainingText(
         chrome_test_util::GetCurrentWebState(), base::SysNSStringToUTF8(text));
   });
-  GREYAssert(success, @"Failed to find static html view containing %@", text);
+
+  if (!success) {
+    NSString* errorDescription = [NSString
+        stringWithFormat:@"Failed to find static html view containing %@",
+                         text];
+    return testing::NSErrorWithLocalizedDescription(errorDescription);
+  }
+
+  return nil;
 }
 
-+ (void)waitForStaticHTMLViewNotContainingText:(NSString*)text {
++ (NSError*)waitForStaticHTMLViewNotContainingText:(NSString*)text {
   bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
     return !chrome_test_util::StaticHtmlViewContainingText(
         chrome_test_util::GetCurrentWebState(), base::SysNSStringToUTF8(text));
   });
-  GREYAssert(success, @"Failed, there was a static html view containing %@",
-             text);
+
+  if (!success) {
+    NSString* errorDescription = [NSString
+        stringWithFormat:@"Failed, there was a static html view containing %@",
+                         text];
+    return testing::NSErrorWithLocalizedDescription(errorDescription);
+  }
+
+  return nil;
 }
 
-+ (void)waitForWebViewContainingText:(std::string)text {
++ (NSError*)waitForWebViewContainingText:(std::string)text {
   bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
     return web::test::IsWebViewContainingText(
         chrome_test_util::GetCurrentWebState(), text);
   });
-  GREYAssert(success, @"Failed waiting for web view containing %s",
-             text.c_str());
+
+  if (!success) {
+    NSString* errorDescription =
+        [NSString stringWithFormat:@"Failed waiting for web view containing %s",
+                                   text.c_str()];
+    return testing::NSErrorWithLocalizedDescription(errorDescription);
+  }
+
+  return nil;
 }
 
-+ (void)waitForWebViewContainingElement:(ElementSelector*)selector {
++ (NSError*)waitForWebViewContainingElement:(ElementSelector*)selector {
   bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
     return web::test::IsWebViewContainingElement(
         chrome_test_util::GetCurrentWebState(), selector);
   });
-  GREYAssert(success, @"Failed waiting for web view containing element %@",
-             selector.selectorDescription);
+
+  if (!success) {
+    NSString* errorDescription = [NSString
+        stringWithFormat:@"Failed waiting for web view containing element %@",
+                         selector.selectorDescription];
+    return testing::NSErrorWithLocalizedDescription(errorDescription);
+  }
+
+  return nil;
 }
 
-+ (void)waitForWebViewNotContainingText:(std::string)text {
++ (NSError*)waitForWebViewNotContainingText:(std::string)text {
   bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
     return !web::test::IsWebViewContainingText(
         chrome_test_util::GetCurrentWebState(), text);
   });
-  GREYAssert(success, @"Failed waiting for web view not containing %s",
-             text.c_str());
+
+  if (!success) {
+    NSString* errorDescription = [NSString
+        stringWithFormat:@"Failed waiting for web view not containing %s",
+                         text.c_str()];
+    return testing::NSErrorWithLocalizedDescription(errorDescription);
+  }
+
+  return nil;
 }
 
-+ (void)waitForMainTabCount:(NSUInteger)count {
++ (NSError*)waitForMainTabCount:(NSUInteger)count {
   // Allow the UI to become idle, in case any tabs are being opened or closed.
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
   bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
     return chrome_test_util::GetMainTabCount() == count;
   });
-  GREYAssert(success, @"Failed waiting for main tab count to become %" PRIuNS,
-             count);
+
+  if (!success) {
+    NSString* errorDescription =
+        [NSString stringWithFormat:@"Failed waiting for main tab "
+                                   @"count to become %" PRIuNS,
+                                   count];
+    return testing::NSErrorWithLocalizedDescription(errorDescription);
+  }
+
+  return nil;
 }
 
-+ (void)waitForIncognitoTabCount:(NSUInteger)count {
++ (NSError*)waitForIncognitoTabCount:(NSUInteger)count {
   // Allow the UI to become idle, in case any tabs are being opened or closed.
   [[GREYUIThreadExecutor sharedInstance] drainUntilIdle];
   bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
     return chrome_test_util::GetIncognitoTabCount() == count;
   });
-  GREYAssert(success,
-             @"Failed waiting for incognito tab count to become %" PRIuNS,
-             count);
+
+  if (!success) {
+    NSString* errorDescription =
+        [NSString stringWithFormat:@"Failed waiting for incognito tab "
+                                   @"count to become %" PRIuNS,
+                                   count];
+    return testing::NSErrorWithLocalizedDescription(errorDescription);
+  }
+
+  return nil;
 }
 
-+ (void)waitForWebViewContainingBlockedImageElementWithID:(std::string)imageID {
-  GREYAssert(web::test::WaitForWebViewContainingImage(
-                 imageID, chrome_test_util::GetCurrentWebState(),
-                 web::test::IMAGE_STATE_BLOCKED),
-             @"Failed waiting for web view blocked image %s", imageID.c_str());
++ (NSError*)waitForWebViewContainingBlockedImageElementWithID:
+    (std::string)imageID {
+  bool success = web::test::WaitForWebViewContainingImage(
+      imageID, chrome_test_util::GetCurrentWebState(),
+      web::test::IMAGE_STATE_BLOCKED);
+
+  if (!success) {
+    NSString* errorDescription = [NSString
+        stringWithFormat:@"Failed waiting for web view blocked image %s",
+                         imageID.c_str()];
+    return testing::NSErrorWithLocalizedDescription(errorDescription);
+  }
+
+  return nil;
 }
 
-+ (void)waitForWebViewContainingLoadedImageElementWithID:(std::string)imageID {
-  GREYAssert(web::test::WaitForWebViewContainingImage(
-                 imageID, chrome_test_util::GetCurrentWebState(),
-                 web::test::IMAGE_STATE_LOADED),
-             @"Failed waiting for web view loaded image %s", imageID.c_str());
++ (NSError*)waitForWebViewContainingLoadedImageElementWithID:
+    (std::string)imageID {
+  bool success = web::test::WaitForWebViewContainingImage(
+      imageID, chrome_test_util::GetCurrentWebState(),
+      web::test::IMAGE_STATE_LOADED);
+
+  if (!success) {
+    NSString* errorDescription = [NSString
+        stringWithFormat:@"Failed waiting for web view loaded image %s",
+                         imageID.c_str()];
+    return testing::NSErrorWithLocalizedDescription(errorDescription);
+  }
+
+  return nil;
 }
 
-+ (void)waitForBookmarksToFinishLoading {
-  GREYAssert(
-      WaitUntilConditionOrTimeout(kWaitForUIElementTimeout,
-                                  ^{
-                                    return chrome_test_util::BookmarksLoaded();
-                                  }),
-      @"Bookmark model did not load");
++ (NSError*)waitForBookmarksToFinishLoading {
+  bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^{
+    return chrome_test_util::BookmarksLoaded();
+  });
+
+  if (!success) {
+    return testing::NSErrorWithLocalizedDescription(
+        @"Bookmark model did not load");
+  }
+
+  return nil;
 }
 
-+ (void)waitForElementWithMatcherSufficientlyVisible:(id<GREYMatcher>)matcher {
++ (NSError*)waitForElementWithMatcherSufficientlyVisible:
+    (id<GREYMatcher>)matcher {
   bool success = WaitUntilConditionOrTimeout(kWaitForUIElementTimeout, ^bool {
     NSError* error = nil;
     [[EarlGrey selectElementWithMatcher:matcher]
@@ -276,9 +381,16 @@
                     error:&error];
     return error == nil;
   });
-  GREYAssert(success,
-             @"Failed waiting for element with matcher %@ to become visible",
-             matcher);
+
+  if (!success) {
+    NSString* errorDescription = [NSString
+        stringWithFormat:
+            @"Failed waiting for element with matcher %@ to become visible",
+            matcher];
+    return testing::NSErrorWithLocalizedDescription(errorDescription);
+  }
+
+  return nil;
 }
 
 @end
diff --git a/ios/chrome/test/earl_grey/chrome_test_case.mm b/ios/chrome/test/earl_grey/chrome_test_case.mm
index 6404f6f..e4e925f 100644
--- a/ios/chrome/test/earl_grey/chrome_test_case.mm
+++ b/ios/chrome/test/earl_grey/chrome_test_case.mm
@@ -3,6 +3,7 @@
 // found in the LICENSE file.
 
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 
 #import <objc/runtime.h>
 
@@ -199,7 +200,7 @@
 
   chrome_test_util::ResetSigninPromoPreferences();
   chrome_test_util::ResetMockAuthentication();
-  [ChromeEarlGrey openNewTab];
+  CHROME_EG_ASSERT_NO_ERROR([ChromeEarlGrey openNewTab]);
 }
 
 // Tear down called once per test, to close all tabs and menus, and clear the
diff --git a/ios/chrome/test/earl_grey/device_check_egtest.mm b/ios/chrome/test/earl_grey/device_check_egtest.mm
index 2b01a6a..be3c969 100644
--- a/ios/chrome/test/earl_grey/device_check_egtest.mm
+++ b/ios/chrome/test/earl_grey/device_check_egtest.mm
@@ -6,6 +6,7 @@
 #import <XCTest/XCTest.h>
 
 #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
+#import "ios/chrome/test/earl_grey/chrome_error_util.h"
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #include "url/gurl.h"
 
@@ -21,8 +22,10 @@
 
 // Verifies Internet connectivity by navigating to browsingtest.appspot.com.
 - (void)testNetworkConnection {
-  [ChromeEarlGrey loadURL:GURL("http://browsingtest.appspot.com")];
-  [ChromeEarlGrey waitForWebViewContainingText:"Window1"];
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey loadURL:GURL("http://browsingtest.appspot.com")]);
+  CHROME_EG_ASSERT_NO_ERROR(
+      [ChromeEarlGrey waitForWebViewContainingText:"Window1"]);
 }
 
 @end
diff --git a/media/audio/audio_output_unittest.cc b/media/audio/audio_output_unittest.cc
index 45f6215..fb65539 100644
--- a/media/audio/audio_output_unittest.cc
+++ b/media/audio/audio_output_unittest.cc
@@ -98,13 +98,7 @@
 }
 
 // This test produces actual audio for .25 seconds on the default device.
-#if defined(OS_FUCHSIA)
-// Disabled on Fuchsia to workaround https://crbug.com/956446 .
-#define MAYBE_Play200HzTone DISABLED_Play200HzTone
-#else
-#define MAYBE_Play200HzTone Play200HzTone
-#endif
-TEST_F(AudioOutputTest, MAYBE_Play200HzTone) {
+TEST_F(AudioOutputTest, Play200HzTone) {
   ABORT_AUDIO_TEST_IF_NOT(audio_manager_device_info_->HasAudioOutputDevices());
 
   stream_params_ =
diff --git a/media/base/audio_decoder.h b/media/base/audio_decoder.h
index e2d5926..5f9280d 100644
--- a/media/base/audio_decoder.h
+++ b/media/base/audio_decoder.h
@@ -30,7 +30,7 @@
 
   // Callback for AudioDecoder to return a decoded frame whenever it becomes
   // available. Only non-EOS frames should be returned via this callback.
-  using OutputCB = base::Callback<void(const scoped_refptr<AudioBuffer>&)>;
+  using OutputCB = base::RepeatingCallback<void(scoped_refptr<AudioBuffer>)>;
 
   // Callback for Decode(). Called after the decoder has accepted corresponding
   // DecoderBuffer, indicating that the pipeline can send next buffer to decode.
diff --git a/media/base/limits.h b/media/base/limits.h
index 2b3e811..72980b3 100644
--- a/media/base/limits.h
+++ b/media/base/limits.h
@@ -77,7 +77,10 @@
 
   // Bounds for the number of threads used for software video decoding.
   kMinVideoDecodeThreads = 2,
-  kMaxVideoDecodeThreads = 32,
+  kMaxVideoDecodeThreads =
+      16,  // Matches ffmpeg's MAX_AUTO_THREADS. Higher values can result in
+           // immediate out of memory errors for high resolution content. See
+           // https://crbug.com/893984
 };
 
 }  // namespace limits
diff --git a/media/base/vector_math.cc b/media/base/vector_math.cc
index bafb7f0..e6e2692 100644
--- a/media/base/vector_math.cc
+++ b/media/base/vector_math.cc
@@ -63,13 +63,6 @@
     dest[i] = src[i] * scale;
 }
 
-void Crossfade(const float src[], int len, float dest[]) {
-  float cf_ratio = 0;
-  const float cf_increment = 1.0f / len;
-  for (int i = 0; i < len; ++i, cf_ratio += cf_increment)
-    dest[i] = (1.0f - cf_ratio) * src[i] + cf_ratio * dest[i];
-}
-
 std::pair<float, float> EWMAAndMaxPower(
     float initial_value, const float src[], int len, float smoothing_factor) {
   // Ensure |src| is 16-byte aligned.
diff --git a/media/base/vector_math.h b/media/base/vector_math.h
index 302b85f..66ca849 100644
--- a/media/base/vector_math.h
+++ b/media/base/vector_math.h
@@ -42,8 +42,6 @@
     int len,
     float smoothing_factor);
 
-MEDIA_SHMEM_EXPORT void Crossfade(const float src[], int len, float dest[]);
-
 }  // namespace vector_math
 }  // namespace media
 
diff --git a/media/base/vector_math_unittest.cc b/media/base/vector_math_unittest.cc
index 6be3eeb..290a95c 100644
--- a/media/base/vector_math_unittest.cc
+++ b/media/base/vector_math_unittest.cc
@@ -135,16 +135,6 @@
 #endif
 }
 
-TEST_F(VectorMathTest, Crossfade) {
-  FillTestVectors(0, 1);
-  vector_math::Crossfade(
-      input_vector_.get(), kVectorSize, output_vector_.get());
-  for (int i = 0; i < kVectorSize; ++i) {
-    ASSERT_FLOAT_EQ(i / static_cast<float>(kVectorSize), output_vector_[i])
-        << "i=" << i;
-  }
-}
-
 class EWMATestScenario {
  public:
   EWMATestScenario(float initial_value, const float src[], int len,
diff --git a/media/base/video_decoder.h b/media/base/video_decoder.h
index 784bb73..cbc0ae8 100644
--- a/media/base/video_decoder.h
+++ b/media/base/video_decoder.h
@@ -30,7 +30,7 @@
 
   // Callback for VideoDecoder to return a decoded frame whenever it becomes
   // available. Only non-EOS frames should be returned via this callback.
-  using OutputCB = base::Callback<void(const scoped_refptr<VideoFrame>&)>;
+  using OutputCB = base::RepeatingCallback<void(scoped_refptr<VideoFrame>)>;
 
   // Callback type for Decode(). Called after the decoder has completed decoding
   // corresponding DecoderBuffer, indicating that it's ready to accept another
diff --git a/media/base/video_thumbnail_decoder.cc b/media/base/video_thumbnail_decoder.cc
index 1c18ac2..db709b2 100644
--- a/media/base/video_thumbnail_decoder.cc
+++ b/media/base/video_thumbnail_decoder.cc
@@ -70,7 +70,7 @@
 }
 
 void VideoThumbnailDecoder::OnVideoFrameDecoded(
-    const scoped_refptr<VideoFrame>& frame) {
+    scoped_refptr<VideoFrame> frame) {
   NotifyComplete(std::move(frame));
 }
 
diff --git a/media/base/video_thumbnail_decoder.h b/media/base/video_thumbnail_decoder.h
index 8f9518f..f455375 100644
--- a/media/base/video_thumbnail_decoder.h
+++ b/media/base/video_thumbnail_decoder.h
@@ -43,7 +43,7 @@
   void OnEosBufferDecoded(DecodeStatus status);
 
   // Called when the output frame is generated.
-  void OnVideoFrameDecoded(const scoped_refptr<VideoFrame>& frame);
+  void OnVideoFrameDecoded(scoped_refptr<VideoFrame> frame);
 
   void NotifyComplete(scoped_refptr<VideoFrame> frame);
 
diff --git a/media/cast/sender/h264_vt_encoder_unittest.cc b/media/cast/sender/h264_vt_encoder_unittest.cc
index df56d9c..6441d90 100644
--- a/media/cast/sender/h264_vt_encoder_unittest.cc
+++ b/media/cast/sender/h264_vt_encoder_unittest.cc
@@ -149,7 +149,7 @@
                                        base::Unretained(this)));
   }
 
-  void CompareFrameWithExpected(const scoped_refptr<VideoFrame>& frame) {
+  void CompareFrameWithExpected(scoped_refptr<VideoFrame> frame) {
     ASSERT_LT(0u, expectations_.size());
     auto& e = expectations_.front();
     expectations_.pop();
diff --git a/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc b/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc
index fc984ef..fcc8375 100644
--- a/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc
+++ b/media/cdm/library_cdm/clear_key_cdm/cdm_video_decoder.cc
@@ -252,12 +252,12 @@
     std::move(quit_closure).Run();
   }
 
-  void OnVideoFrameReady(const scoped_refptr<VideoFrame>& video_frame) {
+  void OnVideoFrameReady(scoped_refptr<VideoFrame> video_frame) {
     // Do not queue EOS frames, which is not needed.
     if (video_frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM))
       return;
 
-    decoded_video_frames_.push(video_frame);
+    decoded_video_frames_.push(std::move(video_frame));
   }
 
   void OnReset(base::OnceClosure quit_closure) {
diff --git a/media/filters/audio_decoder_stream_unittest.cc b/media/filters/audio_decoder_stream_unittest.cc
index f71d5832..146b7faf 100644
--- a/media/filters/audio_decoder_stream_unittest.cc
+++ b/media/filters/audio_decoder_stream_unittest.cc
@@ -106,7 +106,7 @@
 
   void OnAudioBufferReadDone(base::OnceClosure closure,
                              AudioDecoderStream::Status status,
-                             const scoped_refptr<AudioBuffer>& audio_buffer) {
+                             scoped_refptr<AudioBuffer> audio_buffer) {
     std::move(closure).Run();
   }
 
diff --git a/media/filters/audio_decoder_unittest.cc b/media/filters/audio_decoder_unittest.cc
index daaca23..5e4d7c5 100644
--- a/media/filters/audio_decoder_unittest.cc
+++ b/media/filters/audio_decoder_unittest.cc
@@ -289,9 +289,9 @@
     ASSERT_TRUE(reader_->SeekForTesting(seek_time));
   }
 
-  void OnDecoderOutput(const scoped_refptr<AudioBuffer>& buffer) {
+  void OnDecoderOutput(scoped_refptr<AudioBuffer> buffer) {
     EXPECT_FALSE(buffer->end_of_stream());
-    decoded_audio_.push_back(buffer);
+    decoded_audio_.push_back(std::move(buffer));
   }
 
   void DecodeFinished(const base::Closure& quit_closure, DecodeStatus status) {
diff --git a/media/filters/dav1d_video_decoder_unittest.cc b/media/filters/dav1d_video_decoder_unittest.cc
index 5b2d434..21f1e91 100644
--- a/media/filters/dav1d_video_decoder_unittest.cc
+++ b/media/filters/dav1d_video_decoder_unittest.cc
@@ -163,9 +163,9 @@
     return status;
   }
 
-  void FrameReady(const scoped_refptr<VideoFrame>& frame) {
+  void FrameReady(scoped_refptr<VideoFrame> frame) {
     DCHECK(!frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
-    output_frames_.push_back(frame);
+    output_frames_.push_back(std::move(frame));
   }
 
   MOCK_METHOD1(DecodeDone, void(DecodeStatus));
diff --git a/media/filters/decoder_selector_unittest.cc b/media/filters/decoder_selector_unittest.cc
index e10585da..e24a0d22 100644
--- a/media/filters/decoder_selector_unittest.cc
+++ b/media/filters/decoder_selector_unittest.cc
@@ -162,7 +162,7 @@
         demuxer_stream_(TypeParam::kStreamType) {}
 
   void OnWaiting(WaitingReason reason) { NOTREACHED(); }
-  void OnOutput(const scoped_refptr<Output>& output) { NOTREACHED(); }
+  void OnOutput(scoped_refptr<Output> output) { NOTREACHED(); }
 
   MOCK_METHOD2_T(OnDecoderSelected,
                  void(std::string, std::unique_ptr<DecryptingDemuxerStream>));
diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc
index 325a8b6..d18f70b 100644
--- a/media/filters/decoder_stream.cc
+++ b/media/filters/decoder_stream.cc
@@ -421,13 +421,12 @@
 }
 
 template <DemuxerStream::Type StreamType>
-void DecoderStream<StreamType>::SatisfyRead(
-    Status status,
-    const scoped_refptr<Output>& output) {
+void DecoderStream<StreamType>::SatisfyRead(Status status,
+                                            scoped_refptr<Output> output) {
   DCHECK(read_cb_);
   TRACE_EVENT_ASYNC_END1("media", GetReadTraceString<StreamType>(), this,
                          "status", GetStatusString<StreamType>(status));
-  std::move(read_cb_).Run(status, output);
+  std::move(read_cb_).Run(status, std::move(output));
 }
 
 template <DemuxerStream::Type StreamType>
@@ -590,7 +589,7 @@
 
 template <DemuxerStream::Type StreamType>
 void DecoderStream<StreamType>::OnDecodeOutputReady(
-    const scoped_refptr<Output>& output) {
+    scoped_refptr<Output> output) {
   FUNCTION_DVLOG(3) << ": " << output->timestamp().InMilliseconds() << " ms";
   DCHECK(output);
   DCHECK(state_ == STATE_NORMAL || state_ == STATE_FLUSHING_DECODER ||
@@ -623,7 +622,7 @@
 
   if (prepare_cb_ && output->timestamp() + AverageDuration() >=
                          skip_prepare_until_timestamp_) {
-    unprepared_outputs_.push_back(output);
+    unprepared_outputs_.push_back(std::move(output));
     MaybePrepareAnotherOutput();
     return;
   }
@@ -632,12 +631,12 @@
     // If |ready_outputs_| was non-empty, the read would have already been
     // satisifed by Read().
     DCHECK(ready_outputs_.empty());
-    SatisfyRead(OK, output);
+    SatisfyRead(OK, std::move(output));
     return;
   }
 
   // Store decoded output.
-  ready_outputs_.push_back(output);
+  ready_outputs_.push_back(std::move(output));
 }
 
 template <DemuxerStream::Type StreamType>
@@ -971,7 +970,7 @@
 
 template <DemuxerStream::Type StreamType>
 void DecoderStream<StreamType>::OnPreparedOutputReady(
-    const scoped_refptr<Output>& output) {
+    scoped_refptr<Output> output) {
   FUNCTION_DVLOG(2);
   DCHECK(task_runner_->BelongsToCurrentThread());
 
@@ -988,9 +987,9 @@
   CompletePrepare(output.get());
   unprepared_outputs_.pop_front();
   if (!read_cb_)
-    ready_outputs_.emplace_back(output);
+    ready_outputs_.emplace_back(std::move(output));
   else
-    SatisfyRead(OK, output);
+    SatisfyRead(OK, std::move(output));
 
   MaybePrepareAnotherOutput();
 
diff --git a/media/filters/decoder_stream.h b/media/filters/decoder_stream.h
index f2f128b9..7f224532 100644
--- a/media/filters/decoder_stream.h
+++ b/media/filters/decoder_stream.h
@@ -60,7 +60,7 @@
   using InitCB = base::OnceCallback<void(bool success)>;
 
   // Indicates completion of a DecoderStream read.
-  using ReadCB = base::OnceCallback<void(Status, const scoped_refptr<Output>&)>;
+  using ReadCB = base::OnceCallback<void(Status, scoped_refptr<Output>)>;
 
   DecoderStream(std::unique_ptr<DecoderStreamTraits<StreamType>> traits,
                 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
@@ -120,9 +120,9 @@
   // prepared at any one time; this alleviates resource usage issues incurred by
   // the preparation process when a decoder has a burst of outputs after on
   // Decode(). For more context on why, see https://crbug.com/820167.
-  using OutputReadyCB = base::OnceCallback<void(const scoped_refptr<Output>&)>;
-  using PrepareCB = base::RepeatingCallback<void(const scoped_refptr<Output>&,
-                                                 OutputReadyCB)>;
+  using OutputReadyCB = base::OnceCallback<void(scoped_refptr<Output>)>;
+  using PrepareCB =
+      base::RepeatingCallback<void(scoped_refptr<Output>, OutputReadyCB)>;
   void SetPrepareCB(PrepareCB prepare_cb);
 
   // Indicates that we won't need to prepare outputs before |start_timestamp|,
@@ -175,7 +175,7 @@
       std::unique_ptr<DecryptingDemuxerStream> decrypting_demuxer_stream);
 
   // Satisfy pending |read_cb_| with |status| and |output|.
-  void SatisfyRead(Status status, const scoped_refptr<Output>& output);
+  void SatisfyRead(Status status, scoped_refptr<Output> output);
 
   // Decodes |buffer| and returns the result via OnDecodeOutputReady().
   // Saves |buffer| into |pending_buffers_| if appropriate.
@@ -195,7 +195,7 @@
                     DecodeStatus status);
 
   // Output callback passed to Decoder::Initialize().
-  void OnDecodeOutputReady(const scoped_refptr<Output>& output);
+  void OnDecodeOutputReady(scoped_refptr<Output> output);
 
   // Reads a buffer from |stream_| and returns the result via OnBufferReady().
   void ReadFromDemuxerStream();
@@ -216,7 +216,7 @@
 
   void ClearOutputs();
   void MaybePrepareAnotherOutput();
-  void OnPreparedOutputReady(const scoped_refptr<Output>& frame);
+  void OnPreparedOutputReady(scoped_refptr<Output> frame);
   void CompletePrepare(const Output* output);
 
   std::unique_ptr<DecoderStreamTraits<StreamType>> traits_;
diff --git a/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc
index 069f110c..3364873d 100644
--- a/media/filters/decrypting_audio_decoder_unittest.cc
+++ b/media/filters/decrypting_audio_decoder_unittest.cc
@@ -237,7 +237,7 @@
     base::RunLoop().RunUntilIdle();
   }
 
-  MOCK_METHOD1(FrameReady, void(const scoped_refptr<AudioBuffer>&));
+  MOCK_METHOD1(FrameReady, void(scoped_refptr<AudioBuffer>));
   MOCK_METHOD1(DecodeDone, void(DecodeStatus));
 
   MOCK_METHOD1(OnWaiting, void(WaitingReason));
diff --git a/media/filters/decrypting_video_decoder_unittest.cc b/media/filters/decrypting_video_decoder_unittest.cc
index 4515c82d..700c56e 100644
--- a/media/filters/decrypting_video_decoder_unittest.cc
+++ b/media/filters/decrypting_video_decoder_unittest.cc
@@ -214,7 +214,7 @@
     base::RunLoop().RunUntilIdle();
   }
 
-  MOCK_METHOD1(FrameReady, void(const scoped_refptr<VideoFrame>&));
+  MOCK_METHOD1(FrameReady, void(scoped_refptr<VideoFrame>));
   MOCK_METHOD1(DecodeDone, void(DecodeStatus));
 
   MOCK_METHOD1(OnWaiting, void(WaitingReason));
diff --git a/media/filters/fake_video_decoder_unittest.cc b/media/filters/fake_video_decoder_unittest.cc
index 17a8194..5718ace 100644
--- a/media/filters/fake_video_decoder_unittest.cc
+++ b/media/filters/fake_video_decoder_unittest.cc
@@ -81,9 +81,9 @@
     last_decode_status_ = status;
   }
 
-  void FrameReady(const scoped_refptr<VideoFrame>& frame) {
+  void FrameReady(scoped_refptr<VideoFrame> frame) {
     DCHECK(!frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
-    last_decoded_frame_ = frame;
+    last_decoded_frame_ = std::move(frame);
     num_decoded_frames_++;
   }
 
diff --git a/media/filters/ffmpeg_video_decoder_unittest.cc b/media/filters/ffmpeg_video_decoder_unittest.cc
index a918841..dcc31bf 100644
--- a/media/filters/ffmpeg_video_decoder_unittest.cc
+++ b/media/filters/ffmpeg_video_decoder_unittest.cc
@@ -194,9 +194,9 @@
     return status;
   }
 
-  void FrameReady(const scoped_refptr<VideoFrame>& frame) {
+  void FrameReady(scoped_refptr<VideoFrame> frame) {
     DCHECK(!frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
-    output_frames_.push_back(frame);
+    output_frames_.push_back(std::move(frame));
   }
 
   MOCK_METHOD1(DecodeDone, void(DecodeStatus));
diff --git a/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc b/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc
index 829ff2ed..14568a66 100644
--- a/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc
+++ b/media/filters/fuchsia/fuchsia_video_decoder_unittest.cc
@@ -41,9 +41,9 @@
     return init_cb_result;
   }
 
-  void OnVideoFrame(const scoped_refptr<VideoFrame>& frame) {
+  void OnVideoFrame(scoped_refptr<VideoFrame> frame) {
     num_output_frames_++;
-    output_frames_.push_back(frame);
+    output_frames_.push_back(std::move(frame));
     while (output_frames_.size() > frames_to_keep_) {
       output_frames_.pop_front();
     }
@@ -101,8 +101,7 @@
   EXPECT_EQ(num_output_frames_, 1);
 }
 
-// Disabled to workaround https://crbug.com/956446
-TEST_F(FuchsiaVideoDecoderTest, DISABLED_H264) {
+TEST_F(FuchsiaVideoDecoderTest, H264) {
   ASSERT_TRUE(Initialize(TestVideoConfig::NormalH264()));
 
   ASSERT_TRUE(ReadAndDecodeFrame("h264-320x180-frame-0") == DecodeStatus::OK);
diff --git a/media/filters/offloading_video_decoder_unittest.cc b/media/filters/offloading_video_decoder_unittest.cc
index 66c3408..81705f6a 100644
--- a/media/filters/offloading_video_decoder_unittest.cc
+++ b/media/filters/offloading_video_decoder_unittest.cc
@@ -169,7 +169,7 @@
   }
 
   MOCK_METHOD1(InitDone, void(bool));
-  MOCK_METHOD1(OutputDone, void(const scoped_refptr<VideoFrame>&));
+  MOCK_METHOD1(OutputDone, void(scoped_refptr<VideoFrame>));
   MOCK_METHOD1(DecodeDone, void(DecodeStatus));
   MOCK_METHOD0(ResetDone, void(void));
 
diff --git a/media/filters/video_decoder_stream_unittest.cc b/media/filters/video_decoder_stream_unittest.cc
index a66b499..d68466e 100644
--- a/media/filters/video_decoder_stream_unittest.cc
+++ b/media/filters/video_decoder_stream_unittest.cc
@@ -135,11 +135,12 @@
     DCHECK(!pending_stop_);
   }
 
-  void PrepareFrame(const scoped_refptr<VideoFrame>& frame,
+  void PrepareFrame(scoped_refptr<VideoFrame> frame,
                     VideoDecoderStream::OutputReadyCB output_ready_cb) {
     // Simulate some delay in return of the output.
     message_loop_.task_runner()->PostTask(
-        FROM_HERE, base::BindOnce(std::move(output_ready_cb), frame));
+        FROM_HERE,
+        base::BindOnce(std::move(output_ready_cb), std::move(frame)));
   }
 
   void OnBytesDecoded(int count) { num_decoded_bytes_unreported_ += count; }
@@ -303,7 +304,7 @@
 
   // Callback for VideoDecoderStream::Read().
   void FrameReady(VideoDecoderStream::Status status,
-                  const scoped_refptr<VideoFrame>& frame) {
+                  scoped_refptr<VideoFrame> frame) {
     DCHECK(pending_read_);
     frame_read_ = frame;
     last_read_status_ = status;
diff --git a/media/filters/vpx_video_decoder.cc b/media/filters/vpx_video_decoder.cc
index e6490b25..a851960d 100644
--- a/media/filters/vpx_video_decoder.cc
+++ b/media/filters/vpx_video_decoder.cc
@@ -42,9 +42,7 @@
   // maximum number of tiles possible for higher resolution streams.
   if (config.codec() == kCodecVP9) {
     const int width = config.coded_size().width();
-    if (width >= 8192)
-      desired_threads = 32;
-    else if (width >= 4096)
+    if (width >= 4096)
       desired_threads = 16;
     else if (width >= 2048)
       desired_threads = 8;
diff --git a/media/filters/vpx_video_decoder_fuzzertest.cc b/media/filters/vpx_video_decoder_fuzzertest.cc
index b4279e5..abe5145 100644
--- a/media/filters/vpx_video_decoder_fuzzertest.cc
+++ b/media/filters/vpx_video_decoder_fuzzertest.cc
@@ -43,7 +43,7 @@
   quit_closure.Run();
 }
 
-void OnOutputComplete(const scoped_refptr<VideoFrame>& frame) {}
+void OnOutputComplete(scoped_refptr<VideoFrame> frame) {}
 
 // Entry point for LibFuzzer.
 extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
diff --git a/media/filters/vpx_video_decoder_unittest.cc b/media/filters/vpx_video_decoder_unittest.cc
index 1ab0b1a7..befb24e 100644
--- a/media/filters/vpx_video_decoder_unittest.cc
+++ b/media/filters/vpx_video_decoder_unittest.cc
@@ -155,9 +155,9 @@
     return status;
   }
 
-  void FrameReady(const scoped_refptr<VideoFrame>& frame) {
+  void FrameReady(scoped_refptr<VideoFrame> frame) {
     DCHECK(!frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
-    output_frames_.push_back(frame);
+    output_frames_.push_back(std::move(frame));
   }
 
   MOCK_METHOD1(DecodeDone, void(DecodeStatus));
diff --git a/media/gpu/android/media_codec_video_decoder_unittest.cc b/media/gpu/android/media_codec_video_decoder_unittest.cc
index c89270a..d6e3a32 100644
--- a/media/gpu/android/media_codec_video_decoder_unittest.cc
+++ b/media/gpu/android/media_codec_video_decoder_unittest.cc
@@ -38,8 +38,8 @@
 namespace {
 
 void OutputCb(scoped_refptr<VideoFrame>* output,
-              const scoped_refptr<VideoFrame>& frame) {
-  *output = frame;
+              scoped_refptr<VideoFrame> frame) {
+  *output = std::move(frame);
 }
 
 std::unique_ptr<AndroidOverlay> CreateAndroidOverlayCb(
diff --git a/media/gpu/test/video_player/video_decoder_client.cc b/media/gpu/test/video_player/video_decoder_client.cc
index 2be4ca0..bb58de63 100644
--- a/media/gpu/test/video_player/video_decoder_client.cc
+++ b/media/gpu/test/video_player/video_decoder_client.cc
@@ -303,8 +303,7 @@
       base::BindOnce(&VideoDecoderClient::DecodeNextFragmentTask, weak_this_));
 }
 
-void VideoDecoderClient::FrameReadyTask(
-    const scoped_refptr<VideoFrame>& video_frame) {
+void VideoDecoderClient::FrameReadyTask(scoped_refptr<VideoFrame> video_frame) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_client_sequence_checker_);
 
   // When using allocate mode the frame will be reused after this function, so
diff --git a/media/gpu/test/video_player/video_decoder_client.h b/media/gpu/test/video_player/video_decoder_client.h
index 30bac98..8790d14c 100644
--- a/media/gpu/test/video_player/video_decoder_client.h
+++ b/media/gpu/test/video_player/video_decoder_client.h
@@ -137,7 +137,7 @@
   // Called by the decoder when a fragment has been decoded.
   void DecodeDoneTask(media::DecodeStatus status);
   // Called by the decoder when a video frame is ready.
-  void FrameReadyTask(const scoped_refptr<VideoFrame>& video_frame);
+  void FrameReadyTask(scoped_refptr<VideoFrame> video_frame);
   // Called by the decoder when flushing has completed.
   void FlushDoneTask(media::DecodeStatus status);
   // Called by the decoder when resetting has completed.
diff --git a/media/gpu/video_encode_accelerator_unittest.cc b/media/gpu/video_encode_accelerator_unittest.cc
index 72984ea..221b179e 100644
--- a/media/gpu/video_encode_accelerator_unittest.cc
+++ b/media/gpu/video_encode_accelerator_unittest.cc
@@ -939,7 +939,7 @@
   void InitializeCB(bool success);
   void DecodeDone(DecodeStatus status);
   void FlushDone(DecodeStatus status);
-  void VerifyOutputFrame(const scoped_refptr<VideoFrame>& output_frame);
+  void VerifyOutputFrame(scoped_refptr<VideoFrame> output_frame);
   void Decode();
   void WriteFrameStats();
 
@@ -1285,7 +1285,7 @@
 }
 
 void VideoFrameQualityValidator::VerifyOutputFrame(
-    const scoped_refptr<VideoFrame>& output_frame) {
+    scoped_refptr<VideoFrame> output_frame) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
   scoped_refptr<VideoFrame> original_frame = original_frames_.front();
diff --git a/media/mojo/clients/mojo_audio_decoder_unittest.cc b/media/mojo/clients/mojo_audio_decoder_unittest.cc
index 00f2fe3..f9c34e5 100644
--- a/media/mojo/clients/mojo_audio_decoder_unittest.cc
+++ b/media/mojo/clients/mojo_audio_decoder_unittest.cc
@@ -78,7 +78,7 @@
 
   // Completion callbacks.
   MOCK_METHOD1(OnInitialized, void(bool));
-  MOCK_METHOD1(OnOutput, void(const scoped_refptr<AudioBuffer>&));
+  MOCK_METHOD1(OnOutput, void(scoped_refptr<AudioBuffer>));
   MOCK_METHOD1(OnWaiting, void(WaitingReason));
   MOCK_METHOD1(OnDecoded, void(DecodeStatus));
   MOCK_METHOD0(OnReset, void());
diff --git a/media/mojo/clients/mojo_renderer.cc b/media/mojo/clients/mojo_renderer.cc
index 34312db0..be6d826 100644
--- a/media/mojo/clients/mojo_renderer.cc
+++ b/media/mojo/clients/mojo_renderer.cc
@@ -265,11 +265,6 @@
   client_->OnVideoNaturalSizeChange(size);
 }
 
-void MojoRenderer::OnRemotePlayStateChange(media::MediaStatus::State state) {
-  DVLOG(2) << __func__ << ": state [" << static_cast<int>(state) << "]";
-  client_->OnRemotePlayStateChange(state);
-}
-
 void MojoRenderer::OnVideoOpacityChange(bool opaque) {
   DVLOG(2) << __func__ << ": " << opaque;
   DCHECK(task_runner_->BelongsToCurrentThread());
diff --git a/media/mojo/clients/mojo_renderer.h b/media/mojo/clients/mojo_renderer.h
index 149bddc7..bfe05b4 100644
--- a/media/mojo/clients/mojo_renderer.h
+++ b/media/mojo/clients/mojo_renderer.h
@@ -76,7 +76,6 @@
   void OnVideoOpacityChange(bool opaque) override;
   void OnWaiting(WaitingReason reason) override;
   void OnStatisticsUpdate(const PipelineStatistics& stats) override;
-  void OnRemotePlayStateChange(media::MediaStatus::State state) override;
 
   // Binds |remote_renderer_| to the mojo message pipe. Can be called multiple
   // times. If an error occurs during connection, OnConnectionError will be
diff --git a/media/mojo/clients/mojo_renderer_factory.cc b/media/mojo/clients/mojo_renderer_factory.cc
index 1947ec5..f0e95159bf 100644
--- a/media/mojo/clients/mojo_renderer_factory.cc
+++ b/media/mojo/clients/mojo_renderer_factory.cc
@@ -49,11 +49,14 @@
 #if defined(OS_ANDROID)
 std::unique_ptr<MojoRenderer> MojoRendererFactory::CreateFlingingRenderer(
     const std::string& presentation_id,
+    mojom::FlingingRendererClientExtensionPtr client_extension_ptr,
     const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
     VideoRendererSink* video_renderer_sink) {
   DCHECK(interface_factory_);
   mojom::RendererPtr renderer_ptr;
+
   interface_factory_->CreateFlingingRenderer(presentation_id,
+                                             std::move(client_extension_ptr),
                                              mojo::MakeRequest(&renderer_ptr));
 
   return std::make_unique<MojoRenderer>(
diff --git a/media/mojo/clients/mojo_renderer_factory.h b/media/mojo/clients/mojo_renderer_factory.h
index 16fdf0f0..f4f0855 100644
--- a/media/mojo/clients/mojo_renderer_factory.h
+++ b/media/mojo/clients/mojo_renderer_factory.h
@@ -50,6 +50,7 @@
 #if defined(OS_ANDROID)
   std::unique_ptr<MojoRenderer> CreateFlingingRenderer(
       const std::string& presentation_id,
+      mojom::FlingingRendererClientExtensionPtr client_extenion_ptr,
       const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
       VideoRendererSink* video_renderer_sink);
 
diff --git a/media/mojo/interfaces/interface_factory.mojom b/media/mojo/interfaces/interface_factory.mojom
index abd68a1..38b42f10 100644
--- a/media/mojo/interfaces/interface_factory.mojom
+++ b/media/mojo/interfaces/interface_factory.mojom
@@ -51,7 +51,9 @@
   // Creates a FlingingRenderer (FlingingRendererFactory).
   // The |presentation_id| is used to find an already set-up RemotePlayback
   // session (see blink::RemotePlayback).
-  CreateFlingingRenderer(string presentation_id, Renderer& renderer);
+  CreateFlingingRenderer(string presentation_id,
+                         FlingingRendererClientExtension client_extension,
+                         Renderer& renderer);
 
   // Creates a CDM based on the |key_system| provided. A |key_system| is a
   // generic term for a decryption mechanism and/or content protection provider.
diff --git a/media/mojo/interfaces/renderer.mojom b/media/mojo/interfaces/renderer.mojom
index 15e26bd..ccb0c51 100644
--- a/media/mojo/interfaces/renderer.mojom
+++ b/media/mojo/interfaces/renderer.mojom
@@ -81,10 +81,4 @@
   // Called when the remote renderering service is waiting for |reason|,
   // e.g. waiting for decryption key.
   OnWaiting(WaitingReason reason);
-
-  // Executed whenever a renderer receives notification of a status change that
-  // was not originated by its owner.
-  // Only used with the FlingingRenderer (when external devices play/pause the
-  // video playing remotely).
-  OnRemotePlayStateChange(MediaStatusState state);
 };
diff --git a/media/mojo/interfaces/renderer_extensions.mojom b/media/mojo/interfaces/renderer_extensions.mojom
index c4b857f..595f0b1 100644
--- a/media/mojo/interfaces/renderer_extensions.mojom
+++ b/media/mojo/interfaces/renderer_extensions.mojom
@@ -4,13 +4,17 @@
 
 module media.mojom;
 
+import "media/mojo/interfaces/media_types.mojom";
 import "mojo/public/mojom/base/time.mojom";
 import "mojo/public/mojom/base/unguessable_token.mojom";
 import "ui/gfx/geometry/mojo/geometry.mojom";
 
-// Extension of the mojo::RendererClient communication layer, exposing
-// renderer-side events handlers to the Browser process.
-// Backed by MediaPlayerRendererClient, called by MediaPlayerRenderer.
+// Extension of the mojo::RendererClient communication layer for HLS and Android
+// software rendering fallback paths.
+// This allows the Browser side to call
+// back into the Renderer side. Concretely, the MediaPlayerRenderer uses these
+// methods to propagate events it raises to the MediaPlayerRendererClient, which
+// lives in the Renderer process.
 interface MediaPlayerRendererClientExtension {
   // Called when the first time the metadata is updated, and whenever the
   // metadata changes.
@@ -18,9 +22,11 @@
   OnDurationChange(mojo_base.mojom.TimeDelta duration);
 };
 
-// Extension of the mojo::Renderer communication layer, exposing browser-side
-// methods to the Renderer process.
-// Backed by MediaPlayerRenderer, called by MediaPlayerRendererClient.
+// Extension of the mojo::RendererClient communication layer for HLS and Android
+// software rendering fallback paths.
+// This allows the Renderer side to call into the Browser side.
+// Concretely, the MediaPlayerRendererClient uses these methods to send commands
+// to MediaPlayerRenderer, which lives in the Browser process.
 interface MediaPlayerRendererExtension {
   // Registers a new request in the ScopedSurfaceRequestManager, and returns
   // its token.
@@ -29,3 +35,15 @@
   InitiateScopedSurfaceRequest()
       => (mojo_base.mojom.UnguessableToken request_token);
 };
+
+// Extension of the mojo::RendererClient communication layer for media flinging,
+// a.k.a RemotePlayback, when playing media on a remote Cast device.
+// This allows the Browser side to call back into the Renderer side.
+// Concretely, the FlingingRenderer uses these methods to propagate events it
+// raises to the FlingingRendererClient, which lives in the Renderer process.
+interface FlingingRendererClientExtension {
+  // Called when the play state of a casted device goes out of sync with WMPI's
+  // play state (e.g. when another phone play/pauses a cast device on the same
+  // network).
+  OnRemotePlayStateChange(MediaStatusState state);
+};
diff --git a/media/mojo/services/interface_factory_impl.cc b/media/mojo/services/interface_factory_impl.cc
index 0003191..77a4840 100644
--- a/media/mojo/services/interface_factory_impl.cc
+++ b/media/mojo/services/interface_factory_impl.cc
@@ -170,6 +170,7 @@
 
 void InterfaceFactoryImpl::CreateFlingingRenderer(
     const std::string& audio_device_id,
+    mojom::FlingingRendererClientExtensionPtr client_extension,
     mojo::InterfaceRequest<mojom::Renderer> request) {
   NOTREACHED();
 }
diff --git a/media/mojo/services/interface_factory_impl.h b/media/mojo/services/interface_factory_impl.h
index 77f7e78..bffc86c 100644
--- a/media/mojo/services/interface_factory_impl.h
+++ b/media/mojo/services/interface_factory_impl.h
@@ -53,8 +53,10 @@
       mojom::RendererRequest request,
       mojom::MediaPlayerRendererExtensionRequest renderer_extension_request)
       final;
-  void CreateFlingingRenderer(const std::string& presentation_id,
-                              mojom::RendererRequest request) final;
+  void CreateFlingingRenderer(
+      const std::string& presentation_id,
+      mojom::FlingingRendererClientExtensionPtr client_extension,
+      mojom::RendererRequest request) final;
 #endif  // defined(OS_ANDROID)
   void CreateCdm(const std::string& key_system,
                  mojom::ContentDecryptionModuleRequest request) final;
diff --git a/media/mojo/services/mojo_audio_decoder_service.cc b/media/mojo/services/mojo_audio_decoder_service.cc
index eba8b65..55046a9 100644
--- a/media/mojo/services/mojo_audio_decoder_service.cc
+++ b/media/mojo/services/mojo_audio_decoder_service.cc
@@ -133,11 +133,11 @@
 }
 
 void MojoAudioDecoderService::OnAudioBufferReady(
-    const scoped_refptr<AudioBuffer>& audio_buffer) {
+    scoped_refptr<AudioBuffer> audio_buffer) {
   DVLOG(1) << __func__;
 
   // TODO(timav): Use DataPipe.
-  client_->OnBufferDecoded(mojom::AudioBuffer::From(audio_buffer));
+  client_->OnBufferDecoded(mojom::AudioBuffer::From(std::move(audio_buffer)));
 }
 
 void MojoAudioDecoderService::OnWaiting(WaitingReason reason) {
diff --git a/media/mojo/services/mojo_audio_decoder_service.h b/media/mojo/services/mojo_audio_decoder_service.h
index 2cb52f4..ff7e430 100644
--- a/media/mojo/services/mojo_audio_decoder_service.h
+++ b/media/mojo/services/mojo_audio_decoder_service.h
@@ -57,7 +57,7 @@
   void OnResetDone(ResetCallback callback);
 
   // Called by |decoder_| for each decoded buffer.
-  void OnAudioBufferReady(const scoped_refptr<AudioBuffer>& audio_buffer);
+  void OnAudioBufferReady(scoped_refptr<AudioBuffer> audio_buffer);
 
   // Called by |decoder_| when it's waiting because of |reason|, e.g. waiting
   // for decryption key.
diff --git a/media/mojo/services/mojo_renderer_service.cc b/media/mojo/services/mojo_renderer_service.cc
index 7fe6e962..c781657c 100644
--- a/media/mojo/services/mojo_renderer_service.cc
+++ b/media/mojo/services/mojo_renderer_service.cc
@@ -189,7 +189,7 @@
 }
 
 void MojoRendererService::OnRemotePlayStateChange(MediaStatus::State state) {
-  client_->OnRemotePlayStateChange(state);
+  // TODO(https://crbug.com/956677, tguilbert): Remove this function.
 }
 
 void MojoRendererService::OnVideoOpacityChange(bool opaque) {
diff --git a/media/mojo/services/mojo_video_decoder_service.cc b/media/mojo/services/mojo_video_decoder_service.cc
index b35480a..3b0e0ed 100644
--- a/media/mojo/services/mojo_video_decoder_service.cc
+++ b/media/mojo/services/mojo_video_decoder_service.cc
@@ -313,8 +313,7 @@
   std::move(reset_cb_).Run();
 }
 
-void MojoVideoDecoderService::OnDecoderOutput(
-    const scoped_refptr<VideoFrame>& frame) {
+void MojoVideoDecoderService::OnDecoderOutput(scoped_refptr<VideoFrame> frame) {
   DVLOG(3) << __func__;
   DCHECK(client_);
   DCHECK(decoder_);
@@ -336,7 +335,8 @@
     release_token = releaser->RegisterVideoFrame(frame);
   }
 
-  client_->OnVideoFrameDecoded(frame, decoder_->CanReadWithoutStalling(),
+  client_->OnVideoFrameDecoded(std::move(frame),
+                               decoder_->CanReadWithoutStalling(),
                                std::move(release_token));
 }
 
diff --git a/media/mojo/services/mojo_video_decoder_service.h b/media/mojo/services/mojo_video_decoder_service.h
index 39c2440..d509efee 100644
--- a/media/mojo/services/mojo_video_decoder_service.h
+++ b/media/mojo/services/mojo_video_decoder_service.h
@@ -75,7 +75,7 @@
   void OnReaderFlushed();
 
   void OnDecoderReset();
-  void OnDecoderOutput(const scoped_refptr<VideoFrame>& frame);
+  void OnDecoderOutput(scoped_refptr<VideoFrame> frame);
 
   void OnDecoderWaiting(WaitingReason reason);
 
diff --git a/media/renderers/audio_renderer_impl.cc b/media/renderers/audio_renderer_impl.cc
index 167f9181..e344a51 100644
--- a/media/renderers/audio_renderer_impl.cc
+++ b/media/renderers/audio_renderer_impl.cc
@@ -693,9 +693,8 @@
   play_delay_cb_for_testing_ = std::move(cb);
 }
 
-void AudioRendererImpl::DecodedAudioReady(
-    AudioDecoderStream::Status status,
-    const scoped_refptr<AudioBuffer>& buffer) {
+void AudioRendererImpl::DecodedAudioReady(AudioDecoderStream::Status status,
+                                          scoped_refptr<AudioBuffer> buffer) {
   DVLOG(2) << __func__ << "(" << status << ")";
   DCHECK(task_runner_->BelongsToCurrentThread());
 
@@ -717,7 +716,7 @@
   }
 
   DCHECK_EQ(status, AudioDecoderStream::OK);
-  DCHECK(buffer.get());
+  DCHECK(buffer);
 
   if (state_ == kFlushing) {
     ChangeState_Locked(kFlushed);
@@ -756,7 +755,7 @@
     }
 
     DCHECK(buffer_converter_);
-    buffer_converter_->AddInput(buffer);
+    buffer_converter_->AddInput(std::move(buffer));
 
     while (buffer_converter_->HasNextBuffer()) {
       need_another_buffer =
@@ -783,7 +782,7 @@
       return;
     }
 
-    need_another_buffer = HandleDecodedBuffer_Locked(buffer);
+    need_another_buffer = HandleDecodedBuffer_Locked(std::move(buffer));
   }
 
   if (!need_another_buffer && !CanRead_Locked())
@@ -793,13 +792,13 @@
 }
 
 bool AudioRendererImpl::HandleDecodedBuffer_Locked(
-    const scoped_refptr<AudioBuffer>& buffer) {
+    scoped_refptr<AudioBuffer> buffer) {
   lock_.AssertAcquired();
   if (buffer->end_of_stream()) {
     received_end_of_stream_ = true;
   } else {
     if (buffer->IsBitstreamFormat() && state_ == kPlaying) {
-      if (IsBeforeStartTime(buffer))
+      if (IsBeforeStartTime(*buffer))
         return true;
 
       // Adjust the start time since we are unable to trim a compressed audio
@@ -811,7 +810,7 @@
                                           audio_parameters_.sample_rate()));
       }
     } else if (state_ == kPlaying) {
-      if (IsBeforeStartTime(buffer))
+      if (IsBeforeStartTime(*buffer))
         return true;
 
       // Trim off any additional time before the start timestamp.
@@ -831,14 +830,14 @@
         return true;
     }
 
-    if (state_ != kUninitialized)
-      algorithm_->EnqueueBuffer(buffer);
-  }
+    // Store the timestamp of the first packet so we know when to start actual
+    // audio playback.
+    if (first_packet_timestamp_ == kNoTimestamp)
+      first_packet_timestamp_ = buffer->timestamp();
 
-  // Store the timestamp of the first packet so we know when to start actual
-  // audio playback.
-  if (first_packet_timestamp_ == kNoTimestamp)
-    first_packet_timestamp_ = buffer->timestamp();
+    if (state_ != kUninitialized)
+      algorithm_->EnqueueBuffer(std::move(buffer));
+  }
 
   const size_t memory_usage = algorithm_->GetMemoryUsage();
   PipelineStatistics stats;
@@ -860,7 +859,7 @@
       return false;
 
     case kPlaying:
-      if (buffer->end_of_stream() || algorithm_->IsQueueFull()) {
+      if (received_end_of_stream_ || algorithm_->IsQueueFull()) {
         if (buffering_state_ == BUFFERING_HAVE_NOTHING)
           SetBufferingState_Locked(BUFFERING_HAVE_ENOUGH);
         return false;
@@ -945,11 +944,10 @@
   }
 }
 
-bool AudioRendererImpl::IsBeforeStartTime(
-    const scoped_refptr<AudioBuffer>& buffer) {
+bool AudioRendererImpl::IsBeforeStartTime(const AudioBuffer& buffer) {
   DCHECK_EQ(state_, kPlaying);
-  return buffer.get() && !buffer->end_of_stream() &&
-         (buffer->timestamp() + buffer->duration()) < start_timestamp_;
+  return !buffer.end_of_stream() &&
+         (buffer.timestamp() + buffer.duration()) < start_timestamp_;
 }
 
 int AudioRendererImpl::Render(base::TimeDelta delay,
diff --git a/media/renderers/audio_renderer_impl.h b/media/renderers/audio_renderer_impl.h
index 8a522bb..65538e98 100644
--- a/media/renderers/audio_renderer_impl.h
+++ b/media/renderers/audio_renderer_impl.h
@@ -132,12 +132,12 @@
 
   // Callback from the audio decoder delivering decoded audio samples.
   void DecodedAudioReady(AudioDecoderStream::Status status,
-                         const scoped_refptr<AudioBuffer>& buffer);
+                         scoped_refptr<AudioBuffer> buffer);
 
   // Handles buffers that come out of decoder (MSE: after passing through
   // |buffer_converter_|).
   // Returns true if more buffers are needed.
-  bool HandleDecodedBuffer_Locked(const scoped_refptr<AudioBuffer>& buffer);
+  bool HandleDecodedBuffer_Locked(scoped_refptr<AudioBuffer> buffer);
 
   // Helper functions for DecodeStatus values passed to
   // DecodedAudioReady().
@@ -182,7 +182,7 @@
 
   // Returns true if the data in the buffer is all before |start_timestamp_|.
   // This can only return true while in the kPlaying state.
-  bool IsBeforeStartTime(const scoped_refptr<AudioBuffer>& buffer);
+  bool IsBeforeStartTime(const AudioBuffer& buffer);
 
   // Called upon AudioDecoderStream initialization, or failure thereof
   // (indicated by the value of |success|).
diff --git a/media/renderers/video_renderer_impl.cc b/media/renderers/video_renderer_impl.cc
index 6092a04..c4c79da 100644
--- a/media/renderers/video_renderer_impl.cc
+++ b/media/renderers/video_renderer_impl.cc
@@ -477,7 +477,7 @@
 }
 
 void VideoRendererImpl::FrameReady(VideoDecoderStream::Status status,
-                                   const scoped_refptr<VideoFrame>& frame) {
+                                   scoped_refptr<VideoFrame> frame) {
   DCHECK(task_runner_->BelongsToCurrentThread());
   base::AutoLock auto_lock(lock_);
   DCHECK_EQ(state_, kPlaying);
@@ -535,7 +535,7 @@
                                       video_decoder_stream_->AverageDuration());
     }
 
-    AddReadyFrame_Locked(frame);
+    AddReadyFrame_Locked(std::move(frame));
   }
 
   // Attempt to purge bad frames in case of underflow or backgrounding.
@@ -632,8 +632,7 @@
                                 weak_factory_.GetWeakPtr(), buffering_state_));
 }
 
-void VideoRendererImpl::AddReadyFrame_Locked(
-    const scoped_refptr<VideoFrame>& frame) {
+void VideoRendererImpl::AddReadyFrame_Locked(scoped_refptr<VideoFrame> frame) {
   DCHECK(task_runner_->BelongsToCurrentThread());
   lock_.AssertAcquired();
   DCHECK(!frame->metadata()->IsTrue(VideoFrameMetadata::END_OF_STREAM));
@@ -647,7 +646,7 @@
     ++stats_.video_frames_decoded_power_efficient;
   }
 
-  algorithm_->EnqueueFrame(frame);
+  algorithm_->EnqueueFrame(std::move(frame));
 }
 
 void VideoRendererImpl::AttemptRead_Locked() {
diff --git a/media/renderers/video_renderer_impl.h b/media/renderers/video_renderer_impl.h
index 366c92e0..27a85cd 100644
--- a/media/renderers/video_renderer_impl.h
+++ b/media/renderers/video_renderer_impl.h
@@ -107,10 +107,10 @@
   // Callback for |video_decoder_stream_| to deliver decoded video frames and
   // report video decoding status.
   void FrameReady(VideoDecoderStream::Status status,
-                  const scoped_refptr<VideoFrame>& frame);
+                  scoped_refptr<VideoFrame> frame);
 
   // Helper method for enqueueing a frame to |alogorithm_|.
-  void AddReadyFrame_Locked(const scoped_refptr<VideoFrame>& frame);
+  void AddReadyFrame_Locked(scoped_refptr<VideoFrame> frame);
 
   // Helper method that schedules an asynchronous read from the
   // |video_decoder_stream_| as long as there isn't a pending read and we have
diff --git a/media/video/gpu_memory_buffer_video_frame_pool.cc b/media/video/gpu_memory_buffer_video_frame_pool.cc
index 78d1d086..ddfad0b 100644
--- a/media/video/gpu_memory_buffer_video_frame_pool.cc
+++ b/media/video/gpu_memory_buffer_video_frame_pool.cc
@@ -1182,10 +1182,11 @@
 }
 
 void GpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame(
-    const scoped_refptr<VideoFrame>& video_frame,
+    scoped_refptr<VideoFrame> video_frame,
     FrameReadyCB frame_ready_cb) {
   DCHECK(video_frame);
-  pool_impl_->CreateHardwareFrame(video_frame, std::move(frame_ready_cb));
+  pool_impl_->CreateHardwareFrame(std::move(video_frame),
+                                  std::move(frame_ready_cb));
 }
 
 void GpuMemoryBufferVideoFramePool::Abort() {
diff --git a/media/video/gpu_memory_buffer_video_frame_pool.h b/media/video/gpu_memory_buffer_video_frame_pool.h
index 7b86ced..1f0e178 100644
--- a/media/video/gpu_memory_buffer_video_frame_pool.h
+++ b/media/video/gpu_memory_buffer_video_frame_pool.h
@@ -42,8 +42,7 @@
 
   // Callback used by MaybeCreateHardwareFrame to deliver a new VideoFrame
   // after it has been copied to GpuMemoryBuffers.
-  using FrameReadyCB =
-      base::OnceCallback<void(const scoped_refptr<VideoFrame>&)>;
+  using FrameReadyCB = base::OnceCallback<void(scoped_refptr<VideoFrame>)>;
 
   // Calls |cb| on |media_worker_pool| with a new VideoFrame containing only
   // mailboxes to native resources. |cb| will be destroyed on
@@ -52,9 +51,8 @@
   // |video_frame|.
   // If it's not possible to create a new hardware VideoFrame, |video_frame|
   // itself will passed to |cb|.
-  virtual void MaybeCreateHardwareFrame(
-      const scoped_refptr<VideoFrame>& video_frame,
-      FrameReadyCB frame_ready_cb);
+  virtual void MaybeCreateHardwareFrame(scoped_refptr<VideoFrame> video_frame,
+                                        FrameReadyCB frame_ready_cb);
 
   // Aborts any pending copies. Previously provided |frame_ready_cb| callbacks
   // may still be called if the copy has already started.
diff --git a/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
index 589c643e..7ab1e93 100644
--- a/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
+++ b/media/video/gpu_memory_buffer_video_frame_pool_unittest.cc
@@ -140,15 +140,15 @@
 
 void MaybeCreateHardwareFrameCallback(
     scoped_refptr<VideoFrame>* video_frame_output,
-    const scoped_refptr<VideoFrame>& video_frame) {
-  *video_frame_output = video_frame;
+    scoped_refptr<VideoFrame> video_frame) {
+  *video_frame_output = std::move(video_frame);
 }
 
 void MaybeCreateHardwareFrameCallbackAndTrackTime(
     scoped_refptr<VideoFrame>* video_frame_output,
     base::TimeTicks* output_time,
-    const scoped_refptr<VideoFrame>& video_frame) {
-  *video_frame_output = video_frame;
+    scoped_refptr<VideoFrame> video_frame) {
+  *video_frame_output = std::move(video_frame);
   *output_time = base::TimeTicks::Now();
 }
 
diff --git a/media/video/mock_gpu_memory_buffer_video_frame_pool.cc b/media/video/mock_gpu_memory_buffer_video_frame_pool.cc
index 5534ea5e..80af4a0 100644
--- a/media/video/mock_gpu_memory_buffer_video_frame_pool.cc
+++ b/media/video/mock_gpu_memory_buffer_video_frame_pool.cc
@@ -15,10 +15,10 @@
 MockGpuMemoryBufferVideoFramePool::~MockGpuMemoryBufferVideoFramePool() {}
 
 void MockGpuMemoryBufferVideoFramePool::MaybeCreateHardwareFrame(
-    const scoped_refptr<VideoFrame>& video_frame,
+    scoped_refptr<VideoFrame> video_frame,
     FrameReadyCB frame_ready_cb) {
   frame_ready_cbs_->push_back(
-      base::BindOnce(std::move(frame_ready_cb), video_frame));
+      base::BindOnce(std::move(frame_ready_cb), std::move(video_frame)));
 }
 
 }  // namespace media
diff --git a/media/video/mock_gpu_memory_buffer_video_frame_pool.h b/media/video/mock_gpu_memory_buffer_video_frame_pool.h
index c16f89b..2509460b 100644
--- a/media/video/mock_gpu_memory_buffer_video_frame_pool.h
+++ b/media/video/mock_gpu_memory_buffer_video_frame_pool.h
@@ -17,7 +17,7 @@
       std::vector<base::OnceClosure>* frame_ready_cbs);
   ~MockGpuMemoryBufferVideoFramePool() override;
 
-  void MaybeCreateHardwareFrame(const scoped_refptr<VideoFrame>& video_frame,
+  void MaybeCreateHardwareFrame(scoped_refptr<VideoFrame> video_frame,
                                 FrameReadyCB frame_ready_cb) override;
   MOCK_METHOD0(Abort, void());
 
diff --git a/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc b/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc
index a9fe780c..54634d0 100644
--- a/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc
+++ b/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.cc
@@ -18,6 +18,7 @@
 #include "base/sequenced_task_runner.h"
 #include "base/thread_annotations.h"
 #include "net/extras/sqlite/sqlite_persistent_store_backend_base.h"
+#include "net/reporting/reporting_client.h"
 #include "sql/database.h"
 #include "sql/meta_table.h"
 #include "sql/statement.h"
@@ -27,7 +28,8 @@
 namespace net {
 
 namespace {
-// Version 1: Adds a table for NEL policies.
+// Version 1: Adds tables for NEL policies, Reporting endpoints, and Reporting
+//            endpoint groups.
 
 const int kCurrentVersionNumber = 1;
 const int kCompatibleVersionNumber = 1;
@@ -55,6 +57,17 @@
       const NetworkErrorLoggingService::NELPolicy& policy);
   void DeleteNELPolicy(const NetworkErrorLoggingService::NELPolicy& policy);
 
+  void LoadReportingClients(ReportingClientsLoadedCallback loaded_callback);
+  void AddReportingEndpoint(const ReportingClient& endpoint);
+  void AddReportingEndpointGroup(const CachedReportingEndpointGroup& group);
+  void UpdateReportingEndpointGroupAccessTime(
+      const CachedReportingEndpointGroup& group);
+  void UpdateReportingEndpointDetails(const ReportingClient& endpoint);
+  void UpdateReportingEndpointGroupDetails(
+      const CachedReportingEndpointGroup& group);
+  void DeleteReportingEndpoint(const ReportingClient& endpoint);
+  void DeleteReportingEndpointGroup(const CachedReportingEndpointGroup& group);
+
   // Gets the number of queued operations.
   size_t GetQueueLengthForTesting() const;
 
@@ -65,8 +78,8 @@
   }
 
   // Represents a mutating operation to the database, specified by a type (add,
-  // update access time, or delete) and data representing the entry in the
-  // database to be added/updated/deleted.
+  // update access time, update data, or delete) and data representing the entry
+  // in the database to be added/updated/deleted.
   template <typename DataType>
   class PendingOperation;
 
@@ -77,12 +90,22 @@
 
   // A copy of the information relevant to a NEL policy.
   struct NELPolicyInfo;
-  // Map of pending operations pertaining to NEL policies, keyed on origin of
-  // the policy.
-  using NELPolicyPendingOperationsMap =
-      std::map<url::Origin, PendingOperationsVector<NELPolicyInfo>>;
+  // A copy of the information relevant to a Reporting endpoint.
+  struct ReportingEndpointInfo;
+  // A copy of the information relevant to a Reporting endpoint group.
+  struct ReportingEndpointGroupInfo;
+  // TODO(chlily): add ReportingReportInfo.
 
-  // TODO(chlily): add types for Reporting data.
+  // Uniquely identifies an endpoint in the store.
+  using ReportingEndpointKey = std::pair<ReportingEndpointGroupKey, GURL>;
+
+  // Map of pending operations for each entry in the database.
+  // Key types are: - url::Origin for NEL policies,
+  //                - ReportingEndpointKey for Reporting endpoints,
+  //                - ReportingEndpointGroupKey for Reporting endpoint groups
+  //                  (defined in //net/reporting/reporting_client.h).
+  template <typename KeyType, typename DataType>
+  using QueueType = std::map<KeyType, PendingOperationsVector<DataType>>;
 
   // SQLitePersistentStoreBackendBase implementation
   bool CreateDatabaseSchema() override;
@@ -91,11 +114,18 @@
 
   // Commit a pending operation pertaining to a NEL policy.
   void CommitNELPolicyOperation(PendingOperation<NELPolicyInfo>* op);
+  // Commit a pending operation pertaining to a Reporting endpoint.
+  void CommitReportingEndpointOperation(
+      PendingOperation<ReportingEndpointInfo>* op);
+  // Commit a pending operation pertaining to a Reporting endpoint group.
+  void CommitReportingEndpointGroupOperation(
+      PendingOperation<ReportingEndpointGroupInfo>* op);
 
-  // Add a pending NEL Policy operation to the queue.
-  void BatchNELPolicyOperation(
-      const url::Origin& origin,
-      std::unique_ptr<PendingOperation<NELPolicyInfo>> po);
+  // Add a pending operation to the appropriate queue.
+  template <typename KeyType, typename DataType>
+  void BatchOperation(KeyType key,
+                      std::unique_ptr<PendingOperation<DataType>> po,
+                      QueueType<KeyType, DataType>* queue);
 
   // If there are existing pending operations for a given key, potentially
   // remove some of the existing operations before adding |new_op|.
@@ -103,7 +133,8 @@
   // operations are made irrelevant and can be deleted. If |new_op| is an
   // update-access-time, and the last operation in |ops_for_key| is also an
   // update-access-time, then it can be discarded because |new_op| is about to
-  // overwrite the access time with a new value anyway.
+  // overwrite the access time with a new value anyway. Similarly for
+  // update-details.
   template <typename DataType>
   void MaybeCoalesceOperations(PendingOperationsVector<DataType>* ops_for_key,
                                PendingOperation<DataType>* new_op)
@@ -129,15 +160,38 @@
       std::vector<NetworkErrorLoggingService::NELPolicy> loaded_policies,
       bool load_success);
 
+  // Loads Reporting endpoints and endpoint groups into two vectors in the
+  // background, then posts a task to the client task runner to call
+  // |loaded_callback| with the loaded endpoints and endpoint groups.
+  void LoadReportingClientsAndNotifyInBackground(
+      ReportingClientsLoadedCallback loaded_callback);
+
+  // Calls |loaded_callback| with the loaded endpoints and endpoint groups
+  // (which may be empty if loading was unsuccessful). If loading was
+  // successful, also report metrics.
+  void CompleteLoadReportingClientsAndNotifyInForeground(
+      ReportingClientsLoadedCallback loaded_callback,
+      std::vector<ReportingClient> loaded_endpoints,
+      std::vector<CachedReportingEndpointGroup> loaded_endpoint_groups,
+      bool load_success);
+
   // Total number of pending operations (may not match the sum of the number of
   // elements in the pending operations queues, due to operation coalescing).
   size_t num_pending_ GUARDED_BY(lock_);
 
   // Queue of pending operations pertaining to NEL policies, keyed on origin.
-  NELPolicyPendingOperationsMap nel_policy_pending_ops_ GUARDED_BY(lock_);
+  QueueType<url::Origin, NELPolicyInfo> nel_policy_pending_ops_
+      GUARDED_BY(lock_);
+  // Queue of pending operations pertaining to Reporting endpoints, keyed on
+  // origin, group name, and url.
+  QueueType<ReportingEndpointKey, ReportingEndpointInfo>
+      reporting_endpoint_pending_ops_ GUARDED_BY(lock_);
+  // Queue of pending operations pertaining to Reporting endpoint groups, keyed
+  // on origin and group name.
+  QueueType<ReportingEndpointGroupKey, ReportingEndpointGroupInfo>
+      reporting_endpoint_group_pending_ops_ GUARDED_BY(lock_);
 
-  // TODO(chlily): a separate map to hold pending operations for each type of
-  // Reporting data.
+  // TODO(chlily): add reporting_report_pending_ops_ for Reporting reports.
 
   // Protects |num_pending_|, and all the pending operations queues.
   mutable base::Lock lock_;
@@ -169,12 +223,50 @@
   return db->Execute(stmt.c_str());
 }
 
+bool CreateV1ReportingEndpointsSchema(sql::Database* db) {
+  DCHECK(!db->DoesTableExist("reporting_endpoints"));
+
+  std::string stmt =
+      "CREATE TABLE reporting_endpoints ("
+      "  origin_scheme TEXT NOT NULL,"
+      "  origin_host TEXT NOT NULL,"
+      "  origin_port INTEGER NOT NULL,"
+      "  group_name TEXT NOT NULL,"
+      "  url TEXT NOT NULL,"
+      "  priority INTEGER NOT NULL,"
+      "  weight INTEGER NOT NULL,"
+      // Each (origin, group, url) tuple specifies at most one endpoint.
+      "  UNIQUE (origin_scheme, origin_host, origin_port, group_name, url)"
+      ")";
+
+  return db->Execute(stmt.c_str());
+}
+
+bool CreateV1ReportingEndpointGroupsSchema(sql::Database* db) {
+  DCHECK(!db->DoesTableExist("reporting_endpoint_groups"));
+
+  std::string stmt =
+      "CREATE TABLE reporting_endpoint_groups ("
+      "  origin_scheme TEXT NOT NULL,"
+      "  origin_host TEXT NOT NULL,"
+      "  origin_port INTEGER NOT NULL,"
+      "  group_name TEXT NOT NULL,"
+      "  is_include_subdomains INTEGER NOT NULL,"
+      "  expires_us_since_epoch INTEGER NOT NULL,"
+      "  last_access_us_since_epoch INTEGER NOT NULL,"
+      // Each (origin, group) tuple specifies at most one endpoint group.
+      "  UNIQUE (origin_scheme, origin_host, origin_port, group_name)"
+      ")";
+
+  return db->Execute(stmt.c_str());
+}
+
 }  // namespace
 
 template <typename DataType>
 class SQLitePersistentReportingAndNELStore::Backend::PendingOperation {
  public:
-  enum class Type { ADD, UPDATE_ACCESS_TIME, DELETE };
+  enum class Type { ADD, UPDATE_ACCESS_TIME, UPDATE_DETAILS, DELETE };
 
   PendingOperation(Type type, DataType data)
       : type_(type), data_(std::move(data)) {}
@@ -216,7 +308,7 @@
   int64_t expires_us_since_epoch = 0;
   // Sampling fractions.
   double success_fraction = 0.0;
-  double failure_fraction = 0.0;
+  double failure_fraction = 1.0;
   // Whether the policy applies to subdomains of the origin.
   bool is_include_subdomains = false;
   // Last time the policy was updated or used, in microseconds since the
@@ -224,6 +316,61 @@
   int64_t last_access_us_since_epoch = 0;
 };
 
+// Makes a copy of the relevant information about a ReportingClient, stored in a
+// form suitable for adding to the database.
+struct SQLitePersistentReportingAndNELStore::Backend::ReportingEndpointInfo {
+  ReportingEndpointInfo(const ReportingClient& endpoint)
+      : origin_scheme(endpoint.group_key.origin.scheme()),
+        origin_host(endpoint.group_key.origin.host()),
+        origin_port(endpoint.group_key.origin.port()),
+        group_name(endpoint.group_key.group_name),
+        url(endpoint.info.url.spec()),
+        priority(endpoint.info.priority),
+        weight(endpoint.info.weight) {}
+
+  // Origin the endpoint was received from.
+  std::string origin_scheme;
+  std::string origin_host;
+  int origin_port = 0;
+  // Name of the group the endpoint belongs to.
+  std::string group_name;
+  // URL of the endpoint.
+  std::string url;
+  // Priority of the endpoint.
+  int priority = ReportingClient::EndpointInfo::kDefaultPriority;
+  // Weight of the endpoint.
+  int weight = ReportingClient::EndpointInfo::kDefaultWeight;
+};
+
+struct SQLitePersistentReportingAndNELStore::Backend::
+    ReportingEndpointGroupInfo {
+  ReportingEndpointGroupInfo(const CachedReportingEndpointGroup& group)
+      : origin_scheme(group.group_key.origin.scheme()),
+        origin_host(group.group_key.origin.host()),
+        origin_port(group.group_key.origin.port()),
+        group_name(group.group_key.group_name),
+        is_include_subdomains(group.include_subdomains ==
+                              OriginSubdomains::INCLUDE),
+        expires_us_since_epoch(
+            group.expires.ToDeltaSinceWindowsEpoch().InMicroseconds()),
+        last_access_us_since_epoch(
+            group.last_used.ToDeltaSinceWindowsEpoch().InMicroseconds()) {}
+
+  // Origin the endpoint group was received from.
+  std::string origin_scheme;
+  std::string origin_host;
+  int origin_port = 0;
+  // Name of the group.
+  std::string group_name;
+  // Whether the group applies to subdomains of the origin.
+  bool is_include_subdomains = false;
+  // When the group expires, in microseconds since the Windows epoch.
+  int64_t expires_us_since_epoch = 0;
+  // Last time the group was updated or used, in microseconds since the Windows
+  // epoch.
+  int64_t last_access_us_since_epoch = 0;
+};
+
 void SQLitePersistentReportingAndNELStore::Backend::LoadNELPolicies(
     NELPoliciesLoadedCallback loaded_callback) {
   PostBackgroundTask(
@@ -235,7 +382,7 @@
     const NetworkErrorLoggingService::NELPolicy& policy) {
   auto po = std::make_unique<PendingOperation<NELPolicyInfo>>(
       PendingOperation<NELPolicyInfo>::Type::ADD, NELPolicyInfo(policy));
-  BatchNELPolicyOperation(policy.origin, std::move(po));
+  BatchOperation(policy.origin, std::move(po), &nel_policy_pending_ops_);
 }
 
 void SQLitePersistentReportingAndNELStore::Backend::UpdateNELPolicyAccessTime(
@@ -243,14 +390,93 @@
   auto po = std::make_unique<PendingOperation<NELPolicyInfo>>(
       PendingOperation<NELPolicyInfo>::Type::UPDATE_ACCESS_TIME,
       NELPolicyInfo(policy));
-  BatchNELPolicyOperation(policy.origin, std::move(po));
+  BatchOperation(policy.origin, std::move(po), &nel_policy_pending_ops_);
 }
 
 void SQLitePersistentReportingAndNELStore::Backend::DeleteNELPolicy(
     const NetworkErrorLoggingService::NELPolicy& policy) {
   auto po = std::make_unique<PendingOperation<NELPolicyInfo>>(
       PendingOperation<NELPolicyInfo>::Type::DELETE, NELPolicyInfo(policy));
-  BatchNELPolicyOperation(policy.origin, std::move(po));
+  BatchOperation(policy.origin, std::move(po), &nel_policy_pending_ops_);
+}
+
+void SQLitePersistentReportingAndNELStore::Backend::LoadReportingClients(
+    ReportingClientsLoadedCallback loaded_callback) {
+  PostBackgroundTask(
+      FROM_HERE,
+      base::BindOnce(&Backend::LoadReportingClientsAndNotifyInBackground, this,
+                     std::move(loaded_callback)));
+}
+
+void SQLitePersistentReportingAndNELStore::Backend::AddReportingEndpoint(
+    const ReportingClient& endpoint) {
+  auto po = std::make_unique<PendingOperation<ReportingEndpointInfo>>(
+      PendingOperation<ReportingEndpointInfo>::Type::ADD,
+      ReportingEndpointInfo(endpoint));
+  ReportingEndpointKey key =
+      std::make_pair(endpoint.group_key, endpoint.info.url);
+  BatchOperation(std::move(key), std::move(po),
+                 &reporting_endpoint_pending_ops_);
+}
+
+void SQLitePersistentReportingAndNELStore::Backend::AddReportingEndpointGroup(
+    const CachedReportingEndpointGroup& group) {
+  auto po = std::make_unique<PendingOperation<ReportingEndpointGroupInfo>>(
+      PendingOperation<ReportingEndpointGroupInfo>::Type::ADD,
+      ReportingEndpointGroupInfo(group));
+  BatchOperation(group.group_key, std::move(po),
+                 &reporting_endpoint_group_pending_ops_);
+}
+
+void SQLitePersistentReportingAndNELStore::Backend::
+    UpdateReportingEndpointGroupAccessTime(
+        const CachedReportingEndpointGroup& group) {
+  auto po = std::make_unique<PendingOperation<ReportingEndpointGroupInfo>>(
+      PendingOperation<ReportingEndpointGroupInfo>::Type::UPDATE_ACCESS_TIME,
+      ReportingEndpointGroupInfo(group));
+  BatchOperation(group.group_key, std::move(po),
+                 &reporting_endpoint_group_pending_ops_);
+}
+
+void SQLitePersistentReportingAndNELStore::Backend::
+    UpdateReportingEndpointDetails(const ReportingClient& endpoint) {
+  auto po = std::make_unique<PendingOperation<ReportingEndpointInfo>>(
+      PendingOperation<ReportingEndpointInfo>::Type::UPDATE_DETAILS,
+      ReportingEndpointInfo(endpoint));
+  ReportingEndpointKey key =
+      std::make_pair(endpoint.group_key, endpoint.info.url);
+  BatchOperation(std::move(key), std::move(po),
+                 &reporting_endpoint_pending_ops_);
+}
+
+void SQLitePersistentReportingAndNELStore::Backend::
+    UpdateReportingEndpointGroupDetails(
+        const CachedReportingEndpointGroup& group) {
+  auto po = std::make_unique<PendingOperation<ReportingEndpointGroupInfo>>(
+      PendingOperation<ReportingEndpointGroupInfo>::Type::UPDATE_DETAILS,
+      ReportingEndpointGroupInfo(group));
+  BatchOperation(group.group_key, std::move(po),
+                 &reporting_endpoint_group_pending_ops_);
+}
+
+void SQLitePersistentReportingAndNELStore::Backend::DeleteReportingEndpoint(
+    const ReportingClient& endpoint) {
+  auto po = std::make_unique<PendingOperation<ReportingEndpointInfo>>(
+      PendingOperation<ReportingEndpointInfo>::Type::DELETE,
+      ReportingEndpointInfo(endpoint));
+  ReportingEndpointKey key =
+      std::make_pair(endpoint.group_key, endpoint.info.url);
+  BatchOperation(std::move(key), std::move(po),
+                 &reporting_endpoint_pending_ops_);
+}
+
+void SQLitePersistentReportingAndNELStore::Backend::
+    DeleteReportingEndpointGroup(const CachedReportingEndpointGroup& group) {
+  auto po = std::make_unique<PendingOperation<ReportingEndpointGroupInfo>>(
+      PendingOperation<ReportingEndpointGroupInfo>::Type::DELETE,
+      ReportingEndpointGroupInfo(group));
+  BatchOperation(group.group_key, std::move(po),
+                 &reporting_endpoint_group_pending_ops_);
 }
 
 size_t SQLitePersistentReportingAndNELStore::Backend::GetQueueLengthForTesting()
@@ -258,8 +484,14 @@
   size_t count = 0;
   {
     base::AutoLock locked(lock_);
-    for (auto& origin_and_pending_ops : nel_policy_pending_ops_) {
-      count += origin_and_pending_ops.second.size();
+    for (auto& key_and_pending_ops : nel_policy_pending_ops_) {
+      count += key_and_pending_ops.second.size();
+    }
+    for (auto& key_and_pending_ops : reporting_endpoint_pending_ops_) {
+      count += key_and_pending_ops.second.size();
+    }
+    for (auto& key_and_pending_ops : reporting_endpoint_group_pending_ops_) {
+      count += key_and_pending_ops.second.size();
     }
   }
   return count;
@@ -271,8 +503,17 @@
     return false;
   }
 
-  // TODO(chlily): Initialize tables for Reporting clients, endpoint groups,
-  // endpoints, and reports.
+  if (!db()->DoesTableExist("reporting_endpoints") &&
+      !CreateV1ReportingEndpointsSchema(db())) {
+    return false;
+  }
+
+  if (!db()->DoesTableExist("reporting_endpoint_groups") &&
+      !CreateV1ReportingEndpointGroupsSchema(db())) {
+    return false;
+  }
+
+  // TODO(chlily): Initialize tables for Reporting reports.
 
   return true;
 }
@@ -289,14 +530,20 @@
 }
 
 void SQLitePersistentReportingAndNELStore::Backend::DoCommit() {
-  NELPolicyPendingOperationsMap nel_policy_ops;
+  QueueType<url::Origin, NELPolicyInfo> nel_policy_ops;
+  QueueType<ReportingEndpointKey, ReportingEndpointInfo> reporting_endpoint_ops;
+  QueueType<ReportingEndpointGroupKey, ReportingEndpointGroupInfo>
+      reporting_endpoint_group_ops;
+  size_t op_count = 0;
   {
     base::AutoLock locked(lock_);
     nel_policy_pending_ops_.swap(nel_policy_ops);
-    // TODO(chlily): swap out pending operations queues for Reporting data.
+    reporting_endpoint_pending_ops_.swap(reporting_endpoint_ops);
+    reporting_endpoint_group_pending_ops_.swap(reporting_endpoint_group_ops);
+    // TODO(chlily): swap out pending operations queue for Reporting reports.
+    op_count = num_pending_;
     num_pending_ = 0;
   }
-  size_t op_count = nel_policy_ops.size();
   if (!db() || op_count == 0)
     return;
 
@@ -304,6 +551,7 @@
   if (!transaction.Begin())
     return;
 
+  // Commit all the NEL policy operations.
   for (const auto& origin_and_nel_policy_ops : nel_policy_ops) {
     const PendingOperationsVector<NELPolicyInfo>& ops_for_origin =
         origin_and_nel_policy_ops.second;
@@ -312,7 +560,29 @@
       CommitNELPolicyOperation(nel_policy_op.get());
     }
   }
-  // TODO(chlily): Commit operations pertaining to Reporting.
+
+  // Commit all the Reporting endpoint operations.
+  for (const auto& key_and_reporting_endpoint_ops : reporting_endpoint_ops) {
+    const PendingOperationsVector<ReportingEndpointInfo>& ops_for_key =
+        key_and_reporting_endpoint_ops.second;
+    for (const std::unique_ptr<PendingOperation<ReportingEndpointInfo>>&
+             reporting_endpoint_op : ops_for_key) {
+      CommitReportingEndpointOperation(reporting_endpoint_op.get());
+    }
+  }
+
+  // Commit all the Reporting endpoint group operations.
+  for (const auto& key_and_reporting_endpoint_group_ops :
+       reporting_endpoint_group_ops) {
+    const PendingOperationsVector<ReportingEndpointGroupInfo>& ops_for_key =
+        key_and_reporting_endpoint_group_ops.second;
+    for (const std::unique_ptr<PendingOperation<ReportingEndpointGroupInfo>>&
+             reporting_endpoint_group_op : ops_for_key) {
+      CommitReportingEndpointGroupOperation(reporting_endpoint_group_op.get());
+    }
+  }
+
+  // TODO(chlily): Commit operations pertaining to Reporting reports.
 
   transaction.Commit();
 }
@@ -386,30 +656,219 @@
       break;
 
     default:
+      // There are no UPDATE_DETAILS operations for NEL policies.
+      // TODO(chlily): Maybe add the ability to update details as opposed to
+      // removing and re-adding every time; it might be slightly more efficient.
       NOTREACHED();
       break;
   }
 }
 
-void SQLitePersistentReportingAndNELStore::Backend::BatchNELPolicyOperation(
-    const url::Origin& origin,
-    std::unique_ptr<PendingOperation<NELPolicyInfo>> po) {
+void SQLitePersistentReportingAndNELStore::Backend::
+    CommitReportingEndpointOperation(
+        PendingOperation<ReportingEndpointInfo>* op) {
+  DCHECK_EQ(1, db()->transaction_nesting());
+
+  sql::Statement add_smt(db()->GetCachedStatement(
+      SQL_FROM_HERE,
+      "INSERT INTO reporting_endpoints (origin_scheme, origin_host, "
+      "origin_port, group_name, url, priority, weight) "
+      "VALUES (?,?,?,?,?,?,?)"));
+  if (!add_smt.is_valid())
+    return;
+
+  sql::Statement update_details_smt(db()->GetCachedStatement(
+      SQL_FROM_HERE,
+      "UPDATE reporting_endpoints SET priority=?, weight=? WHERE "
+      "origin_scheme=? AND origin_host=? AND origin_port=? "
+      "AND group_name=? AND url=?"));
+  if (!update_details_smt.is_valid())
+    return;
+
+  sql::Statement del_smt(db()->GetCachedStatement(
+      SQL_FROM_HERE,
+      "DELETE FROM reporting_endpoints WHERE "
+      "origin_scheme=? AND origin_host=? AND origin_port=? "
+      "AND group_name=? AND url=?"));
+  if (!del_smt.is_valid())
+    return;
+
+  const ReportingEndpointInfo& reporting_endpoint_info = op->data();
+
+  switch (op->type()) {
+    case PendingOperation<ReportingEndpointInfo>::Type::ADD:
+      add_smt.Reset(true);
+      add_smt.BindString(0, reporting_endpoint_info.origin_scheme);
+      add_smt.BindString(1, reporting_endpoint_info.origin_host);
+      add_smt.BindInt(2, reporting_endpoint_info.origin_port);
+      add_smt.BindString(3, reporting_endpoint_info.group_name);
+      add_smt.BindString(4, reporting_endpoint_info.url);
+      add_smt.BindInt(5, reporting_endpoint_info.priority);
+      add_smt.BindInt(6, reporting_endpoint_info.weight);
+      if (!add_smt.Run())
+        DLOG(WARNING) << "Could not add a Reporting endpoint to the DB.";
+      break;
+
+    case PendingOperation<ReportingEndpointInfo>::Type::UPDATE_DETAILS:
+      update_details_smt.Reset(true);
+      update_details_smt.BindInt(0, reporting_endpoint_info.priority);
+      update_details_smt.BindInt(1, reporting_endpoint_info.weight);
+      update_details_smt.BindString(2, reporting_endpoint_info.origin_scheme);
+      update_details_smt.BindString(3, reporting_endpoint_info.origin_host);
+      update_details_smt.BindInt(4, reporting_endpoint_info.origin_port);
+      update_details_smt.BindString(5, reporting_endpoint_info.group_name);
+      update_details_smt.BindString(6, reporting_endpoint_info.url);
+      if (!update_details_smt.Run()) {
+        DLOG(WARNING)
+            << "Could not update Reporting endpoint details in the DB.";
+      }
+      break;
+
+    case PendingOperation<ReportingEndpointInfo>::Type::DELETE:
+      del_smt.Reset(true);
+      del_smt.BindString(0, reporting_endpoint_info.origin_scheme);
+      del_smt.BindString(1, reporting_endpoint_info.origin_host);
+      del_smt.BindInt(2, reporting_endpoint_info.origin_port);
+      del_smt.BindString(3, reporting_endpoint_info.group_name);
+      del_smt.BindString(4, reporting_endpoint_info.url);
+      if (!del_smt.Run())
+        DLOG(WARNING) << "Could not delete a Reporting endpoint from the DB.";
+      break;
+
+    default:
+      // There are no UPDATE_ACCESS_TIME operations for Reporting endpoints
+      // because their access times are not tracked.
+      NOTREACHED();
+      break;
+  }
+}
+
+void SQLitePersistentReportingAndNELStore::Backend::
+    CommitReportingEndpointGroupOperation(
+        PendingOperation<ReportingEndpointGroupInfo>* op) {
+  DCHECK_EQ(1, db()->transaction_nesting());
+
+  sql::Statement add_smt(db()->GetCachedStatement(
+      SQL_FROM_HERE,
+      "INSERT INTO reporting_endpoint_groups (origin_scheme, origin_host, "
+      "origin_port, group_name, is_include_subdomains, expires_us_since_epoch, "
+      "last_access_us_since_epoch) VALUES (?,?,?,?,?,?,?)"));
+  if (!add_smt.is_valid())
+    return;
+
+  sql::Statement update_access_smt(db()->GetCachedStatement(
+      SQL_FROM_HERE,
+      "UPDATE reporting_endpoint_groups SET last_access_us_since_epoch=? WHERE "
+      "origin_scheme=? AND origin_host=? AND origin_port=? AND group_name=?"));
+  if (!update_access_smt.is_valid())
+    return;
+
+  sql::Statement update_details_smt(db()->GetCachedStatement(
+      SQL_FROM_HERE,
+      "UPDATE reporting_endpoint_groups SET is_include_subdomains=?, "
+      "expires_us_since_epoch=?, last_access_us_since_epoch=? WHERE "
+      "origin_scheme=? AND origin_host=? AND origin_port=? AND group_name=?"));
+  if (!update_details_smt.is_valid())
+    return;
+
+  sql::Statement del_smt(db()->GetCachedStatement(
+      SQL_FROM_HERE,
+      "DELETE FROM reporting_endpoint_groups WHERE "
+      "origin_scheme=? AND origin_host=? AND origin_port=? AND group_name=?"));
+  if (!del_smt.is_valid())
+    return;
+
+  const ReportingEndpointGroupInfo& reporting_endpoint_group_info = op->data();
+
+  switch (op->type()) {
+    case PendingOperation<ReportingEndpointGroupInfo>::Type::ADD:
+      add_smt.Reset(true);
+      add_smt.BindString(0, reporting_endpoint_group_info.origin_scheme);
+      add_smt.BindString(1, reporting_endpoint_group_info.origin_host);
+      add_smt.BindInt(2, reporting_endpoint_group_info.origin_port);
+      add_smt.BindString(3, reporting_endpoint_group_info.group_name);
+      add_smt.BindBool(4, reporting_endpoint_group_info.is_include_subdomains);
+      add_smt.BindInt64(5,
+                        reporting_endpoint_group_info.expires_us_since_epoch);
+      add_smt.BindInt64(
+          6, reporting_endpoint_group_info.last_access_us_since_epoch);
+      if (!add_smt.Run())
+        DLOG(WARNING) << "Could not add a Reporting endpoint group to the DB.";
+      break;
+
+    case PendingOperation<ReportingEndpointGroupInfo>::Type::UPDATE_ACCESS_TIME:
+      update_access_smt.Reset(true);
+      update_access_smt.BindInt64(
+          0, reporting_endpoint_group_info.last_access_us_since_epoch);
+      update_access_smt.BindString(1,
+                                   reporting_endpoint_group_info.origin_scheme);
+      update_access_smt.BindString(2,
+                                   reporting_endpoint_group_info.origin_host);
+      update_access_smt.BindInt(3, reporting_endpoint_group_info.origin_port);
+      update_access_smt.BindString(4, reporting_endpoint_group_info.group_name);
+      if (!update_access_smt.Run()) {
+        DLOG(WARNING)
+            << "Could not update Reporting endpoint group last access "
+               "time in the DB.";
+      }
+      break;
+
+    case PendingOperation<ReportingEndpointGroupInfo>::Type::UPDATE_DETAILS:
+      update_details_smt.Reset(true);
+      update_details_smt.BindBool(
+          0, reporting_endpoint_group_info.is_include_subdomains);
+      update_details_smt.BindInt64(
+          1, reporting_endpoint_group_info.expires_us_since_epoch);
+      update_details_smt.BindInt64(
+          2, reporting_endpoint_group_info.last_access_us_since_epoch);
+      update_details_smt.BindString(
+          3, reporting_endpoint_group_info.origin_scheme);
+      update_details_smt.BindString(4,
+                                    reporting_endpoint_group_info.origin_host);
+      update_details_smt.BindInt(5, reporting_endpoint_group_info.origin_port);
+      update_details_smt.BindString(6,
+                                    reporting_endpoint_group_info.group_name);
+      if (!update_details_smt.Run()) {
+        DLOG(WARNING)
+            << "Could not update Reporting endpoint group details in the DB.";
+      }
+      break;
+
+    case PendingOperation<ReportingEndpointGroupInfo>::Type::DELETE:
+      del_smt.Reset(true);
+      del_smt.BindString(0, reporting_endpoint_group_info.origin_scheme);
+      del_smt.BindString(1, reporting_endpoint_group_info.origin_host);
+      del_smt.BindInt(2, reporting_endpoint_group_info.origin_port);
+      del_smt.BindString(3, reporting_endpoint_group_info.group_name);
+      if (!del_smt.Run()) {
+        DLOG(WARNING)
+            << "Could not delete a Reporting endpoint group from the DB.";
+      }
+      break;
+  }
+}
+
+template <typename KeyType, typename DataType>
+void SQLitePersistentReportingAndNELStore::Backend::BatchOperation(
+    KeyType key,
+    std::unique_ptr<PendingOperation<DataType>> po,
+    QueueType<KeyType, DataType>* queue) {
   DCHECK(!background_task_runner()->RunsTasksInCurrentSequence());
 
   size_t num_pending;
   {
     base::AutoLock locked(lock_);
 
-    std::pair<NELPolicyPendingOperationsMap::iterator, bool> iter_and_result =
-        nel_policy_pending_ops_.insert(
-            std::make_pair(origin, PendingOperationsVector<NELPolicyInfo>()));
-    PendingOperationsVector<NELPolicyInfo>* ops_for_origin =
+    std::pair<typename QueueType<KeyType, DataType>::iterator, bool>
+        iter_and_result = queue->insert(std::make_pair(
+            std::move(key), PendingOperationsVector<DataType>()));
+    PendingOperationsVector<DataType>* ops_for_key =
         &iter_and_result.first->second;
-    // If the insert failed, then we already have NEL policy operations for this
-    // origin, so we try to coalesce the new operation with the existing ones.
+    // If the insert failed, then we already have operations for this
+    // key, so we try to coalesce the new operation with the existing ones.
     if (!iter_and_result.second)
-      MaybeCoalesceOperations(ops_for_origin, po.get());
-    ops_for_origin->push_back(std::move(po));
+      MaybeCoalesceOperations(ops_for_key, po.get());
+    ops_for_key->push_back(std::move(po));
     // Note that num_pending_ counts number of calls to Batch*Operation(), not
     // the current length of the queue; this is intentional to guarantee
     // progress, as the length of the queue may decrease in some cases.
@@ -424,23 +883,41 @@
     PendingOperationsVector<DataType>* ops_for_key,
     PendingOperation<DataType>* new_op) {
   DCHECK(!ops_for_key->empty());
-  if (new_op->type() == PendingOperation<DataType>::Type::DELETE) {
-    // A delete makes all previous operations irrelevant.
-    ops_for_key->clear();
-  } else if (new_op->type() ==
-             PendingOperation<DataType>::Type::UPDATE_ACCESS_TIME) {
-    if (ops_for_key->back()->type() ==
-        PendingOperation<DataType>::Type::UPDATE_ACCESS_TIME) {
-      // Updating the access time twice in a row is equivalent to just the
-      // latter update.
-      ops_for_key->pop_back();
-      // At most a delete and add before.
-      DCHECK_LE(ops_for_key->size(), 2u);
-    }
-  } else {
-    // Nothing special is done for an add operation. If it is overwriting an
-    // existing entry, it will be preceded by at most one delete.
-    DCHECK_LE(ops_for_key->size(), 1u);
+
+  switch (new_op->type()) {
+    case PendingOperation<DataType>::Type::DELETE:
+      // A delete makes all previous operations irrelevant.
+      ops_for_key->clear();
+      break;
+
+    case PendingOperation<DataType>::Type::UPDATE_ACCESS_TIME:
+      if (ops_for_key->back()->type() ==
+          PendingOperation<DataType>::Type::UPDATE_ACCESS_TIME) {
+        // Updating the access time twice in a row is equivalent to just the
+        // latter update.
+        ops_for_key->pop_back();
+      }
+      break;
+
+    case PendingOperation<DataType>::Type::UPDATE_DETAILS:
+      while (!ops_for_key->empty() &&
+             // Updating the details twice in a row is equivalent to just the
+             // latter update.
+             (ops_for_key->back()->type() ==
+                  PendingOperation<DataType>::Type::UPDATE_DETAILS ||
+              // UPDATE_DETAILS also updates the access time, so either type of
+              // update operation can be discarded.
+              ops_for_key->back()->type() ==
+                  PendingOperation<DataType>::Type::UPDATE_ACCESS_TIME)) {
+        ops_for_key->pop_back();
+      }
+      break;
+
+    case PendingOperation<DataType>::Type::ADD:
+      // Nothing special is done for an add operation. If it is overwriting an
+      // existing entry, it will be preceded by at most one delete.
+      DCHECK_LE(ops_for_key->size(), 1u);
+      break;
   }
 }
 
@@ -483,8 +960,8 @@
   }
 
   sql::Statement smt(db()->GetUniqueStatement(
-      "SELECT origin_scheme, origin_host, origin_port, received_ip_address,"
-      "report_to, expires_us_since_epoch, success_fraction, failure_fraction,"
+      "SELECT origin_scheme, origin_host, origin_port, received_ip_address, "
+      "report_to, expires_us_since_epoch, success_fraction, failure_fraction, "
       "is_include_subdomains, last_access_us_since_epoch FROM nel_policies"));
   if (!smt.is_valid()) {
     Reset();
@@ -540,6 +1017,105 @@
   std::move(loaded_callback).Run(std::move(loaded_policies));
 }
 
+void SQLitePersistentReportingAndNELStore::Backend::
+    LoadReportingClientsAndNotifyInBackground(
+        ReportingClientsLoadedCallback loaded_callback) {
+  DCHECK(background_task_runner()->RunsTasksInCurrentSequence());
+
+  std::vector<ReportingClient> loaded_endpoints;
+  std::vector<CachedReportingEndpointGroup> loaded_endpoint_groups;
+  if (!InitializeDatabase()) {
+    PostClientTask(
+        FROM_HERE,
+        base::BindOnce(
+            &Backend::CompleteLoadReportingClientsAndNotifyInForeground, this,
+            std::move(loaded_callback), std::move(loaded_endpoints),
+            std::move(loaded_endpoint_groups), false /* load_success */));
+    return;
+  }
+
+  sql::Statement endpoints_smt(db()->GetUniqueStatement(
+      "SELECT origin_scheme, origin_host, origin_port, group_name, "
+      "url, priority, weight FROM reporting_endpoints"));
+  sql::Statement endpoint_groups_smt(db()->GetUniqueStatement(
+      "SELECT origin_scheme, origin_host, origin_port, group_name, "
+      "is_include_subdomains, expires_us_since_epoch, "
+      "last_access_us_since_epoch FROM reporting_endpoint_groups"));
+  if (!endpoints_smt.is_valid() || !endpoint_groups_smt.is_valid()) {
+    Reset();
+    PostClientTask(
+        FROM_HERE,
+        base::BindOnce(
+            &Backend::CompleteLoadReportingClientsAndNotifyInForeground, this,
+            std::move(loaded_callback), std::move(loaded_endpoints),
+            std::move(loaded_endpoint_groups), false /* load_success */));
+    return;
+  }
+
+  while (endpoints_smt.Step()) {
+    // Reconstitute a ReportingClient from the fields stored in the database.
+    url::Origin origin = url::Origin::CreateFromNormalizedTuple(
+        /* origin_scheme = */ endpoints_smt.ColumnString(0),
+        /* origin_host = */ endpoints_smt.ColumnString(1),
+        /* origin_port = */ endpoints_smt.ColumnInt(2));
+    std::string group_name = endpoints_smt.ColumnString(3);
+    ReportingClient::EndpointInfo endpoint_info;
+    endpoint_info.url = GURL(endpoints_smt.ColumnString(4));
+    endpoint_info.priority = endpoints_smt.ColumnInt(5);
+    endpoint_info.weight = endpoints_smt.ColumnInt(6);
+
+    loaded_endpoints.emplace_back(std::move(origin), std::move(group_name),
+                                  std::move(endpoint_info));
+  }
+
+  while (endpoint_groups_smt.Step()) {
+    // Reconstitute a CachedReportingEndpointGroup from the fields stored in the
+    // database.
+    url::Origin origin = url::Origin::CreateFromNormalizedTuple(
+        /* origin_scheme = */ endpoint_groups_smt.ColumnString(0),
+        /* origin_host = */ endpoint_groups_smt.ColumnString(1),
+        /* origin_port = */ endpoint_groups_smt.ColumnInt(2));
+    std::string group_name = endpoint_groups_smt.ColumnString(3);
+    OriginSubdomains include_subdomains = endpoint_groups_smt.ColumnBool(4)
+                                              ? OriginSubdomains::INCLUDE
+                                              : OriginSubdomains::EXCLUDE;
+    base::Time expires = base::Time::FromDeltaSinceWindowsEpoch(
+        base::TimeDelta::FromMicroseconds(endpoint_groups_smt.ColumnInt64(5)));
+    base::Time last_used = base::Time::FromDeltaSinceWindowsEpoch(
+        base::TimeDelta::FromMicroseconds(endpoint_groups_smt.ColumnInt64(6)));
+
+    loaded_endpoint_groups.emplace_back(std::move(origin),
+                                        std::move(group_name),
+                                        include_subdomains, expires, last_used);
+  }
+
+  PostClientTask(
+      FROM_HERE,
+      base::BindOnce(
+          &Backend::CompleteLoadReportingClientsAndNotifyInForeground, this,
+          std::move(loaded_callback), std::move(loaded_endpoints),
+          std::move(loaded_endpoint_groups), true /* load_success */));
+}
+
+void SQLitePersistentReportingAndNELStore::Backend::
+    CompleteLoadReportingClientsAndNotifyInForeground(
+        ReportingClientsLoadedCallback loaded_callback,
+        std::vector<ReportingClient> loaded_endpoints,
+        std::vector<CachedReportingEndpointGroup> loaded_endpoint_groups,
+        bool load_success) {
+  DCHECK(client_task_runner()->RunsTasksInCurrentSequence());
+
+  if (load_success) {
+    // TODO(chlily): report metrics
+  } else {
+    DCHECK(loaded_endpoints.empty());
+    DCHECK(loaded_endpoint_groups.empty());
+  }
+
+  std::move(loaded_callback)
+      .Run(std::move(loaded_endpoints), std::move(loaded_endpoint_groups));
+}
+
 SQLitePersistentReportingAndNELStore::SQLitePersistentReportingAndNELStore(
     const base::FilePath& path,
     const scoped_refptr<base::SequencedTaskRunner>& client_task_runner,
@@ -574,6 +1150,50 @@
   backend_->DeleteNELPolicy(policy);
 }
 
+void SQLitePersistentReportingAndNELStore::LoadReportingClients(
+    ReportingClientsLoadedCallback loaded_callback) {
+  DCHECK(!loaded_callback.is_null());
+  backend_->LoadReportingClients(base::BindOnce(
+      &SQLitePersistentReportingAndNELStore::CompleteLoadReportingClients,
+      weak_factory_.GetWeakPtr(), std::move(loaded_callback)));
+}
+
+void SQLitePersistentReportingAndNELStore::AddReportingEndpoint(
+    const ReportingClient& endpoint) {
+  backend_->AddReportingEndpoint(endpoint);
+}
+
+void SQLitePersistentReportingAndNELStore::AddReportingEndpointGroup(
+    const CachedReportingEndpointGroup& group) {
+  backend_->AddReportingEndpointGroup(group);
+}
+
+void SQLitePersistentReportingAndNELStore::
+    UpdateReportingEndpointGroupAccessTime(
+        const CachedReportingEndpointGroup& group) {
+  backend_->UpdateReportingEndpointGroupAccessTime(group);
+}
+
+void SQLitePersistentReportingAndNELStore::UpdateReportingEndpointDetails(
+    const ReportingClient& endpoint) {
+  backend_->UpdateReportingEndpointDetails(endpoint);
+}
+
+void SQLitePersistentReportingAndNELStore::UpdateReportingEndpointGroupDetails(
+    const CachedReportingEndpointGroup& group) {
+  backend_->UpdateReportingEndpointGroupDetails(group);
+}
+
+void SQLitePersistentReportingAndNELStore::DeleteReportingEndpoint(
+    const ReportingClient& endpoint) {
+  backend_->DeleteReportingEndpoint(endpoint);
+}
+
+void SQLitePersistentReportingAndNELStore::DeleteReportingEndpointGroup(
+    const CachedReportingEndpointGroup& group) {
+  backend_->DeleteReportingEndpointGroup(group);
+}
+
 void SQLitePersistentReportingAndNELStore::Flush() {
   backend_->Flush(base::DoNothing());
 }
@@ -588,4 +1208,11 @@
   std::move(callback).Run(std::move(policies));
 }
 
+void SQLitePersistentReportingAndNELStore::CompleteLoadReportingClients(
+    ReportingClientsLoadedCallback callback,
+    std::vector<ReportingClient> endpoints,
+    std::vector<CachedReportingEndpointGroup> endpoint_groups) {
+  std::move(callback).Run(std::move(endpoints), std::move(endpoint_groups));
+}
+
 }  // namespace net
diff --git a/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.h b/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.h
index fc279b5..df55c3b 100644
--- a/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.h
+++ b/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store.h
@@ -13,6 +13,7 @@
 #include "base/memory/weak_ptr.h"
 #include "net/network_error_logging/network_error_logging_service.h"
 #include "net/network_error_logging/persistent_reporting_and_nel_store.h"
+#include "net/reporting/reporting_cache.h"
 
 namespace base {
 class FilePath;
@@ -39,6 +40,22 @@
       const NetworkErrorLoggingService::NELPolicy& policy) override;
   void DeleteNELPolicy(
       const NetworkErrorLoggingService::NELPolicy& policy) override;
+
+  // ReportingCache::PersistentReportingStore implementation
+  void LoadReportingClients(
+      ReportingClientsLoadedCallback loaded_callback) override;
+  void AddReportingEndpoint(const ReportingClient& endpoint) override;
+  void AddReportingEndpointGroup(
+      const CachedReportingEndpointGroup& group) override;
+  void UpdateReportingEndpointGroupAccessTime(
+      const CachedReportingEndpointGroup& group) override;
+  void UpdateReportingEndpointDetails(const ReportingClient& endpoint) override;
+  void UpdateReportingEndpointGroupDetails(
+      const CachedReportingEndpointGroup& group) override;
+  void DeleteReportingEndpoint(const ReportingClient& endpoint) override;
+  void DeleteReportingEndpointGroup(
+      const CachedReportingEndpointGroup& group) override;
+
   void Flush() override;
 
   size_t GetQueueLengthForTesting() const;
@@ -51,6 +68,12 @@
       NELPoliciesLoadedCallback callback,
       std::vector<NetworkErrorLoggingService::NELPolicy> policies);
 
+  // Calls |callback| with the loaded |endpoints| and |endpoint_groups|.
+  void CompleteLoadReportingClients(
+      ReportingClientsLoadedCallback callback,
+      std::vector<ReportingClient> endpoints,
+      std::vector<CachedReportingEndpointGroup> endpoint_groups);
+
   const scoped_refptr<Backend> backend_;
 
   base::WeakPtrFactory<SQLitePersistentReportingAndNELStore> weak_factory_;
diff --git a/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc b/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc
index bab431d..7b9d94e 100644
--- a/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc
+++ b/net/extras/sqlite/sqlite_persistent_reporting_and_nel_store_unittest.cc
@@ -37,8 +37,13 @@
 const IPAddress kServerIP = IPAddress(192, 168, 0, 1);
 const std::string kHeader = "{\"report_to\":\"group\",\"max_age\":86400}";
 const std::string kHeaderMaxAge0 = "{\"report_to\":\"group\",\"max_age\":0}";
+const std::string kGroupName1 = "group1";
+const std::string kGroupName2 = "group2";
+const GURL kEndpoint1 = GURL("https://endpoint.test/1");
+const GURL kEndpoint2 = GURL("https://endpoint.test/2");
+const base::Time kExpires = base::Time::Now() + base::TimeDelta::FromDays(7);
 
-enum class Op { kAdd, kDelete, kUpdate };
+enum class Op { kAdd, kDelete, kUpdate, kUpdateDetails };
 
 struct TestCase {
   std::vector<Op> operations;
@@ -47,7 +52,7 @@
 
 // Testcases for coalescing of pending operations. In each case, the given
 // sequence of operations should be coalesced down to |expected_queue_length|
-// actual operations performed.
+// actual operations queued.
 const std::vector<TestCase> kCoalescingTestcases = {
     {{Op::kAdd, Op::kDelete}, 1u},
     {{Op::kUpdate, Op::kDelete}, 1u},
@@ -61,6 +66,22 @@
     {{Op::kDelete, Op::kAdd, Op::kDelete}, 1u},
     {{Op::kDelete, Op::kAdd, Op::kUpdate, Op::kDelete}, 1u}};
 
+// This is for Reporting endpoint groups, which have both UPDATE_DETAILS and
+// UPDATE_ACCESS_TIME. These additional testcases test that UPDATE_DETAILS
+// overwrites UPDATE_ACCESS_TIME, but not vice versa.
+const std::vector<TestCase> kCoalescingTestcasesForUpdateDetails = {
+    {{Op::kUpdateDetails, Op::kDelete}, 1u},
+    {{Op::kAdd, Op::kUpdateDetails, Op::kDelete}, 1u},
+    {{Op::kUpdateDetails, Op::kUpdateDetails}, 1u},
+    {{Op::kUpdate, Op::kUpdateDetails}, 1u},
+    {{Op::kUpdateDetails, Op::kUpdate}, 2u},
+    {{Op::kAdd, Op::kUpdateDetails, Op::kUpdate}, 3u},
+    {{Op::kAdd, Op::kUpdateDetails, Op::kUpdate, Op::kUpdateDetails}, 2u},
+    {{Op::kDelete, Op::kAdd, Op::kUpdateDetails}, 3u},
+    {{Op::kDelete, Op::kAdd, Op::kUpdateDetails, Op::kUpdateDetails}, 3u},
+    {{Op::kDelete, Op::kAdd, Op::kUpdate, Op::kUpdateDetails}, 3u},
+    {{Op::kDelete, Op::kAdd, Op::kUpdateDetails, Op::kUpdate}, 4u}};
+
 }  // namespace
 
 class SQLitePersistentReportingAndNELStoreTest
@@ -81,26 +102,56 @@
     RunUntilIdle();
   }
 
+  // Call this on a brand new database that should have nothing stored in it.
   void InitializeStore() {
     std::vector<NetworkErrorLoggingService::NELPolicy> nel_policies;
     LoadNELPolicies(&nel_policies);
     EXPECT_EQ(0u, nel_policies.size());
+
+    // One load should be sufficient to initialize the database, but we might as
+    // well load everything to check that there is nothing in the database.
+    std::vector<ReportingClient> endpoints;
+    std::vector<CachedReportingEndpointGroup> groups;
+    LoadReportingClients(&endpoints, &groups);
+    EXPECT_EQ(0u, endpoints.size());
+    EXPECT_EQ(0u, groups.size());
   }
 
   void LoadNELPolicies(
-      std::vector<NetworkErrorLoggingService::NELPolicy>* policies) {
+      std::vector<NetworkErrorLoggingService::NELPolicy>* policies_out) {
     base::RunLoop run_loop;
     store_->LoadNELPolicies(base::BindRepeating(
         &SQLitePersistentReportingAndNELStoreTest::OnNELPoliciesLoaded,
-        base::Unretained(this), &run_loop));
+        base::Unretained(this), &run_loop, policies_out));
     run_loop.Run();
-    policies->swap(nel_policies_);
   }
 
   void OnNELPoliciesLoaded(
       base::RunLoop* run_loop,
+      std::vector<NetworkErrorLoggingService::NELPolicy>* policies_out,
       std::vector<NetworkErrorLoggingService::NELPolicy> policies) {
-    nel_policies_.swap(policies);
+    policies_out->swap(policies);
+    run_loop->Quit();
+  }
+
+  void LoadReportingClients(
+      std::vector<ReportingClient>* endpoints_out,
+      std::vector<CachedReportingEndpointGroup>* groups_out) {
+    base::RunLoop run_loop;
+    store_->LoadReportingClients(base::BindRepeating(
+        &SQLitePersistentReportingAndNELStoreTest::OnReportingClientsLoaded,
+        base::Unretained(this), &run_loop, endpoints_out, groups_out));
+    run_loop.Run();
+  }
+
+  void OnReportingClientsLoaded(
+      base::RunLoop* run_loop,
+      std::vector<ReportingClient>* endpoints_out,
+      std::vector<CachedReportingEndpointGroup>* groups_out,
+      std::vector<ReportingClient> endpoints,
+      std::vector<CachedReportingEndpointGroup> groups) {
+    endpoints_out->swap(endpoints);
+    groups_out->swap(groups);
     run_loop->Quit();
   }
 
@@ -134,7 +185,7 @@
     policy.origin = origin;
     policy.received_ip_address = IPAddress::IPv4Localhost();
     policy.report_to = "group";
-    policy.expires = base::Time::Now() + base::TimeDelta::FromDays(7);
+    policy.expires = kExpires;
     policy.success_fraction = 0.0;
     policy.failure_fraction = 1.0;
     policy.include_subdomains = false;
@@ -142,6 +193,30 @@
     return policy;
   }
 
+  ReportingClient MakeReportingEndpoint(
+      url::Origin origin,
+      std::string group_name,
+      GURL url,
+      int priority = ReportingClient::EndpointInfo::kDefaultPriority,
+      int weight = ReportingClient::EndpointInfo::kDefaultWeight) {
+    ReportingClient::EndpointInfo info;
+    info.url = url;
+    info.priority = priority;
+    info.weight = weight;
+    ReportingClient endpoint(origin, group_name, std::move(info));
+    return endpoint;
+  }
+
+  CachedReportingEndpointGroup MakeReportingEndpointGroup(
+      url::Origin origin,
+      std::string group_name,
+      base::Time last_used,
+      OriginSubdomains include_subdomains = OriginSubdomains::DEFAULT,
+      base::Time expires = kExpires) {
+    return CachedReportingEndpointGroup(origin, group_name, include_subdomains,
+                                        expires, last_used);
+  }
+
  protected:
   base::ScopedTempDir temp_dir_;
   std::unique_ptr<SQLitePersistentReportingAndNELStore> store_;
@@ -149,8 +224,6 @@
       base::ThreadTaskRunnerHandle::Get();
   const scoped_refptr<base::SequencedTaskRunner> background_task_runner_ =
       base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()});
-
-  std::vector<NetworkErrorLoggingService::NELPolicy> nel_policies_;
 };
 
 TEST_F(SQLitePersistentReportingAndNELStoreTest, CreateDBAndTables) {
@@ -160,6 +233,8 @@
   std::string contents = ReadRawDBContents();
   EXPECT_NE("", contents);
   EXPECT_NE(std::string::npos, contents.find("nel_policies"));
+  EXPECT_NE(std::string::npos, contents.find("reporting_endpoints"));
+  EXPECT_NE(std::string::npos, contents.find("reporting_endpoint_groups"));
 }
 
 TEST_F(SQLitePersistentReportingAndNELStoreTest, PersistNELPolicy) {
@@ -187,7 +262,7 @@
   EXPECT_TRUE(WithinOneMicrosecond(policy.last_used, policies[0].last_used));
 }
 
-TEST_F(SQLitePersistentReportingAndNELStoreTest, LoadNELPoliciesFailed) {
+TEST_F(SQLitePersistentReportingAndNELStoreTest, LoadFailed) {
   // Inject a db initialization failure by creating a directory where the db
   // file should be.
   ASSERT_TRUE(base::CreateDirectory(
@@ -196,8 +271,9 @@
       temp_dir_.GetPath().Append(kReportingAndNELStoreFilename),
       client_task_runner_, background_task_runner_);
 
-  // InitializeStore() checks that we receive an empty vector of policies,
-  // signifying the failure to load.
+  // InitializeStore() checks that we receive empty vectors of NEL policies,
+  // reporting endpoints, and reporting endpoint groups, signifying the failure
+  // to load.
   InitializeStore();
 }
 
@@ -319,6 +395,10 @@
         case Op::kUpdate:
           store_->UpdateNELPolicyAccessTime(policy);
           break;
+
+        default:
+          NOTREACHED();
+          break;
       }
     }
 
@@ -570,4 +650,458 @@
   EXPECT_EQ(0u, reporting_service_->reports().size());
 }
 
+TEST_F(SQLitePersistentReportingAndNELStoreTest, PersistReportingClients) {
+  CreateStore();
+  InitializeStore();
+  base::Time now = base::Time::Now();
+  ReportingClient endpoint =
+      MakeReportingEndpoint(kOrigin1, kGroupName1, kEndpoint1);
+  CachedReportingEndpointGroup group =
+      MakeReportingEndpointGroup(kOrigin1, kGroupName1, now);
+
+  store_->AddReportingEndpoint(endpoint);
+  store_->AddReportingEndpointGroup(group);
+
+  // Close and reopen the database.
+  DestroyStore();
+  CreateStore();
+
+  // Load the stored clients.
+  std::vector<ReportingClient> endpoints;
+  std::vector<CachedReportingEndpointGroup> groups;
+  LoadReportingClients(&endpoints, &groups);
+  ASSERT_EQ(1u, endpoints.size());
+  EXPECT_EQ(endpoint.group_key.origin, endpoints[0].group_key.origin);
+  EXPECT_EQ(endpoint.group_key.group_name, endpoints[0].group_key.group_name);
+  EXPECT_EQ(endpoint.info.url, endpoints[0].info.url);
+  EXPECT_EQ(endpoint.info.priority, endpoints[0].info.priority);
+  EXPECT_EQ(endpoint.info.weight, endpoints[0].info.weight);
+  ASSERT_EQ(1u, groups.size());
+  EXPECT_EQ(group.group_key.origin, groups[0].group_key.origin);
+  EXPECT_EQ(group.group_key.group_name, groups[0].group_key.group_name);
+  EXPECT_EQ(group.include_subdomains, groups[0].include_subdomains);
+  EXPECT_TRUE(WithinOneMicrosecond(group.expires, groups[0].expires));
+  EXPECT_TRUE(WithinOneMicrosecond(group.last_used, groups[0].last_used));
+}
+
+TEST_F(SQLitePersistentReportingAndNELStoreTest,
+       UpdateReportingEndpointGroupAccessTime) {
+  CreateStore();
+  InitializeStore();
+  base::Time now = base::Time::Now();
+  CachedReportingEndpointGroup group =
+      MakeReportingEndpointGroup(kOrigin1, kGroupName1, now);
+
+  store_->AddReportingEndpointGroup(group);
+
+  group.last_used = now + base::TimeDelta::FromDays(1);
+  store_->UpdateReportingEndpointGroupAccessTime(group);
+
+  // Close and reopen the database.
+  DestroyStore();
+  CreateStore();
+
+  std::vector<ReportingClient> endpoints;
+  std::vector<CachedReportingEndpointGroup> groups;
+  LoadReportingClients(&endpoints, &groups);
+  ASSERT_EQ(1u, groups.size());
+  EXPECT_EQ(group.group_key.origin, groups[0].group_key.origin);
+  EXPECT_EQ(group.group_key.group_name, groups[0].group_key.group_name);
+  EXPECT_TRUE(WithinOneMicrosecond(group.last_used, groups[0].last_used));
+}
+
+TEST_F(SQLitePersistentReportingAndNELStoreTest,
+       UpdateReportingEndpointDetails) {
+  CreateStore();
+  InitializeStore();
+  ReportingClient endpoint =
+      MakeReportingEndpoint(kOrigin1, kGroupName1, kEndpoint1);
+
+  store_->AddReportingEndpoint(endpoint);
+
+  endpoint.info.priority = 10;
+  endpoint.info.weight = 10;
+  store_->UpdateReportingEndpointDetails(endpoint);
+
+  // Close and reopen the database.
+  DestroyStore();
+  CreateStore();
+
+  std::vector<ReportingClient> endpoints;
+  std::vector<CachedReportingEndpointGroup> groups;
+  LoadReportingClients(&endpoints, &groups);
+  ASSERT_EQ(1u, endpoints.size());
+  EXPECT_EQ(endpoint.group_key.origin, endpoints[0].group_key.origin);
+  EXPECT_EQ(endpoint.group_key.group_name, endpoints[0].group_key.group_name);
+  EXPECT_EQ(endpoint.info.url, endpoints[0].info.url);
+  EXPECT_EQ(endpoint.info.priority, endpoints[0].info.priority);
+  EXPECT_EQ(endpoint.info.weight, endpoints[0].info.weight);
+}
+
+TEST_F(SQLitePersistentReportingAndNELStoreTest,
+       UpdateReportingEndpointGroupDetails) {
+  CreateStore();
+  InitializeStore();
+  base::Time now = base::Time::Now();
+  CachedReportingEndpointGroup group = MakeReportingEndpointGroup(
+      kOrigin1, kGroupName1, now, OriginSubdomains::EXCLUDE, kExpires);
+
+  store_->AddReportingEndpointGroup(group);
+
+  group.last_used = now + base::TimeDelta::FromDays(1);
+  group.expires = kExpires + base::TimeDelta::FromDays(1);
+  group.include_subdomains = OriginSubdomains::INCLUDE;
+  store_->UpdateReportingEndpointGroupDetails(group);
+
+  // Close and reopen the database.
+  DestroyStore();
+  CreateStore();
+
+  std::vector<ReportingClient> endpoints;
+  std::vector<CachedReportingEndpointGroup> groups;
+  LoadReportingClients(&endpoints, &groups);
+  ASSERT_EQ(1u, groups.size());
+  EXPECT_EQ(group.group_key.origin, groups[0].group_key.origin);
+  EXPECT_EQ(group.group_key.group_name, groups[0].group_key.group_name);
+  EXPECT_EQ(group.include_subdomains, groups[0].include_subdomains);
+  EXPECT_TRUE(WithinOneMicrosecond(group.expires, groups[0].expires));
+  EXPECT_TRUE(WithinOneMicrosecond(group.last_used, groups[0].last_used));
+}
+
+TEST_F(SQLitePersistentReportingAndNELStoreTest, DeleteReportingEndpoint) {
+  CreateStore();
+  InitializeStore();
+  ReportingClient endpoint1 =
+      MakeReportingEndpoint(kOrigin1, kGroupName1, kEndpoint1);
+  ReportingClient endpoint2 =
+      MakeReportingEndpoint(kOrigin2, kGroupName2, kEndpoint2);
+
+  store_->AddReportingEndpoint(endpoint1);
+  store_->AddReportingEndpoint(endpoint2);
+
+  store_->DeleteReportingEndpoint(endpoint1);
+
+  // Close and reopen the database.
+  DestroyStore();
+  CreateStore();
+
+  std::vector<ReportingClient> endpoints;
+  std::vector<CachedReportingEndpointGroup> groups;
+  LoadReportingClients(&endpoints, &groups);
+  ASSERT_EQ(1u, endpoints.size());
+  EXPECT_EQ(endpoint2.info.url, endpoints[0].info.url);
+
+  store_->DeleteReportingEndpoint(endpoint2);
+  DestroyStore();
+  CreateStore();
+
+  endpoints.clear();
+  LoadReportingClients(&endpoints, &groups);
+  EXPECT_EQ(0u, endpoints.size());
+}
+
+TEST_F(SQLitePersistentReportingAndNELStoreTest, DeleteReportingEndpointGroup) {
+  CreateStore();
+  InitializeStore();
+  base::Time now = base::Time::Now();
+  CachedReportingEndpointGroup group1 =
+      MakeReportingEndpointGroup(kOrigin1, kGroupName1, now);
+  CachedReportingEndpointGroup group2 =
+      MakeReportingEndpointGroup(kOrigin2, kGroupName2, now);
+
+  store_->AddReportingEndpointGroup(group1);
+  store_->AddReportingEndpointGroup(group2);
+
+  store_->DeleteReportingEndpointGroup(group1);
+
+  // Close and reopen the database.
+  DestroyStore();
+  CreateStore();
+
+  std::vector<ReportingClient> endpoints;
+  std::vector<CachedReportingEndpointGroup> groups;
+  LoadReportingClients(&endpoints, &groups);
+  ASSERT_EQ(1u, groups.size());
+  EXPECT_EQ(group2.group_key.group_name, groups[0].group_key.group_name);
+
+  store_->DeleteReportingEndpointGroup(group2);
+  DestroyStore();
+  CreateStore();
+
+  groups.clear();
+  LoadReportingClients(&endpoints, &groups);
+  EXPECT_EQ(0u, groups.size());
+}
+
+TEST_F(SQLitePersistentReportingAndNELStoreTest,
+       ReportingEndpointUniquenessConstraint) {
+  CreateStore();
+  InitializeStore();
+  ReportingClient endpoint1 = MakeReportingEndpoint(
+      kOrigin1, kGroupName1, kEndpoint1, 1 /* priority */, 1 /* weight */);
+  ReportingClient endpoint2 = MakeReportingEndpoint(
+      kOrigin1, kGroupName1, kEndpoint1, 2 /* priority */, 2 /* weight */);
+
+  store_->AddReportingEndpoint(endpoint1);
+  // Adding an endpoint with the same origin, group name, and url should trigger
+  // a warning and fail to execute.
+  store_->AddReportingEndpoint(endpoint2);
+
+  DestroyStore();
+  CreateStore();
+
+  std::vector<ReportingClient> endpoints;
+  std::vector<CachedReportingEndpointGroup> groups;
+  LoadReportingClients(&endpoints, &groups);
+  // Only the first endpoint we added should be in the store.
+  ASSERT_EQ(1u, endpoints.size());
+  EXPECT_EQ(endpoint1.group_key.origin, endpoints[0].group_key.origin);
+  EXPECT_EQ(endpoint1.group_key.group_name, endpoints[0].group_key.group_name);
+  EXPECT_EQ(endpoint1.info.url, endpoints[0].info.url);
+  EXPECT_EQ(endpoint1.info.priority, endpoints[0].info.priority);
+  EXPECT_EQ(endpoint1.info.weight, endpoints[0].info.weight);
+}
+
+TEST_F(SQLitePersistentReportingAndNELStoreTest,
+       ReportingEndpointGroupUniquenessConstraint) {
+  CreateStore();
+  InitializeStore();
+  base::Time now = base::Time::Now();
+  CachedReportingEndpointGroup group1 =
+      MakeReportingEndpointGroup(kOrigin1, kGroupName1, now);
+  base::Time time2 = now + base::TimeDelta::FromDays(7);
+  CachedReportingEndpointGroup group2 =
+      MakeReportingEndpointGroup(kOrigin1, kGroupName1, time2);
+  LOG(INFO) << "foo";
+
+  store_->AddReportingEndpointGroup(group1);
+  // Adding an endpoint group with the same origin and group name should trigger
+  // a warning and fail to execute.
+  store_->AddReportingEndpointGroup(group2);
+
+  DestroyStore();
+  CreateStore();
+
+  std::vector<ReportingClient> endpoints;
+  std::vector<CachedReportingEndpointGroup> groups;
+  LoadReportingClients(&endpoints, &groups);
+  // Only the first group we added should be in the store.
+  ASSERT_EQ(1u, groups.size());
+  EXPECT_EQ(group1.group_key.origin, groups[0].group_key.origin);
+  EXPECT_EQ(group1.group_key.group_name, groups[0].group_key.group_name);
+  EXPECT_EQ(group1.include_subdomains, groups[0].include_subdomains);
+  EXPECT_TRUE(WithinOneMicrosecond(group1.expires, groups[0].expires));
+  EXPECT_TRUE(WithinOneMicrosecond(group1.last_used, groups[0].last_used));
+}
+
+TEST_F(SQLitePersistentReportingAndNELStoreTest,
+       CoalesceReportingEndpointOperations) {
+  ReportingClient endpoint =
+      MakeReportingEndpoint(kOrigin1, kGroupName1, kEndpoint1);
+
+  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
+                            base::WaitableEvent::InitialState::NOT_SIGNALED);
+
+  for (const TestCase& testcase : kCoalescingTestcases) {
+    CreateStore();
+    base::RunLoop run_loop;
+    store_->LoadReportingClients(base::BindLambdaForTesting(
+        [&](std::vector<ReportingClient>,
+            std::vector<CachedReportingEndpointGroup>) { run_loop.Quit(); }));
+    run_loop.Run();
+
+    // Wedge the background thread to make sure it doesn't start consuming the
+    // queue.
+    background_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&SQLitePersistentReportingAndNELStoreTest::WaitOnEvent,
+                       base::Unretained(this), &event));
+
+    // Now run the ops, and check how much gets queued.
+    for (const Op op : testcase.operations) {
+      switch (op) {
+        case Op::kAdd:
+          store_->AddReportingEndpoint(endpoint);
+          break;
+
+        case Op::kDelete:
+          store_->DeleteReportingEndpoint(endpoint);
+          break;
+
+        case Op::kUpdate:
+          // Endpoints only have UPDATE_DETAILS, so in this case we use kUpdate
+          // for that.
+          store_->UpdateReportingEndpointDetails(endpoint);
+          break;
+
+        default:
+          NOTREACHED();
+          break;
+      }
+    }
+
+    EXPECT_EQ(testcase.expected_queue_length,
+              store_->GetQueueLengthForTesting());
+
+    event.Signal();
+    RunUntilIdle();
+  }
+}
+
+TEST_F(SQLitePersistentReportingAndNELStoreTest,
+       DontCoalesceUnrelatedReportingEndpoints) {
+  CreateStore();
+  InitializeStore();
+
+  ReportingClient endpoint1 =
+      MakeReportingEndpoint(kOrigin1, kGroupName1, kEndpoint1);
+  ReportingClient endpoint2 =
+      MakeReportingEndpoint(kOrigin2, kGroupName2, kEndpoint2);
+
+  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
+                            base::WaitableEvent::InitialState::NOT_SIGNALED);
+
+  // Wedge the background thread to make sure it doesn't start consuming the
+  // queue.
+  background_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&SQLitePersistentReportingAndNELStoreTest::WaitOnEvent,
+                     base::Unretained(this), &event));
+
+  // Delete on |endpoint2| should not cancel addition of unrelated |endpoint1|.
+  store_->AddReportingEndpoint(endpoint1);
+  store_->DeleteReportingEndpoint(endpoint2);
+  EXPECT_EQ(2u, store_->GetQueueLengthForTesting());
+
+  event.Signal();
+  RunUntilIdle();
+}
+
+TEST_F(SQLitePersistentReportingAndNELStoreTest,
+       CoalesceReportingEndpointGroupOperations) {
+  base::Time now = base::Time::Now();
+  CachedReportingEndpointGroup group =
+      MakeReportingEndpointGroup(kOrigin1, kGroupName1, now);
+
+  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
+                            base::WaitableEvent::InitialState::NOT_SIGNALED);
+
+  for (const TestCase& testcase : kCoalescingTestcases) {
+    CreateStore();
+    base::RunLoop run_loop;
+    store_->LoadReportingClients(base::BindLambdaForTesting(
+        [&](std::vector<ReportingClient>,
+            std::vector<CachedReportingEndpointGroup>) { run_loop.Quit(); }));
+    run_loop.Run();
+
+    // Wedge the background thread to make sure it doesn't start consuming the
+    // queue.
+    background_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&SQLitePersistentReportingAndNELStoreTest::WaitOnEvent,
+                       base::Unretained(this), &event));
+
+    // Now run the ops, and check how much gets queued.
+    for (const Op op : testcase.operations) {
+      switch (op) {
+        case Op::kAdd:
+          store_->AddReportingEndpointGroup(group);
+          break;
+
+        case Op::kDelete:
+          store_->DeleteReportingEndpointGroup(group);
+          break;
+
+        case Op::kUpdate:
+          store_->UpdateReportingEndpointGroupAccessTime(group);
+          break;
+
+        default:
+          NOTREACHED();
+          break;
+      }
+    }
+
+    EXPECT_EQ(testcase.expected_queue_length,
+              store_->GetQueueLengthForTesting());
+
+    event.Signal();
+    RunUntilIdle();
+  }
+
+  // Additional test cases for UPDATE_DETAILS.
+  for (const TestCase& testcase : kCoalescingTestcasesForUpdateDetails) {
+    CreateStore();
+    base::RunLoop run_loop;
+    store_->LoadReportingClients(base::BindLambdaForTesting(
+        [&](std::vector<ReportingClient>,
+            std::vector<CachedReportingEndpointGroup>) { run_loop.Quit(); }));
+    run_loop.Run();
+
+    // Wedge the background thread to make sure it doesn't start consuming the
+    // queue.
+    background_task_runner_->PostTask(
+        FROM_HERE,
+        base::BindOnce(&SQLitePersistentReportingAndNELStoreTest::WaitOnEvent,
+                       base::Unretained(this), &event));
+
+    // Now run the ops, and check how much gets queued.
+    for (const Op op : testcase.operations) {
+      switch (op) {
+        case Op::kAdd:
+          store_->AddReportingEndpointGroup(group);
+          break;
+
+        case Op::kDelete:
+          store_->DeleteReportingEndpointGroup(group);
+          break;
+
+        case Op::kUpdate:
+          store_->UpdateReportingEndpointGroupAccessTime(group);
+          break;
+
+        case Op::kUpdateDetails:
+          store_->UpdateReportingEndpointGroupDetails(group);
+          break;
+      }
+    }
+
+    EXPECT_EQ(testcase.expected_queue_length,
+              store_->GetQueueLengthForTesting());
+
+    event.Signal();
+    RunUntilIdle();
+  }
+}
+
+TEST_F(SQLitePersistentReportingAndNELStoreTest,
+       DontCoalesceUnrelatedReportingEndpointGroups) {
+  CreateStore();
+  InitializeStore();
+
+  base::Time now = base::Time::Now();
+  CachedReportingEndpointGroup group1 =
+      MakeReportingEndpointGroup(kOrigin1, kGroupName1, now);
+  CachedReportingEndpointGroup group2 =
+      MakeReportingEndpointGroup(kOrigin2, kGroupName2, now);
+
+  base::WaitableEvent event(base::WaitableEvent::ResetPolicy::AUTOMATIC,
+                            base::WaitableEvent::InitialState::NOT_SIGNALED);
+
+  // Wedge the background thread to make sure it doesn't start consuming the
+  // queue.
+  background_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&SQLitePersistentReportingAndNELStoreTest::WaitOnEvent,
+                     base::Unretained(this), &event));
+
+  // Delete on |group2| should not cancel addition of unrelated |group2|.
+  store_->AddReportingEndpointGroup(group1);
+  store_->DeleteReportingEndpointGroup(group2);
+  EXPECT_EQ(2u, store_->GetQueueLengthForTesting());
+
+  event.Signal();
+  RunUntilIdle();
+}
+
 }  // namespace net
diff --git a/net/http/http_response_headers.cc b/net/http/http_response_headers.cc
index 6e7e753..3910885 100644
--- a/net/http/http_response_headers.cc
+++ b/net/http/http_response_headers.cc
@@ -774,7 +774,8 @@
                                     std::string::const_iterator values_end) {
   // If the header can be coalesced, then we should split it up.
   if (values_begin == values_end ||
-      HttpUtil::IsNonCoalescingHeader(name_begin, name_end)) {
+      HttpUtil::IsNonCoalescingHeader(
+          base::StringPiece(name_begin, name_end))) {
     AddToParsed(name_begin, name_end, values_begin, values_end);
   } else {
     HttpUtil::ValuesIterator it(values_begin, values_end, ',',
diff --git a/net/http/http_security_headers.cc b/net/http/http_security_headers.cc
index 91c16f9..156e67f 100644
--- a/net/http/http_security_headers.cc
+++ b/net/http/http_security_headers.cc
@@ -93,16 +93,17 @@
   tokenizer.set_quote_chars("\"");
   std::string unquoted;
   while (tokenizer.GetNext()) {
-    DCHECK(!tokenizer.token_is_delim() || tokenizer.token().length() == 1);
+    DCHECK(!tokenizer.token_is_delim() ||
+           tokenizer.token_piece().length() == 1);
     switch (state) {
       case START:
       case DIRECTIVE_END:
         if (base::IsAsciiWhitespace(*tokenizer.token_begin()))
           continue;
-        if (base::LowerCaseEqualsASCII(tokenizer.token(), "max-age")) {
+        if (base::LowerCaseEqualsASCII(tokenizer.token_piece(), "max-age")) {
           state = AFTER_MAX_AGE_LABEL;
           max_age_observed++;
-        } else if (base::LowerCaseEqualsASCII(tokenizer.token(),
+        } else if (base::LowerCaseEqualsASCII(tokenizer.token_piece(),
                                               "includesubdomains")) {
           state = AFTER_INCLUDE_SUBDOMAINS;
           include_subdomains_observed++;
@@ -124,7 +125,7 @@
       case AFTER_MAX_AGE_EQUALS:
         if (base::IsAsciiWhitespace(*tokenizer.token_begin()))
           continue;
-        unquoted = HttpUtil::Unquote(tokenizer.token());
+        unquoted = HttpUtil::Unquote(tokenizer.token_piece());
         if (!MaxAgeToLimitedInt(unquoted, kMaxHSTSAgeSecs, &max_age_candidate))
           return false;
         state = AFTER_MAX_AGE;
diff --git a/net/http/http_util.cc b/net/http/http_util.cc
index 5da26420..0dc2c464 100644
--- a/net/http/http_util.cc
+++ b/net/http/http_util.cc
@@ -461,8 +461,7 @@
 }
 
 // static
-bool HttpUtil::IsNonCoalescingHeader(std::string::const_iterator name_begin,
-                                     std::string::const_iterator name_end) {
+bool HttpUtil::IsNonCoalescingHeader(base::StringPiece name) {
   // NOTE: "set-cookie2" headers do not support expires attributes, so we don't
   // have to list them here.
   const char* const kNonCoalescingHeaders[] = {
@@ -482,8 +481,7 @@
   };
 
   for (const char* header : kNonCoalescingHeaders) {
-    if (base::LowerCaseEqualsASCII(base::StringPiece(name_begin, name_end),
-                                   header)) {
+    if (base::LowerCaseEqualsASCII(name, header)) {
       return true;
     }
   }
@@ -544,31 +542,26 @@
   return c == '"';
 }
 
-bool UnquoteImpl(std::string::const_iterator begin,
-                 std::string::const_iterator end,
-                 bool strict_quotes,
-                 std::string* out) {
-  // Empty string
-  if (begin == end)
+bool UnquoteImpl(base::StringPiece str, bool strict_quotes, std::string* out) {
+  if (str.empty())
     return false;
 
   // Nothing to unquote.
-  if (!IsQuote(*begin))
+  if (!IsQuote(str[0]))
     return false;
 
   // No terminal quote mark.
-  if (end - begin < 2 || *begin != *(end - 1))
+  if (str.size() < 2 || str.front() != str.back())
     return false;
 
   // Strip quotemarks
-  ++begin;
-  --end;
+  str.remove_prefix(1);
+  str.remove_suffix(1);
 
   // Unescape quoted-pair (defined in RFC 2616 section 2.2)
   bool prev_escape = false;
   std::string unescaped;
-  for (; begin != end; ++begin) {
-    char c = *begin;
+  for (char c : str) {
     if (c == '\\' && !prev_escape) {
       prev_escape = true;
       continue;
@@ -589,45 +582,29 @@
 
 }  // anonymous namespace
 
-std::string HttpUtil::Unquote(std::string::const_iterator begin,
-                              std::string::const_iterator end) {
+// static
+std::string HttpUtil::Unquote(base::StringPiece str) {
   std::string result;
-  if (!UnquoteImpl(begin, end, false, &result))
-    return std::string(begin, end);
+  if (!UnquoteImpl(str, false, &result))
+    return str.as_string();
 
   return result;
 }
 
 // static
-std::string HttpUtil::Unquote(const std::string& str) {
-  return Unquote(str.begin(), str.end());
+bool HttpUtil::StrictUnquote(base::StringPiece str, std::string* out) {
+  return UnquoteImpl(str, true, out);
 }
 
 // static
-bool HttpUtil::StrictUnquote(std::string::const_iterator begin,
-                             std::string::const_iterator end,
-                             std::string* out) {
-  return UnquoteImpl(begin, end, true, out);
-}
-
-// static
-bool HttpUtil::StrictUnquote(const std::string& str, std::string* out) {
-  return StrictUnquote(str.begin(), str.end(), out);
-}
-
-// static
-std::string HttpUtil::Quote(const std::string& str) {
+std::string HttpUtil::Quote(base::StringPiece str) {
   std::string escaped;
   escaped.reserve(2 + str.size());
 
-  std::string::const_iterator begin = str.begin();
-  std::string::const_iterator end = str.end();
-
   // Esape any backslashes or quotemarks within the string, and
   // then surround with quotes.
   escaped.push_back('"');
-  for (; begin != end; ++begin) {
-    char c = *begin;
+  for (char c : str) {
     if (c == '"' || c == '\\')
       escaped.push_back('\\');
     escaped.push_back(c);
@@ -1123,7 +1100,8 @@
     value_is_quoted_ = true;
 
     if (strict_quotes_) {
-      if (!HttpUtil::StrictUnquote(value_begin_, value_end_, &unquoted_value_))
+      if (!HttpUtil::StrictUnquote(base::StringPiece(value_begin_, value_end_),
+                                   &unquoted_value_))
         return valid_ = false;
       return true;
     }
@@ -1139,7 +1117,8 @@
       ++value_begin_;  // Gracefully recover from mismatching quotes.
     } else {
       // Do not store iterators into this. See declaration of unquoted_value_.
-      unquoted_value_ = HttpUtil::Unquote(value_begin_, value_end_);
+      unquoted_value_ =
+          HttpUtil::Unquote(base::StringPiece(value_begin_, value_end_));
     }
   }
 
diff --git a/net/http/http_util.h b/net/http/http_util.h
index cfd79ca3..c45b41a 100644
--- a/net/http/http_util.h
+++ b/net/http/http_util.h
@@ -107,11 +107,7 @@
   // Multiple occurances of some headers cannot be coalesced into a comma-
   // separated list since their values are (or contain) unquoted HTTP-date
   // values, which may contain a comma (see RFC 2616 section 3.3.1).
-  static bool IsNonCoalescingHeader(std::string::const_iterator name_begin,
-                                    std::string::const_iterator name_end);
-  static bool IsNonCoalescingHeader(const std::string& name) {
-    return IsNonCoalescingHeader(name.begin(), name.end());
-  }
+  static bool IsNonCoalescingHeader(base::StringPiece name);
 
   // Return true if the character is HTTP "linear white space" (SP | HT).
   // This definition corresponds with the HTTP_LWS macro, and does not match
@@ -136,26 +132,17 @@
   // Unquote() strips the surrounding quotemarks off a string, and unescapes
   // any quoted-pair to obtain the value contained by the quoted-string.
   // If the input is not quoted, then it works like the identity function.
-  static std::string Unquote(std::string::const_iterator begin,
-                             std::string::const_iterator end);
-
-  // Same as above.
-  static std::string Unquote(const std::string& str);
+  static std::string Unquote(base::StringPiece str);
 
   // Similar to Unquote(), but additionally validates that the string being
   // unescaped actually is a valid quoted string. Returns false for an empty
   // string, a string without quotes, a string with mismatched quotes, and
   // a string with unescaped embeded quotes.
-  static bool StrictUnquote(std::string::const_iterator begin,
-                            std::string::const_iterator end,
-                            std::string* out) WARN_UNUSED_RESULT;
-
-  // Same as above.
-  static bool StrictUnquote(const std::string& str,
+  static bool StrictUnquote(base::StringPiece str,
                             std::string* out) WARN_UNUSED_RESULT;
 
   // The reverse of Unquote() -- escapes and surrounds with "
-  static std::string Quote(const std::string& str);
+  static std::string Quote(base::StringPiece str);
 
   // Returns the start of the status line, or std::string::npos if no status
   // line was found. This allows for 4 bytes of junk to precede the status line
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index 2ddb298..92197d7c 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -657,6 +657,7 @@
   HostResolver::ResolveHostParameters parameters;
   parameters.initial_priority = priority_;
   if (race_stale_dns_on_connection_) {
+    // Allow host resolver to return stale result immediately.
     parameters.cache_usage =
         HostResolver::ResolveHostParameters::CacheUsage::STALE_ALLOWED;
   }
@@ -664,6 +665,8 @@
       host_resolver_->CreateRequest(key_.destination(), net_log_, parameters);
   // Unretained is safe because |this| owns the request, ensuring cancellation
   // on destruction.
+  // When race_stale_dns_on_connection_ is on, this request will query for stale
+  // cache if no fresh host result is available.
   int rv = resolve_host_request_->Start(base::BindOnce(
       &QuicStreamFactory::Job::OnResolveHostComplete, base::Unretained(this)));
 
@@ -684,6 +687,7 @@
       host_resolver_->CreateRequest(key_.destination(), net_log_, parameters);
   // Unretained is safe because |this| owns the request, ensuring cancellation
   // on destruction.
+  // This request will only query fresh host resolution.
   int fresh_rv = fresh_resolve_host_request_->Start(base::BindOnce(
       &QuicStreamFactory::Job::OnResolveHostComplete, base::Unretained(this)));
   if (fresh_rv != ERR_IO_PENDING) {
@@ -693,6 +697,10 @@
     return rv;
   }
 
+  // No fresh host resolution is available at this time, but there is available
+  // stale result. End time for stale host resolution is recorded and connection
+  // from stale host will be tried.
+  dns_resolution_end_time_ = base::TimeTicks().Now();
   io_state_ = STATE_CONNECT;
   LogStaleHostRacing(true);
   return OK;
@@ -720,6 +728,7 @@
 }
 
 int QuicStreamFactory::Job::DoConnect() {
+  DCHECK(dns_resolution_end_time_ != base::TimeTicks());
   io_state_ = STATE_CONNECT_COMPLETE;
   bool require_confirmation = was_alternative_service_recently_broken_;
   net_log_.BeginEvent(
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index 475bd3a..b402896 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -9878,7 +9878,8 @@
 }
 
 // With dns race experiment on, dns resolve async, stale used and connection
-// return error, then dns matches
+// return error, then dns matches.
+// This serves as a regression test for crbug.com/956374.
 TEST_P(QuicStreamFactoryTest, ResultAfterDNSRaceStaleErrorDNSMatches) {
   test_params_.quic_race_stale_dns_on_connection = true;
   host_resolver_ = std::make_unique<MockCachingHostResolver>();
diff --git a/net/reporting/reporting_cache.h b/net/reporting/reporting_cache.h
index 49100b8..20114af7 100644
--- a/net/reporting/reporting_cache.h
+++ b/net/reporting/reporting_cache.h
@@ -224,10 +224,42 @@
 // Persistent storage for Reporting reports and clients.
 class NET_EXPORT ReportingCache::PersistentReportingStore {
  public:
+  using ReportingClientsLoadedCallback =
+      base::OnceCallback<void(std::vector<ReportingClient>,
+                              std::vector<CachedReportingEndpointGroup>)>;
+
   PersistentReportingStore() = default;
   virtual ~PersistentReportingStore() = default;
 
-  // TODO(chlily): methods to load, add, update, delete, etc. will be added.
+  // Initializes the store and retrieves stored endpoints and endpoint groups.
+  // Called only once at startup.
+  virtual void LoadReportingClients(
+      ReportingClientsLoadedCallback loaded_callback) = 0;
+
+  // Adds an endpoint to the store.
+  virtual void AddReportingEndpoint(const ReportingClient& endpoint) = 0;
+  // Adds an endpoint group to the store.
+  virtual void AddReportingEndpointGroup(
+      const CachedReportingEndpointGroup& group) = 0;
+
+  // Updates the access time of an endpoint group in the store.
+  virtual void UpdateReportingEndpointGroupAccessTime(
+      const CachedReportingEndpointGroup& group) = 0;
+
+  // Updates the details of an endpoint in the store.
+  virtual void UpdateReportingEndpointDetails(
+      const ReportingClient& endpoint) = 0;
+  // Updates the details of an endpoint group in the store.
+  virtual void UpdateReportingEndpointGroupDetails(
+      const CachedReportingEndpointGroup& group) = 0;
+
+  // Deletes an endpoint from the store.
+  virtual void DeleteReportingEndpoint(const ReportingClient& endpoint) = 0;
+  // Deletes an endpoint group from the store.
+  virtual void DeleteReportingEndpointGroup(
+      const CachedReportingEndpointGroup& group) = 0;
+
+  // TODO(chlily): methods to load, add, and delete reports will be added.
 
   // Flushes the store.
   virtual void Flush() = 0;
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc
index d6b1d9d..b140b29 100644
--- a/pdf/pdfium/pdfium_engine.cc
+++ b/pdf/pdfium/pdfium_engine.cc
@@ -1734,9 +1734,8 @@
   if (selection_.empty())
     return false;
 
-  PDFiumRange& last_selection = selection_.back();
-  const int last_page_index = last_selection.page_index();
-  const int last_char_index = last_selection.char_index();
+  const int last_page_index = selection_.back().page_index();
+  const int last_char_index = selection_.back().char_index();
   if (last_page_index == page_index) {
     // Selecting within a page.
     int count = char_index - last_char_index;
@@ -1746,10 +1745,15 @@
     } else {
       --count;
     }
-    last_selection.SetCharCount(count);
+    selection_.back().SetCharCount(count);
   } else if (last_page_index < page_index) {
     // Selecting into the next page.
 
+    // Save the current last selection for use below.
+    // Warning: Do not use references / pointers into |selection_|, as the code
+    // below can modify |selection_| and invalidate those references / pointers.
+    const size_t last_selection_index = selection_.size() - 1;
+
     // First make sure that there are no gaps in selection, i.e. if mousedown on
     // page one but we only get mousemove over page three, we want page two.
     for (int i = last_page_index + 1; i < page_index; ++i) {
@@ -1758,14 +1762,14 @@
     }
 
     int count = pages_[last_page_index]->GetCharCount();
-    last_selection.SetCharCount(count - last_char_index);
+    selection_[last_selection_index].SetCharCount(count - last_char_index);
     selection_.push_back(PDFiumRange(pages_[page_index].get(), 0, char_index));
   } else {
     // Selecting into the previous page.
     // The selection's char_index is 0-based, so the character count is one
     // more than the index. The character count needs to be negative to
     // indicate a backwards selection.
-    last_selection.SetCharCount(-last_char_index - 1);
+    selection_.back().SetCharCount(-last_char_index - 1);
 
     // First make sure that there are no gaps in selection, i.e. if mousedown on
     // page three but we only get mousemove over page one, we want page two.
diff --git a/remoting/client/chromoting_client.cc b/remoting/client/chromoting_client.cc
index 707abf31..65c167d1 100644
--- a/remoting/client/chromoting_client.cc
+++ b/remoting/client/chromoting_client.cc
@@ -89,7 +89,8 @@
 #endif
     } else {
       DCHECK(protocol_config_->ice_supported());
-      connection_.reset(new protocol::IceConnectionToHost());
+      // TODO(yuweih): Pass true for FTL connection.
+      connection_.reset(new protocol::IceConnectionToHost(false));
     }
   }
   connection_->set_client_stub(this);
diff --git a/remoting/host/chromoting_host.cc b/remoting/host/chromoting_host.cc
index dcbfb2c..005b3741 100644
--- a/remoting/host/chromoting_host.cc
+++ b/remoting/host/chromoting_host.cc
@@ -28,6 +28,7 @@
 #include "remoting/protocol/native_ip_synthesizer.h"
 #include "remoting/protocol/transport_context.h"
 #include "remoting/protocol/webrtc_connection_to_client.h"
+#include "remoting/signaling/signaling_address.h"
 
 using remoting::protocol::ConnectionToClient;
 using remoting::protocol::InputStub;
@@ -243,9 +244,11 @@
         base::WrapUnique(session), transport_context_,
         video_encode_task_runner_, audio_task_runner_));
   } else {
+    SignalingAddress address(session->jid());
+    bool use_turn_api = address.channel() == SignalingAddress::Channel::FTL;
     connection.reset(new protocol::IceConnectionToClient(
         base::WrapUnique(session), transport_context_,
-        video_encode_task_runner_, audio_task_runner_));
+        video_encode_task_runner_, audio_task_runner_, use_turn_api));
   }
 
   // Create a ClientSession object.
diff --git a/remoting/protocol/connection_unittest.cc b/remoting/protocol/connection_unittest.cc
index 5dade5d2..5ae3ca11 100644
--- a/remoting/protocol/connection_unittest.cc
+++ b/remoting/protocol/connection_unittest.cc
@@ -300,8 +300,8 @@
           base::WrapUnique(host_session_),
           TransportContext::ForTests(protocol::TransportRole::SERVER),
           scoped_task_environment_.GetMainThreadTaskRunner(),
-          scoped_task_environment_.GetMainThreadTaskRunner()));
-      client_connection_.reset(new IceConnectionToHost());
+          scoped_task_environment_.GetMainThreadTaskRunner(), false));
+      client_connection_.reset(new IceConnectionToHost(false));
     }
 
     // Setup host side.
diff --git a/remoting/protocol/ice_connection_to_client.cc b/remoting/protocol/ice_connection_to_client.cc
index 6402e7c..6135186a 100644
--- a/remoting/protocol/ice_connection_to_client.cc
+++ b/remoting/protocol/ice_connection_to_client.cc
@@ -54,12 +54,13 @@
     std::unique_ptr<protocol::Session> session,
     scoped_refptr<TransportContext> transport_context,
     scoped_refptr<base::SingleThreadTaskRunner> video_encode_task_runner,
-    scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner)
+    scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
+    bool use_turn_api)
     : event_handler_(nullptr),
       session_(std::move(session)),
       video_encode_task_runner_(std::move(video_encode_task_runner)),
       audio_task_runner_(std::move(audio_task_runner)),
-      transport_(transport_context, this),
+      transport_(transport_context, this, use_turn_api),
       control_dispatcher_(new HostControlDispatcher()),
       event_dispatcher_(new HostEventDispatcher()),
       video_dispatcher_(new HostVideoDispatcher()) {
diff --git a/remoting/protocol/ice_connection_to_client.h b/remoting/protocol/ice_connection_to_client.h
index 819645b4..37f1c63 100644
--- a/remoting/protocol/ice_connection_to_client.h
+++ b/remoting/protocol/ice_connection_to_client.h
@@ -39,7 +39,8 @@
       std::unique_ptr<Session> session,
       scoped_refptr<TransportContext> transport_context,
       scoped_refptr<base::SingleThreadTaskRunner> video_encode_task_runner,
-      scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner);
+      scoped_refptr<base::SingleThreadTaskRunner> audio_task_runner,
+      bool use_turn_api);
   ~IceConnectionToClient() override;
 
   // ConnectionToClient interface.
diff --git a/remoting/protocol/ice_connection_to_host.cc b/remoting/protocol/ice_connection_to_host.cc
index 32332c3..a0bfe6ad 100644
--- a/remoting/protocol/ice_connection_to_host.cc
+++ b/remoting/protocol/ice_connection_to_host.cc
@@ -27,7 +27,9 @@
 namespace remoting {
 namespace protocol {
 
-IceConnectionToHost::IceConnectionToHost() = default;
+IceConnectionToHost::IceConnectionToHost(bool use_turn_api)
+    : use_turn_api_(use_turn_api) {}
+
 IceConnectionToHost::~IceConnectionToHost() {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
@@ -40,7 +42,7 @@
   DCHECK(clipboard_stub_);
   DCHECK(video_renderer_);
 
-  transport_.reset(new IceTransport(transport_context, this));
+  transport_.reset(new IceTransport(transport_context, this, use_turn_api_));
 
   session_ = std::move(session);
   session_->SetEventHandler(this);
diff --git a/remoting/protocol/ice_connection_to_host.h b/remoting/protocol/ice_connection_to_host.h
index bdb5da4..487eb42 100644
--- a/remoting/protocol/ice_connection_to_host.h
+++ b/remoting/protocol/ice_connection_to_host.h
@@ -39,7 +39,7 @@
                             public IceTransport::EventHandler,
                             public ChannelDispatcherBase::EventHandler {
  public:
-  IceConnectionToHost();
+  IceConnectionToHost(bool use_turn_api);
   ~IceConnectionToHost() override;
 
   // ConnectionToHost interface.
@@ -105,6 +105,10 @@
   State state_ = INITIALIZING;
   ErrorCode error_ = OK;
 
+  // If this is true, ICE connection will use TURN API instead of the gTalk TURN
+  // services to allocate relay sessions.
+  bool use_turn_api_;
+
  private:
   SEQUENCE_CHECKER(sequence_checker_);
 
diff --git a/remoting/protocol/ice_transport.cc b/remoting/protocol/ice_transport.cc
index c44a311..dff0913 100644
--- a/remoting/protocol/ice_transport.cc
+++ b/remoting/protocol/ice_transport.cc
@@ -26,11 +26,14 @@
 static const char kMuxChannelName[] = "mux";
 
 IceTransport::IceTransport(scoped_refptr<TransportContext> transport_context,
-                           EventHandler* event_handler)
+                           EventHandler* event_handler,
+                           bool use_turn_api)
     : transport_context_(transport_context),
       event_handler_(event_handler),
       weak_factory_(this) {
-  transport_context_->set_relay_mode(TransportContext::RelayMode::GTURN);
+  transport_context_->set_relay_mode(use_turn_api
+                                         ? TransportContext::RelayMode::TURN
+                                         : TransportContext::RelayMode::GTURN);
   transport_context->Prepare();
 }
 
diff --git a/remoting/protocol/ice_transport.h b/remoting/protocol/ice_transport.h
index ae378b6..58a749d 100644
--- a/remoting/protocol/ice_transport.h
+++ b/remoting/protocol/ice_transport.h
@@ -39,8 +39,12 @@
   };
 
   // |transport_context| must outlive the session.
+  // If |use_turn_api| is true, ICE connection will use TURN API instead of the
+  // gTalk TURN services to allocate relay sessions.
+  // TODO(yuweih): Remove |use_turn_api| once the XMPP->FTL transition is done.
   IceTransport(scoped_refptr<TransportContext> transport_context,
-               EventHandler* event_handler);
+               EventHandler* event_handler,
+               bool use_turn_api);
   ~IceTransport() override;
 
   MessageChannelFactory* GetChannelFactory();
diff --git a/remoting/protocol/ice_transport_unittest.cc b/remoting/protocol/ice_transport_unittest.cc
index 98698cd..4571284 100644
--- a/remoting/protocol/ice_transport_unittest.cc
+++ b/remoting/protocol/ice_transport_unittest.cc
@@ -118,7 +118,7 @@
         new TransportContext(nullptr,
                              std::make_unique<ChromiumPortAllocatorFactory>(),
                              nullptr, network_settings_, TransportRole::SERVER),
-        &host_event_handler_));
+        &host_event_handler_, false));
     if (!host_authenticator_) {
       host_authenticator_.reset(
           new FakeAuthenticator(FakeAuthenticator::ACCEPT));
@@ -128,7 +128,7 @@
         new TransportContext(nullptr,
                              std::make_unique<ChromiumPortAllocatorFactory>(),
                              nullptr, network_settings_, TransportRole::CLIENT),
-        &client_event_handler_));
+        &client_event_handler_, false));
     if (!client_authenticator_) {
       client_authenticator_.reset(
           new FakeAuthenticator(FakeAuthenticator::ACCEPT));
diff --git a/remoting/resources/remoting_strings_hi.xtb b/remoting/resources/remoting_strings_hi.xtb
index eb5ca69..3b7c3827 100644
--- a/remoting/resources/remoting_strings_hi.xtb
+++ b/remoting/resources/remoting_strings_hi.xtb
@@ -6,7 +6,7 @@
 <translation id="1050693411695664090">खराब</translation>
 <translation id="1152528166145813711">चुनें…</translation>
 <translation id="1199593201721843963">दूर से किए गए कनेक्‍शन को बंद करें</translation>
-<translation id="1291443878853470558">यदि आप इस कंप्यूटर पर एक्सेस के लिए Chromoting का इस्तेमाल करना चाहते हैं, तो आपको रिमोट (दूर के कोई) कनेक्शन चालू करने होंगे.</translation>
+<translation id="1291443878853470558">अगर आप इस कंप्यूटर पर एक्सेस के लिए Chromoting का इस्तेमाल करना चाहते हैं, तो आपको रिमोट (दूर के कोई) कनेक्शन चालू करने होंगे.</translation>
 <translation id="1297009705180977556"><ph name="HOSTNAME" /> से कनेक्ट करने में गड़बड़ी</translation>
 <translation id="1300633907480909701">अपने Android डिवाइस से सुरक्षित रूप से अपने कंप्यूटर एक्सेस करें.
 
diff --git a/remoting/resources/remoting_strings_ta.xtb b/remoting/resources/remoting_strings_ta.xtb
index c245074b..e3abeaf 100644
--- a/remoting/resources/remoting_strings_ta.xtb
+++ b/remoting/resources/remoting_strings_ta.xtb
@@ -180,7 +180,7 @@
 PC</translation>
 <translation id="4736223761657662401">இணைப்பு வரலாறு</translation>
 <translation id="4741792197137897469">அங்கீகரிக்க முடியவில்லை. Chrome இல் மீண்டும் உள்நுழையவும்.</translation>
-<translation id="477305884757156764">பயன்பாடு மிகவும் மெதுவாக இயங்குகிறது.</translation>
+<translation id="477305884757156764">ஆப்ஸ் மிகவும் மெதுவாக இயங்குகிறது.</translation>
 <translation id="4784508858340177375">X சேவையகம் சிதைந்தது அல்லது தொடங்க முடியவில்லை.</translation>
 <translation id="4795786176190567663">இந்தச் செயலை செய்வதற்கான அனுமதி உங்களுக்கு இல்லை.</translation>
 <translation id="4798680868612952294">மவுஸ் விருப்பங்கள்</translation>
@@ -212,7 +212,7 @@
 <translation id="5363265567587775042">நீங்கள் அணுக விரும்பும் கணினியின் பயனரிடம், “<ph name="SHARE" />”ஐக் கிளிக் செய்து அணுகல் குறியீட்டை அளிக்கும்படி கேட்கவும்.</translation>
 <translation id="5379087427956679853">இணையத்தில் உங்கள் கணினியைப் பாதுகாப்பாக பகிர Chrome தொலைநிலை டெஸ்க்டாப் அனுமதிக்கிறது. இரு பயனர்களும் Chrome தொலைநிலை டெஸ்க்டாப் பயன்பாட்டில் இயக்க வேண்டும், அதை <ph name="URL" /> இல் காணலாம்.</translation>
 <translation id="5397086374758643919">Chrome தொலைநிலை டெஸ்க்டாப் ஹோஸ்ட் நிறுவல்நீக்கி</translation>
-<translation id="5419185025274123272">பயன்பாட்டை மீட்டமைக்க முடியவில்லை. தொடர்ந்து நீங்கள் பிழைத் தொடர்பான புகாரை அனுப்பலாம்.</translation>
+<translation id="5419185025274123272">ஆப்ஸை மீட்டமைக்க முடியவில்லை. தொடர்ந்து நீங்கள் பிழைத் தொடர்பான புகாரை அனுப்பலாம்.</translation>
 <translation id="5419418238395129586">கடைசியாக ஆன்லைனில் இருந்தது: <ph name="DATE" /></translation>
 <translation id="544077782045763683">ஹோஸ்ட் இயங்கவில்லை.</translation>
 <translation id="5510035215749041527">இப்போது துண்டிக்கவும்</translation>
@@ -230,7 +230,7 @@
 <translation id="5841343754884244200">திரை விருப்பங்கள்</translation>
 <translation id="5843054235973879827">இது ஏன் பாதுகாப்பானது?</translation>
 <translation id="5859141382851488196">புதிய சாளரம்...</translation>
-<translation id="6011539954251327702">உங்கள் கணினியை இணையத்தில் பாதுகாப்பாக பகிர குரோமோட்டிங் அனுமதிக்கும். இரு பயனர்களும் குரோமோட்டிங் பயன்பாட்டை இயக்க வேண்டும். அதை <ph name="URL" /> இல் காணலாம்.</translation>
+<translation id="6011539954251327702">உங்கள் கணினியை இணையத்தில் பாதுகாப்பாக பகிர குரோமோட்டிங் அனுமதிக்கும். இரு பயனர்களும் குரோமோட்டிங் ஆப்ஸை இயக்க வேண்டும். அதை <ph name="URL" /> இல் காணலாம்.</translation>
 <translation id="6033507038939587647">விசைப்பலகை விருப்பங்கள்</translation>
 <translation id="6040143037577758943">மூடு</translation>
 <translation id="6062854958530969723">ஹோஸ்ட் துவக்கம் தோல்வியடைந்தது.</translation>
@@ -258,7 +258,7 @@
 <translation id="6541219117979389420">உங்கள் அடையாளம் (மின்னஞ்சல் முகவரி) மற்றும் Google இயக்ககத்தில் உள்ள கோப்புகள் மற்றும் கோப்புறைகளின் பெயர்கள் மற்றும் பண்புகள் உள்ளிட்ட, தனிப்பட்ட தகவலை பயன்பாட்டுப் பதிவுகள் உள்ளடக்கலாம்.</translation>
 <translation id="6542902059648396432">சிக்கலைப் புகாரளி...</translation>
 <translation id="6550675742724504774">விருப்பத்தேர்வுகள்</translation>
-<translation id="6570205395680337606">பயன்பாட்டை மீட்டமைக்கவும். சேமிக்காதப் பணியை இழப்பீர்கள்.</translation>
+<translation id="6570205395680337606">ஆப்ஸை மீட்டமைக்கவும். சேமிக்காதப் பணியை இழப்பீர்கள்.</translation>
 <translation id="6583902294974160967">ஆதரவு</translation>
 <translation id="6612717000975622067">Ctrl-Alt-Del ஐ அனுப்பு</translation>
 <translation id="6654753848497929428">பகிர்</translation>
@@ -307,7 +307,7 @@
 <translation id="7810127880729796595">புள்ளிவிவரங்களைக் காட்டு (இணைப்பு: <ph name="QUALITY" />)</translation>
 <translation id="7836926030608666805">தேவையான சில உறுப்புகள் காணவில்லை. Chrome இன் சமீபத்திய பதிப்பைத் தான் இயக்குகிறீர்கள் என்பதை உறுதிசெய்து மீண்டும் முயற்சிக்கவும்.</translation>
 <translation id="7868137160098754906">தொலைநிலைக் கணினிக்கான உங்கள் PIN ஐ உள்ளிடவும்.</translation>
-<translation id="7869445566579231750">இந்தப் பயன்பாட்டை இயக்குவதற்கான அனுமதி உங்களுக்கு இல்லை.</translation>
+<translation id="7869445566579231750">இந்த ஆப்ஸை இயக்குவதற்கான அனுமதி உங்களுக்கு இல்லை.</translation>
 <translation id="7895403300744144251">தொலைநிலைக் கணினியில் உள்ள பாதுகாப்புக் கொள்கைகள், உங்கள் கணக்கிலிருந்து இணைப்புகளை அனுமதிக்காது.</translation>
 <translation id="7936528439960309876">வலப்புறம் டாக் செய்</translation>
 <translation id="7948001860594368197">திரை விருப்பங்கள்</translation>
diff --git a/remoting/test/fake_ice_connection.cc b/remoting/test/fake_ice_connection.cc
index 2602dc3..4317ea1ef 100644
--- a/remoting/test/fake_ice_connection.cc
+++ b/remoting/test/fake_ice_connection.cc
@@ -16,7 +16,7 @@
     scoped_refptr<protocol::TransportContext> transport_context,
     base::OnceClosure on_closed) {
   transport_ =
-      std::make_unique<protocol::IceTransport>(transport_context, this);
+      std::make_unique<protocol::IceTransport>(transport_context, this, true);
   on_closed_ = std::move(on_closed);
   if (transport_context->role() == protocol::TransportRole::CLIENT) {
     control_dispatcher_ = std::make_unique<protocol::ClientControlDispatcher>();
diff --git a/remoting/test/ftl_signaling_playground.cc b/remoting/test/ftl_signaling_playground.cc
index 3ff77b23..b680845 100644
--- a/remoting/test/ftl_signaling_playground.cc
+++ b/remoting/test/ftl_signaling_playground.cc
@@ -256,8 +256,6 @@
       std::make_unique<ChromiumUrlRequestFactory>(
           url_loader_factory_owner_->GetURLLoaderFactory()),
       network_settings, transport_role_);
-  transport_context->set_relay_mode(
-      protocol::TransportContext::RelayMode::TURN);
   transport_context->set_ice_config_url(
       ServiceUrls::GetInstance()->ice_config_url(), token_getter_.get());
   auto close_callback =
diff --git a/services/resource_coordinator/public/cpp/BUILD.gn b/services/resource_coordinator/public/cpp/BUILD.gn
index dcc3447b..287c36e 100644
--- a/services/resource_coordinator/public/cpp/BUILD.gn
+++ b/services/resource_coordinator/public/cpp/BUILD.gn
@@ -2,23 +2,6 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-component("resource_coordinator_cpp_base") {
-  sources = [
-    "coordination_unit_id.cc",
-    "coordination_unit_id.h",
-    "coordination_unit_types.h",
-  ]
-
-  configs += [ "//build/config/compiler:wexit_time_destructors" ]
-
-  defines = [ "IS_SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_BASE_IMPL" ]
-
-  deps = [
-    "//base",
-    "//third_party/smhasher:cityhash",
-  ]
-}
-
 component("resource_coordinator_cpp_features") {
   sources = [
     "resource_coordinator_features.cc",
@@ -35,7 +18,6 @@
 # TODO(siggi): Remove this target and redirect users to specific dependencies.
 source_set("resource_coordinator_cpp") {
   public_deps = [
-    ":resource_coordinator_cpp_base",
     ":resource_coordinator_cpp_features",
     "//base",
     "//mojo/public/cpp/bindings",
diff --git a/services/resource_coordinator/public/cpp/coordination_unit.typemap b/services/resource_coordinator/public/cpp/coordination_unit.typemap
deleted file mode 100644
index 4ba96ad..0000000
--- a/services/resource_coordinator/public/cpp/coordination_unit.typemap
+++ /dev/null
@@ -1,25 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-mojom = "//services/resource_coordinator/public/mojom/coordination_unit.mojom"
-
-public_headers = [
-  "//services/resource_coordinator/public/cpp/coordination_unit_id.h",
-  "//services/resource_coordinator/public/cpp/coordination_unit_types.h",
-]
-traits_headers = [
-  "//services/resource_coordinator/public/cpp/coordination_unit_mojom_traits.h",
-]
-sources = [
-  "//services/resource_coordinator/public/cpp/coordination_unit_mojom_traits.cc",
-  "//services/resource_coordinator/public/cpp/coordination_unit_mojom_traits.h",
-]
-public_deps = [
-  "//services/resource_coordinator/public/cpp:resource_coordinator_cpp_base",
-]
-
-type_mappings = [
-  "resource_coordinator.mojom.CoordinationUnitType=::resource_coordinator::CoordinationUnitType",
-  "resource_coordinator.mojom.CoordinationUnitID=::resource_coordinator::CoordinationUnitID",
-]
diff --git a/services/resource_coordinator/public/cpp/coordination_unit_id.cc b/services/resource_coordinator/public/cpp/coordination_unit_id.cc
deleted file mode 100644
index 8a01a50c..0000000
--- a/services/resource_coordinator/public/cpp/coordination_unit_id.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/resource_coordinator/public/cpp/coordination_unit_id.h"
-
-#include "base/numerics/safe_conversions.h"
-#include "base/unguessable_token.h"
-#include "third_party/smhasher/src/City.h"
-
-namespace resource_coordinator {
-
-namespace {
-
-uint64_t CreateCityHash64(const std::string& id) {
-  DCHECK(base::IsValueInRangeForNumericType<int>(id.size()));
-
-  return CityHash64(&id.front(), static_cast<int>(id.size()));
-}
-
-}  // namespace
-
-CoordinationUnitID::CoordinationUnitID()
-    : id(0), type(CoordinationUnitType::kInvalidType) {}
-
-CoordinationUnitID::CoordinationUnitID(const CoordinationUnitType& type,
-                                       RandomID /* random_id */)
-    : type(type) {
-  id = CreateCityHash64(base::UnguessableToken().Create().ToString());
-}
-
-CoordinationUnitID::CoordinationUnitID(const CoordinationUnitType& type,
-                                       uint64_t new_id)
-    : id(new_id), type(type) {}
-
-}  // namespace resource_coordinator
diff --git a/services/resource_coordinator/public/cpp/coordination_unit_id.h b/services/resource_coordinator/public/cpp/coordination_unit_id.h
deleted file mode 100644
index 77b39c9..0000000
--- a/services/resource_coordinator/public/cpp/coordination_unit_id.h
+++ /dev/null
@@ -1,63 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_ID_H_
-#define SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_ID_H_
-
-#include <functional>
-#include <string>
-#include <tuple>
-
-#include "base/component_export.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_types.h"
-
-namespace resource_coordinator {
-
-// This is a native struct rather than a mojom struct as we eventually want
-// to annotate base::TaskRunner with CUs for cost attribution purses and
-// would like to move it to base/ as easily as possible at that point.
-// TODO(oysteine): Rename to CoordinationUnitGUID to better differentiate the
-// class from the internal id
-struct COMPONENT_EXPORT(SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_BASE)
-    CoordinationUnitID {
-  typedef uint64_t CoordinationUnitTypeId;
-  enum RandomID { RANDOM_ID };
-
-  CoordinationUnitID();
-  // Creates a new random ID.
-  CoordinationUnitID(const CoordinationUnitType& type, RandomID random_id);
-
-  CoordinationUnitID(const CoordinationUnitType& type,
-                     CoordinationUnitTypeId new_id);
-
-  bool operator==(const CoordinationUnitID& b) const {
-    return id == b.id && type == b.type;
-  }
-
-  bool operator!=(const CoordinationUnitID& b) const { return !(*this == b); }
-
-  bool operator<(const CoordinationUnitID& b) const {
-    return std::tie(id, type) < std::tie(b.id, b.type);
-  }
-
-  CoordinationUnitTypeId id;
-  CoordinationUnitType type;
-};
-
-}  // resource_coordinator
-
-namespace std {
-
-template <>
-struct hash<resource_coordinator::CoordinationUnitID> {
-  uint64_t operator()(
-      const resource_coordinator::CoordinationUnitID& id) const {
-    return ((static_cast<uint64_t>(id.type)) << 32) |
-           static_cast<uint64_t>(id.id);
-  }
-};
-
-}  // namespace std
-
-#endif  // SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_ID_H_
diff --git a/services/resource_coordinator/public/cpp/coordination_unit_mojom_traits.cc b/services/resource_coordinator/public/cpp/coordination_unit_mojom_traits.cc
deleted file mode 100644
index 2853f82..0000000
--- a/services/resource_coordinator/public/cpp/coordination_unit_mojom_traits.cc
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/resource_coordinator/public/cpp/coordination_unit_mojom_traits.h"
-
-namespace mojo {
-
-// static
-resource_coordinator::mojom::CoordinationUnitType
-EnumTraits<resource_coordinator::mojom::CoordinationUnitType,
-           resource_coordinator::CoordinationUnitType>::
-    ToMojom(resource_coordinator::CoordinationUnitType type) {
-  switch (type) {
-    case resource_coordinator::CoordinationUnitType::kPage:
-      return resource_coordinator::mojom::CoordinationUnitType::kPage;
-    case resource_coordinator::CoordinationUnitType::kFrame:
-      return resource_coordinator::mojom::CoordinationUnitType::kFrame;
-    case resource_coordinator::CoordinationUnitType::kProcess:
-      return resource_coordinator::mojom::CoordinationUnitType::kProcess;
-    case resource_coordinator::CoordinationUnitType::kSystem:
-      return resource_coordinator::mojom::CoordinationUnitType::kSystem;
-    default:
-      NOTREACHED() << "Invalid type: " << static_cast<uint8_t>(type);
-      // This should not be reached. Just return a random value.
-      return resource_coordinator::mojom::CoordinationUnitType::kPage;
-  }
-}
-
-// static
-bool EnumTraits<resource_coordinator::mojom::CoordinationUnitType,
-                resource_coordinator::CoordinationUnitType>::
-    FromMojom(resource_coordinator::mojom::CoordinationUnitType input,
-              resource_coordinator::CoordinationUnitType* out) {
-  switch (input) {
-    case resource_coordinator::mojom::CoordinationUnitType::kPage:
-      *out = resource_coordinator::CoordinationUnitType::kPage;
-      break;
-    case resource_coordinator::mojom::CoordinationUnitType::kFrame:
-      *out = resource_coordinator::CoordinationUnitType::kFrame;
-      break;
-    case resource_coordinator::mojom::CoordinationUnitType::kProcess:
-      *out = resource_coordinator::CoordinationUnitType::kProcess;
-      break;
-    case resource_coordinator::mojom::CoordinationUnitType::kSystem:
-      *out = resource_coordinator::CoordinationUnitType::kSystem;
-      break;
-    default:
-      NOTREACHED() << "Invalid type: " << static_cast<uint8_t>(input);
-      return false;
-  }
-  return true;
-}
-
-// static
-bool StructTraits<resource_coordinator::mojom::CoordinationUnitIDDataView,
-                  resource_coordinator::CoordinationUnitID>::
-    Read(resource_coordinator::mojom::CoordinationUnitIDDataView input,
-         resource_coordinator::CoordinationUnitID* out) {
-  out->id = input.id();
-  if (!input.ReadType(&out->type))
-    return false;
-  return true;
-}
-
-}  // namespace mojo
diff --git a/services/resource_coordinator/public/cpp/coordination_unit_mojom_traits.h b/services/resource_coordinator/public/cpp/coordination_unit_mojom_traits.h
deleted file mode 100644
index 971ebb7..0000000
--- a/services/resource_coordinator/public/cpp/coordination_unit_mojom_traits.h
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_COORDINATION_UNIT_MOJOM_TRAITS_H_
-#define SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_COORDINATION_UNIT_MOJOM_TRAITS_H_
-
-#include "base/component_export.h"
-#include "services/resource_coordinator/public/cpp/coordination_unit_types.h"
-#include "services/resource_coordinator/public/mojom/coordination_unit.mojom.h"
-
-namespace mojo {
-
-template <>
-struct COMPONENT_EXPORT(RESOURCE_COORDINATOR_PUBLIC_MOJOM)
-    EnumTraits<resource_coordinator::mojom::CoordinationUnitType,
-               resource_coordinator::CoordinationUnitType> {
-  static resource_coordinator::mojom::CoordinationUnitType ToMojom(
-      resource_coordinator::CoordinationUnitType type);
-  static bool FromMojom(resource_coordinator::mojom::CoordinationUnitType input,
-                        resource_coordinator::CoordinationUnitType* out);
-};
-
-template <>
-struct COMPONENT_EXPORT(RESOURCE_COORDINATOR_PUBLIC_MOJOM)
-    StructTraits<resource_coordinator::mojom::CoordinationUnitIDDataView,
-                 resource_coordinator::CoordinationUnitID> {
-  static uint64_t id(const resource_coordinator::CoordinationUnitID& id) {
-    return id.id;
-  }
-  static resource_coordinator::CoordinationUnitType type(
-      const resource_coordinator::CoordinationUnitID& id) {
-    return id.type;
-  }
-  static bool Read(
-      resource_coordinator::mojom::CoordinationUnitIDDataView input,
-      resource_coordinator::CoordinationUnitID* out);
-};
-
-}  // namespace mojo
-
-#endif  // SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_COORDINATION_UNIT_MOJOM_TRAITS_H_
diff --git a/services/resource_coordinator/public/cpp/coordination_unit_types.h b/services/resource_coordinator/public/cpp/coordination_unit_types.h
deleted file mode 100644
index 16b286f..0000000
--- a/services/resource_coordinator/public/cpp/coordination_unit_types.h
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#ifndef SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_TYPES_H_
-#define SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_TYPES_H_
-
-#include <stdint.h>
-
-namespace resource_coordinator {
-
-// Any new type here needs to be mirrored between coordination_unit_types.h and
-// coordination_unit.mojom.
-enum class CoordinationUnitType : uint8_t {
-  kInvalidType,
-  kFrame,
-  kPage,
-  kProcess,
-  kSystem,
-};
-
-}  // resource_coordinator
-
-#endif  // SERVICES_RESOURCE_COORDINATOR_PUBLIC_CPP_TYPES_H_
diff --git a/services/resource_coordinator/public/cpp/typemaps.gni b/services/resource_coordinator/public/cpp/typemaps.gni
index de45978f..e6ac78f 100644
--- a/services/resource_coordinator/public/cpp/typemaps.gni
+++ b/services/resource_coordinator/public/cpp/typemaps.gni
@@ -2,7 +2,4 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-typemaps = [
-  "//services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.typemap",
-  "//services/resource_coordinator/public/cpp/coordination_unit.typemap",
-]
+typemaps = [ "//services/resource_coordinator/public/cpp/memory_instrumentation/memory_instrumentation.typemap" ]
diff --git a/services/resource_coordinator/public/mojom/coordination_unit.mojom b/services/resource_coordinator/public/mojom/coordination_unit.mojom
index 61239e4..316bd4d 100644
--- a/services/resource_coordinator/public/mojom/coordination_unit.mojom
+++ b/services/resource_coordinator/public/mojom/coordination_unit.mojom
@@ -45,11 +45,6 @@
   kPageLifecycleTransitions,
 };
 
-struct CoordinationUnitID {
-  CoordinationUnitType type;
-  int64 id;
-};
-
 // Interface used by a blink::Document to communicate state associated with
 // resource management to the embedder.
 interface DocumentCoordinationUnit {
diff --git a/services/tracing/BUILD.gn b/services/tracing/BUILD.gn
index f03baab..f6bf49a 100644
--- a/services/tracing/BUILD.gn
+++ b/services/tracing/BUILD.gn
@@ -58,6 +58,22 @@
   ]
 }
 
+source_set("privacy_check") {
+  testonly = true
+
+  sources = [
+    "perfetto/privacy_filtering_check.cc",
+    "perfetto/privacy_filtering_check.h",
+  ]
+
+  deps = [
+    "//base",
+    "//third_party/perfetto/include/perfetto/protozero:protozero",
+    "//third_party/perfetto/protos/perfetto/common:lite",
+    "//third_party/perfetto/protos/perfetto/trace:lite",
+  ]
+}
+
 source_set("tests") {
   testonly = true
 
diff --git a/services/tracing/perfetto/consumer_host.cc b/services/tracing/perfetto/consumer_host.cc
index eb1e28e..7e23fb3 100644
--- a/services/tracing/perfetto/consumer_host.cc
+++ b/services/tracing/perfetto/consumer_host.cc
@@ -139,6 +139,14 @@
       privacy_filtering_enabled_ = true;
     }
   }
+#if DCHECK_IS_ON()
+  if (privacy_filtering_enabled_) {
+    // If enabled, filtering must be enabled for all data sources.
+    for (const auto& data_source : trace_config.data_sources()) {
+      DCHECK(data_source.config().chrome_config().privacy_filtering_enabled());
+    }
+  }
+#endif
   perfetto::TraceConfig trace_config_copy = AdjustTraceConfig(trace_config);
 
   filtered_pids_.clear();
diff --git a/services/tracing/perfetto/privacy_filtering_check.cc b/services/tracing/perfetto/privacy_filtering_check.cc
new file mode 100644
index 0000000..eccc4d6
--- /dev/null
+++ b/services/tracing/perfetto/privacy_filtering_check.cc
@@ -0,0 +1,64 @@
+// Copyright 2019 The Chromium 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/tracing/perfetto/privacy_filtering_check.h"
+
+#include "base/logging.h"
+#include "third_party/perfetto/protos/perfetto/trace/trace.pb.h"
+#include "third_party/perfetto/protos/perfetto/trace/trace_packet.pb.h"
+
+namespace tracing {
+namespace {
+using perfetto::protos::TracePacket;
+}
+
+PrivacyFilteringCheck::PrivacyFilteringCheck() = default;
+PrivacyFilteringCheck::~PrivacyFilteringCheck() = default;
+
+// static
+void PrivacyFilteringCheck::CheckProtoForUnexpectedFields(
+    const std::string& serialized_trace_proto) {
+  auto proto = std::make_unique<perfetto::protos::Trace>();
+  if (!proto->ParseFromArray(serialized_trace_proto.data(),
+                             serialized_trace_proto.size())) {
+    NOTREACHED();
+    return;
+  }
+
+  for (auto& packet : *proto->mutable_packet()) {
+    DCHECK(packet.unknown_fields().empty());
+    // TODO(ssid): For each of these messages verify that only expected fields
+    // are present.
+    if (packet.has_track_event()) {
+      ++counts_.track_event;
+    } else if (packet.has_process_descriptor()) {
+      ++counts_.process_desc;
+    } else if (packet.has_thread_descriptor()) {
+      ++counts_.thread_desc;
+    } else if (packet.has_synchronization_marker() ||
+               packet.has_trace_stats() || packet.has_trace_config() ||
+               packet.has_system_info()) {
+      // TODO(ssid): These should not be present in the traces or must be
+      // whitelisted.
+    } else {
+      DCHECK_EQ(TracePacket::DataCase::DATA_NOT_SET, packet.data_case());
+    }
+    if (packet.has_interned_data()) {
+      counts_.interned_name += packet.interned_data().legacy_event_names_size();
+      packet.mutable_interned_data()->clear_legacy_event_names();
+      counts_.interned_category +=
+          packet.interned_data().event_categories_size();
+      packet.mutable_interned_data()->clear_event_categories();
+      counts_.interned_source_location +=
+          packet.interned_data().source_locations_size();
+      packet.mutable_interned_data()->clear_source_locations();
+
+      std::string serialized;
+      packet.interned_data().SerializeToString(&serialized);
+      DCHECK_EQ(serialized.size(), 0u);
+    }
+  }
+}
+
+}  // namespace tracing
diff --git a/services/tracing/perfetto/privacy_filtering_check.h b/services/tracing/perfetto/privacy_filtering_check.h
new file mode 100644
index 0000000..7928266
--- /dev/null
+++ b/services/tracing/perfetto/privacy_filtering_check.h
@@ -0,0 +1,41 @@
+// Copyright 2019 The Chromium 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_TRACING_PERFETTO_PRIVACY_FILTERING_CHECK_H_
+#define SERVICES_TRACING_PERFETTO_PRIVACY_FILTERING_CHECK_H_
+
+#include <string>
+
+#include "base/macros.h"
+
+namespace tracing {
+
+class PrivacyFilteringCheck {
+ public:
+  struct TypeCounts {
+    size_t track_event = 0;
+    size_t process_desc = 0;
+    size_t thread_desc = 0;
+
+    size_t interned_name = 0;
+    size_t interned_category = 0;
+    size_t interned_source_location = 0;
+  };
+
+  PrivacyFilteringCheck();
+  ~PrivacyFilteringCheck();
+
+  void CheckProtoForUnexpectedFields(const std::string& serialized_trace_proto);
+
+  const TypeCounts& counts() const { return counts_; }
+
+ private:
+  TypeCounts counts_;
+
+  DISALLOW_COPY_AND_ASSIGN(PrivacyFilteringCheck);
+};
+
+}  // namespace tracing
+
+#endif  // SERVICES_TRACING_PERFETTO_PRIVACY_FILTERING_CHECK_H_
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
index f0217ae..aadb0b4 100644
--- a/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
+++ b/services/tracing/public/cpp/perfetto/trace_event_data_source.cc
@@ -83,6 +83,9 @@
 
 void TraceEventMetadataSource::GenerateMetadata(
     std::unique_ptr<perfetto::TraceWriter> trace_writer) {
+  if (privacy_filtering_enabled_) {
+    return;
+  }
   DCHECK(origin_task_runner_->RunsTasksInCurrentSequence());
 
   auto trace_packet = trace_writer->NewTracePacket();
@@ -207,15 +210,17 @@
   TraceLog::GetInstance()->SetAddTraceEventOverrides(nullptr, nullptr, nullptr);
 }
 
-void TraceEventDataSource::SetupStartupTracing() {
+void TraceEventDataSource::SetupStartupTracing(bool privacy_filtering_enabled) {
   {
     base::AutoLock lock(lock_);
     // No need to do anything if startup tracing has already been set,
     // or we know Perfetto has already been setup.
     if (startup_writer_registry_ || producer_client_) {
+      DCHECK(!privacy_filtering_enabled || privacy_filtering_enabled_);
       return;
     }
 
+    privacy_filtering_enabled_ = privacy_filtering_enabled;
     startup_writer_registry_ =
         std::make_unique<perfetto::StartupTraceWriterRegistry>();
   }
@@ -225,13 +230,19 @@
 void TraceEventDataSource::StartTracing(
     PerfettoProducer* producer,
     const perfetto::DataSourceConfig& data_source_config) {
-  privacy_filtering_enabled_ =
-      data_source_config.chrome_config().privacy_filtering_enabled();
-
   std::unique_ptr<perfetto::StartupTraceWriterRegistry> unbound_writer_registry;
   {
     base::AutoLock lock(lock_);
 
+    bool should_enable_filtering =
+        data_source_config.chrome_config().privacy_filtering_enabled();
+    if (should_enable_filtering) {
+      CHECK(!startup_writer_registry_ || privacy_filtering_enabled_)
+          << "Unexpected StartTracing received when startup tracing is "
+             "running.";
+    }
+    privacy_filtering_enabled_ = should_enable_filtering;
+
     DCHECK(!producer_client_);
     producer_client_ = producer;
     target_buffer_ = data_source_config.target_buffer();
@@ -242,9 +253,6 @@
   session_id_.fetch_add(1u, std::memory_order_relaxed);
 
   if (unbound_writer_registry) {
-    // TODO(ssid): Startup tracing should know about filtering output.
-    CHECK(!privacy_filtering_enabled_);
-
     // TODO(oysteine): Investigate why trace events emitted by something in
     // BindStartupTraceWriterRegistry() causes deadlocks.
     AutoThreadLocalBoolean thread_is_in_trace_event(
diff --git a/services/tracing/public/cpp/perfetto/trace_event_data_source.h b/services/tracing/public/cpp/perfetto/trace_event_data_source.h
index 6b949321..b350726f9 100644
--- a/services/tracing/public/cpp/perfetto/trace_event_data_source.h
+++ b/services/tracing/public/cpp/perfetto/trace_event_data_source.h
@@ -99,7 +99,7 @@
   // is locally buffered until connection to the perfetto service is
   // established. Expects a later call to StartTracing() to bind to the perfetto
   // service. Should only be called once.
-  void SetupStartupTracing();
+  void SetupStartupTracing(bool privacy_filtering_enabled);
 
   // The PerfettoProducer is responsible for calling StopTracing
   // which will clear the stored pointer to it, before it
@@ -150,7 +150,6 @@
   void LogHistogram(base::HistogramBase* histogram);
 
   bool disable_interning_ = false;
-  bool privacy_filtering_enabled_ = false;
   base::OnceClosure stop_complete_callback_;
 
   // Incremented and accessed atomically but without memory order guarantees.
@@ -168,6 +167,7 @@
   std::unique_ptr<perfetto::StartupTraceWriterRegistry>
       startup_writer_registry_;
   std::vector<std::string> histograms_;
+  bool privacy_filtering_enabled_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(TraceEventDataSource);
 };
diff --git a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h
index 54d4f04..80d1227 100644
--- a/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h
+++ b/services/tracing/public/cpp/perfetto/track_event_thread_local_event_sink.h
@@ -64,7 +64,7 @@
   base::trace_event::TraceEvent complete_event_stack_[kMaxCompleteEventDepth];
   uint32_t current_stack_depth_ = 0;
 
-  bool privacy_filtering_enabled_;
+  const bool privacy_filtering_enabled_;
 };
 
 }  // namespace tracing
diff --git a/services/tracing/public/cpp/trace_startup.cc b/services/tracing/public/cpp/trace_startup.cc
index 13a382f..f11df22 100644
--- a/services/tracing/public/cpp/trace_startup.cc
+++ b/services/tracing/public/cpp/trace_startup.cc
@@ -15,6 +15,11 @@
 
 namespace tracing {
 
+namespace {
+using base::trace_event::TraceConfig;
+using base::trace_event::TraceLog;
+}  // namespace
+
 void EnableStartupTracingIfNeeded() {
   const base::CommandLine& command_line =
       *base::CommandLine::ForCurrentProcess();
@@ -27,29 +32,31 @@
 
   // Ensure TraceLog is initialized first.
   // https://crbug.com/764357
-  base::trace_event::TraceLog::GetInstance();
+  auto* trace_log = TraceLog::GetInstance();
+  auto* startup_config = TraceStartupConfig::GetInstance();
 
-  if (TraceStartupConfig::GetInstance()->IsEnabled()) {
-    const base::trace_event::TraceConfig& trace_config =
-        TraceStartupConfig::GetInstance()->GetTraceConfig();
-    uint8_t modes = base::trace_event::TraceLog::RECORDING_MODE;
+  if (startup_config->IsEnabled()) {
+    if (TracingUsesPerfettoBackend()) {
+      TraceEventDataSource::GetInstance()->SetupStartupTracing(
+          startup_config->GetBackgroundStartupTracingEnabled());
+    }
+
+    const TraceConfig& trace_config = startup_config->GetTraceConfig();
+    uint8_t modes = TraceLog::RECORDING_MODE;
     if (!trace_config.event_filters().empty())
-      modes |= base::trace_event::TraceLog::FILTERING_MODE;
-    if (TracingUsesPerfettoBackend())
-      TraceEventDataSource::GetInstance()->SetupStartupTracing();
-    base::trace_event::TraceLog::GetInstance()->SetEnabled(
-        TraceStartupConfig::GetInstance()->GetTraceConfig(), modes);
+      modes |= TraceLog::FILTERING_MODE;
+    trace_log->SetEnabled(startup_config->GetTraceConfig(), modes);
   } else if (command_line.HasSwitch(switches::kTraceToConsole)) {
     // TODO(eseckler): Remove ability to trace to the console, perfetto doesn't
     // support this and noone seems to use it.
-    base::trace_event::TraceConfig trace_config = GetConfigForTraceToConsole();
+    TraceConfig trace_config = GetConfigForTraceToConsole();
     LOG(ERROR) << "Start " << switches::kTraceToConsole
                << " with CategoryFilter '"
                << trace_config.ToCategoryFilterString() << "'.";
     if (TracingUsesPerfettoBackend())
-      TraceEventDataSource::GetInstance()->SetupStartupTracing();
-    base::trace_event::TraceLog::GetInstance()->SetEnabled(
-        trace_config, base::trace_event::TraceLog::RECORDING_MODE);
+      TraceEventDataSource::GetInstance()->SetupStartupTracing(
+          /*privacy_filtering_enabled=*/false);
+    trace_log->SetEnabled(trace_config, TraceLog::RECORDING_MODE);
   }
 }
 
diff --git a/services/viz/privileged/interfaces/compositing/BUILD.gn b/services/viz/privileged/interfaces/compositing/BUILD.gn
index 24852e6..2a43c3c 100644
--- a/services/viz/privileged/interfaces/compositing/BUILD.gn
+++ b/services/viz/privileged/interfaces/compositing/BUILD.gn
@@ -14,6 +14,7 @@
     "layered_window_updater.mojom",
     "overlay_strategy.mojom",
     "renderer_settings.mojom",
+    "vsync_parameter_observer.mojom",
   ]
 
   public_deps = [
diff --git a/services/viz/privileged/interfaces/compositing/display_private.mojom b/services/viz/privileged/interfaces/compositing/display_private.mojom
index 997b82c..f43ad2f 100644
--- a/services/viz/privileged/interfaces/compositing/display_private.mojom
+++ b/services/viz/privileged/interfaces/compositing/display_private.mojom
@@ -12,6 +12,7 @@
 import "ui/gfx/geometry/mojo/geometry.mojom";
 import "ui/latency/mojo/latency_info.mojom";
 import "services/viz/privileged/interfaces/compositing/layered_window_updater.mojom";
+import "services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom";
 
 // See ui/compositor/compositor.h: ContextFactoryPrivate.
 // The DisplayPrivate is used by privileged clients to talk to Display.
@@ -59,6 +60,16 @@
   // Updates the list of refresh rates supported by the associated Display.
   [EnableIf=is_android]
   SetSupportedRefreshRates(array<float> refresh_rates);
+
+  // Adds an observer that gets notified about vsync parameter changes. See
+  // VSyncParameterObserver for details.
+  //
+  // Note that only one observer can be added. Adding a new observer will
+  // replace the old one, which is fine since only exo uses this. If you are
+  // adding a new use case VSyncParameterListener needs to be extended to
+  // support multiple observers.
+  AddVSyncParameterObserver(
+    VSyncParameterObserver observer);
 };
 
 interface DisplayClient {
diff --git a/services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom b/services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom
new file mode 100644
index 0000000..d5a0061
--- /dev/null
+++ b/services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom
@@ -0,0 +1,16 @@
+// Copyright 2019 The Chromium 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 viz.mojom;
+
+import "mojo/public/mojom/base/time.mojom";
+
+// Observer for vsync parameter changes for a specific display compositor. The
+// observer will get notified if the refresh interval changes or if the timebase
+// skews by more than 25μs.
+interface VSyncParameterObserver {
+  OnUpdateVSyncParameters(
+    mojo_base.mojom.TimeTicks timebase,
+    mojo_base.mojom.TimeDelta interval);
+};
diff --git a/services/ws/BUILD.gn b/services/ws/BUILD.gn
index fe6ab07..ee84cb40 100644
--- a/services/ws/BUILD.gn
+++ b/services/ws/BUILD.gn
@@ -170,6 +170,7 @@
     "//mojo/public/cpp/bindings:bindings",
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/cpp/test:test_support",
+    "//services/viz/public/cpp:manifest",
     "//services/ws/common",
     "//services/ws/public/cpp",
     "//services/ws/public/cpp/host",
@@ -188,6 +189,7 @@
   ]
 
   data_deps = [
+    "//services/viz",
     "//services/ws/ime/test_ime_driver",
   ]
 }
diff --git a/services/ws/DEPS b/services/ws/DEPS
index 68e667664..fd6143b 100644
--- a/services/ws/DEPS
+++ b/services/ws/DEPS
@@ -5,6 +5,7 @@
   "+components/viz/common",
   "+components/viz/host",
   "+components/viz/test",
+  "+services/viz/public/cpp",
   "+services/viz/public/interfaces",
   "+third_party/skia/include",
   "+ui",
diff --git a/services/ws/ime/BUILD.gn b/services/ws/ime/BUILD.gn
index 2d277631..aedf2209 100644
--- a/services/ws/ime/BUILD.gn
+++ b/services/ws/ime/BUILD.gn
@@ -32,6 +32,7 @@
     "//base/test:test_support",
     "//services/service_manager/public/cpp",
     "//services/service_manager/public/cpp/test:test_support",
+    "//services/viz/public/cpp:manifest",
     "//services/ws/ime/test_ime_driver/public/cpp:manifest",
     "//services/ws/ime/test_ime_driver/public/mojom",
     "//services/ws/public/mojom",
@@ -40,6 +41,7 @@
   ]
 
   data_deps = [
+    "//services/viz",
     "//services/ws/ime/test_ime_driver",
     "//services/ws/test_ws",
   ]
diff --git a/services/ws/ime/ime_unittest.cc b/services/ws/ime/ime_unittest.cc
index bc03cf6..d18d889 100644
--- a/services/ws/ime/ime_unittest.cc
+++ b/services/ws/ime/ime_unittest.cc
@@ -13,6 +13,7 @@
 #include "services/service_manager/public/cpp/service.h"
 #include "services/service_manager/public/cpp/service_binding.h"
 #include "services/service_manager/public/cpp/test/test_service_manager.h"
+#include "services/viz/public/cpp/manifest.h"
 #include "services/ws/ime/test_ime_driver/public/cpp/manifest.h"
 #include "services/ws/ime/test_ime_driver/public/mojom/constants.mojom.h"
 #include "services/ws/public/mojom/constants.mojom.h"
@@ -74,6 +75,7 @@
   IMEAppTest()
       : test_service_manager_(
             {test_ws::GetManifest(), test_ime_driver::GetManifest(),
+             viz::GetManifest(),
              service_manager::ManifestBuilder()
                  .WithServiceName(kTestServiceName)
                  .RequireCapability(ws::mojom::kServiceName, "app")
diff --git a/services/ws/test_ws/BUILD.gn b/services/ws/test_ws/BUILD.gn
index 1839b47..d5c7f76f 100644
--- a/services/ws/test_ws/BUILD.gn
+++ b/services/ws/test_ws/BUILD.gn
@@ -63,6 +63,7 @@
     ":mojom",
     "//base",
     "//services/service_manager/public/cpp",
+    "//services/viz/public/interfaces:constants",
     "//services/ws/public/cpp:manifest",
   ]
 }
diff --git a/services/ws/test_ws/test_manifest.cc b/services/ws/test_ws/test_manifest.cc
index 5964bd6..7b103558 100644
--- a/services/ws/test_ws/test_manifest.cc
+++ b/services/ws/test_ws/test_manifest.cc
@@ -6,6 +6,7 @@
 
 #include "base/no_destructor.h"
 #include "services/service_manager/public/cpp/manifest_builder.h"
+#include "services/viz/public/interfaces/constants.mojom.h"
 #include "services/ws/public/cpp/manifest.h"
 #include "services/ws/test_ws/test_ws.mojom.h"
 
@@ -21,6 +22,7 @@
                            .Build())
           .ExposeCapability(
               "test", service_manager::Manifest::InterfaceList<mojom::TestWs>())
+          .RequireCapability(viz::mojom::kVizServiceName, "viz_host")
           .PackageService(ws::GetManifest())
           .Build()};
   return *manifest;
diff --git a/services/ws/window_server_service_test_base.cc b/services/ws/window_server_service_test_base.cc
index 1caa360..102336f 100644
--- a/services/ws/window_server_service_test_base.cc
+++ b/services/ws/window_server_service_test_base.cc
@@ -9,6 +9,7 @@
 #include "base/command_line.h"
 #include "base/memory/ptr_util.h"
 #include "services/service_manager/public/cpp/manifest_builder.h"
+#include "services/viz/public/cpp/manifest.h"
 #include "services/ws/common/switches.h"
 #include "services/ws/public/mojom/constants.mojom.h"
 #include "services/ws/public/mojom/window_tree.mojom.h"
@@ -31,7 +32,7 @@
 
 WindowServerServiceTestBase::WindowServerServiceTestBase()
     : test_service_manager_(
-          {test_ws::GetManifest(),
+          {test_ws::GetManifest(), viz::GetManifest(),
            service_manager::ManifestBuilder()
                .WithServiceName(kTestAppName)
                .ExposeCapability("ui:window_tree_client",
diff --git a/storage/browser/quota/quota_manager.cc b/storage/browser/quota/quota_manager.cc
index cb34f7c..c0a5e3b 100644
--- a/storage/browser/quota/quota_manager.cc
+++ b/storage/browser/quota/quota_manager.cc
@@ -1488,8 +1488,10 @@
                                                      int64_t available_space) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   UMA_HISTOGRAM_MBYTES("Quota.GlobalUsageOfTemporaryStorage", usage);
-  UMA_HISTOGRAM_PERCENTAGE("Quota.PercentUsedForTemporaryStorage2",
-                           static_cast<int>((usage * 100) / total_space));
+  if (total_space > 0) {
+    UMA_HISTOGRAM_PERCENTAGE("Quota.PercentUsedForTemporaryStorage2",
+                             static_cast<int>((usage * 100) / total_space));
+  }
 
   GetGlobalUsage(
       StorageType::kPersistent,
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 11b2485d..976158d 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -1021,12 +1021,6 @@
           '--debug',
         ],
         'swarming': {
-          'dimension_sets': [
-            {
-              # TODO(kbr): this is essentially redundant.
-              'os': 'Ubuntu-14.04',
-            },
-          ],
           'shards': 20,
         },
       },
@@ -1721,12 +1715,6 @@
       },
       'Linux Tests': {
         'swarming': {
-          'dimension_sets': [
-            {
-              # TODO(kbr): this is essentially redundant.
-              'os': 'Ubuntu-14.04',
-            },
-          ],
           'shards': 6,
         },
       },
@@ -1735,12 +1723,6 @@
           '--debug',
         ],
         'swarming': {
-          'dimension_sets': [
-            {
-              # TODO(kbr): this is essentially redundant.
-              'os': 'Ubuntu-14.04',
-            },
-          ],
           'shards': 20,
         },
       },
@@ -1768,26 +1750,17 @@
         },
       },
       'Mac10.12 Tests': {
-        # TODO(kbr): if the Swarming dimensions were explicitly specified for
-        # all jobs then this wouldn't be needed.
         'swarming': {
-          'dimension_sets': [
-            {
-              'gpu': '8086:0a2e',
-              'os': 'Mac-10.12.6',
-            },
-          ],
           'shards': 12,
         },
       },
       'Mac10.13 Tests': {
-        # TODO(kbr): if the Swarming dimensions were explicitly specified for
-        # all jobs then this wouldn't be needed.
         'swarming': {
           'dimension_sets': [
             {
+              # Run the layout tests on a consistent set of hardware
+              # (Mac Minis).
               'gpu': '8086:0a2e',
-              'os': 'Mac-10.13.6',
             },
           ],
           'shards': 12,
diff --git a/third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h b/third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h
index fa501f7..288c880 100644
--- a/third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h
+++ b/third_party/blink/public/platform/modules/mediastream/web_media_stream_renderer_factory.h
@@ -32,7 +32,6 @@
   // |io_task_runner| is used for passing video frames.
   virtual scoped_refptr<WebMediaStreamVideoRenderer> GetVideoRenderer(
       const WebMediaStream& web_stream,
-      const base::Closure& error_cb,
       const WebMediaStreamVideoRenderer::RepaintCB& repaint_cb,
       scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
       scoped_refptr<base::SingleThreadTaskRunner> main_render_task_runner) = 0;
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
index dd4a7aa..f3ab4f02 100644
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -197,6 +197,7 @@
   BLINK_PLATFORM_EXPORT static void EnableWebVR(bool);
   BLINK_PLATFORM_EXPORT static void EnableWebXR(bool);
   BLINK_PLATFORM_EXPORT static void EnableWebXRHitTest(bool);
+  BLINK_PLATFORM_EXPORT static void EnableWebXRPlaneDetection(bool);
   BLINK_PLATFORM_EXPORT static void EnableXSLT(bool);
   BLINK_PLATFORM_EXPORT static void ForceOverlayFullscreenVideo(bool);
   BLINK_PLATFORM_EXPORT static void EnableTimerThrottlingForBackgroundTabs(
diff --git a/third_party/blink/renderer/build/scripts/templates/instrumenting_probes_impl.cc.tmpl b/third_party/blink/renderer/build/scripts/templates/instrumenting_probes_impl.cc.tmpl
index c9c1de31..0d27ca76f 100644
--- a/third_party/blink/renderer/build/scripts/templates/instrumenting_probes_impl.cc.tmpl
+++ b/third_party/blink/renderer/build/scripts/templates/instrumenting_probes_impl.cc.tmpl
@@ -25,6 +25,19 @@
   return mutex;
 }
 
+// HeapLinkedHashSet does not support modification during iteration.
+// This helper copies items first so calees iterate over the copied container.
+template <typename T>
+HeapVector<Member<T>> CopyLinkedHashSetToVector(
+    const HeapLinkedHashSet<Member<T>>& linked_hash_set) {
+  unsigned capacity = linked_hash_set.size();
+  HeapVector<Member<T>> result;
+  result.ReserveInitialCapacity(capacity);
+  for (T* agent : linked_hash_set)
+      result.push_back(agent);
+  return result;
+}
+
 }  // namespace
 
 // static
@@ -101,7 +114,8 @@
 {% for agent in probe.agents %}
 {% set class_name = agent | agent_name_to_class %}
   if (probe_sink->Has{{agent}}s()) {
-    for ({{class_name}}* agent : probe_sink->{{class_name}}s())
+    auto copy = CopyLinkedHashSetToVector(probe_sink->{{class_name}}s());
+    for ({{class_name}}* agent : copy)
       agent->{{agent_probe_name}}({{caller()}});
   }
 {% endfor %}
diff --git a/third_party/blink/renderer/build/scripts/templates/probe_sink.h.tmpl b/third_party/blink/renderer/build/scripts/templates/probe_sink.h.tmpl
index 19a4466..25ed17e5 100644
--- a/third_party/blink/renderer/build/scripts/templates/probe_sink.h.tmpl
+++ b/third_party/blink/renderer/build/scripts/templates/probe_sink.h.tmpl
@@ -43,7 +43,7 @@
 {% set class_name = agent | agent_name_to_class %}
 {% set getter_name = agent | to_snake_case %}
   bool Has{{agent}}s() const { return !{{getter_name}}s_.IsEmpty(); }
-  const HeapListHashSet<Member<{{class_name}}>>& {{class_name}}s() const { return {{getter_name}}s_; }
+  const HeapLinkedHashSet<Member<{{class_name}}>>& {{class_name}}s() const { return {{getter_name}}s_; }
   void Add{{agent}}({{class_name}}* agent);
   void Remove{{agent}}({{class_name}}* agent);
 
@@ -57,7 +57,7 @@
 {% for agent in agents %}
 {% set class_name = agent | agent_name_to_class %}
 {% set getter_name = agent | to_snake_case %}
-  HeapListHashSet<Member<{{class_name}}>> {{getter_name}}s_;
+  HeapLinkedHashSet<Member<{{class_name}}>> {{getter_name}}s_;
 {% endfor %}
 
   // Number of sinks with an enabled agent of each type, used to keep
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.cc b/third_party/blink/renderer/core/frame/visual_viewport.cc
index 0c0e308..c42d1e2b 100644
--- a/third_party/blink/renderer/core/frame/visual_viewport.cc
+++ b/third_party/blink/renderer/core/frame/visual_viewport.cc
@@ -57,6 +57,7 @@
 #include "third_party/blink/renderer/core/scroll/scrollbar_theme_overlay.h"
 #include "third_party/blink/renderer/platform/geometry/double_rect.h"
 #include "third_party/blink/renderer/platform/geometry/float_size.h"
+#include "third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_layer.h"
 #include "third_party/blink/renderer/platform/graphics/paint/clip_paint_property_node.h"
 #include "third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h"
@@ -106,13 +107,13 @@
   return scroll_node_.get();
 }
 
-void VisualViewport::UpdatePaintPropertyNodesIfNeeded(
+PaintPropertyChangeType VisualViewport::UpdatePaintPropertyNodesIfNeeded(
     PaintPropertyTreeBuilderFragmentContext& context) {
+  PaintPropertyChangeType change = PaintPropertyChangeType::kUnchanged;
   if (!needs_paint_property_update_)
-    return;
+    return change;
 
   needs_paint_property_update_ = false;
-  SetPaintArtifactCompositorNeedsUpdate();
 
   auto* transform_parent = context.current.transform;
   auto* scroll_parent = context.current.scroll;
@@ -132,13 +133,15 @@
       if (!device_emulation_transform_node_) {
         device_emulation_transform_node_ = TransformPaintPropertyNode::Create(
             *transform_parent, std::move(state));
+        change = PaintPropertyChangeType::kNodeAddedOrRemoved;
       } else {
-        device_emulation_transform_node_->Update(*transform_parent,
-                                                 std::move(state));
+        change = std::max(change, device_emulation_transform_node_->Update(
+                                      *transform_parent, std::move(state)));
       }
       transform_parent = device_emulation_transform_node_.get();
-    } else {
+    } else if (device_emulation_transform_node_) {
       device_emulation_transform_node_ = nullptr;
+      change = PaintPropertyChangeType::kNodeAddedOrRemoved;
     }
   }
 
@@ -157,9 +160,10 @@
       overscroll_elasticity_transform_node_ =
           TransformPaintPropertyNode::Create(*transform_parent,
                                              std::move(state));
+      change = PaintPropertyChangeType::kNodeAddedOrRemoved;
     } else {
-      overscroll_elasticity_transform_node_->Update(*transform_parent,
-                                                    std::move(state));
+      change = std::max(change, overscroll_elasticity_transform_node_->Update(
+                                    *transform_parent, std::move(state)));
     }
   }
 
@@ -171,9 +175,30 @@
     if (!scale_transform_node_) {
       scale_transform_node_ = TransformPaintPropertyNode::Create(
           *overscroll_elasticity_transform_node_.get(), std::move(state));
+      change = PaintPropertyChangeType::kNodeAddedOrRemoved;
     } else {
-      scale_transform_node_->Update(
+      auto effective_change_type = scale_transform_node_->Update(
           *overscroll_elasticity_transform_node_.get(), std::move(state));
+      // As an optimization, attempt to directly update the compositor
+      // scale translation node and return kChangedOnlyCompositedValues which
+      // avoids an expensive PaintArtifactCompositor update.
+      // TODO(crbug.com/953322): We need to implement this optimization for
+      // CompositeAfterPaint as well.
+      if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() &&
+          effective_change_type ==
+              PaintPropertyChangeType::kChangedOnlySimpleValues) {
+        if (auto* paint_artifact_compositor = GetPaintArtifactCompositor()) {
+          bool updated =
+              paint_artifact_compositor->DirectlyUpdatePageScaleTransform(
+                  *scale_transform_node_);
+          if (updated) {
+            effective_change_type =
+                PaintPropertyChangeType::kChangedOnlyCompositedValues;
+            scale_transform_node_->CompositorSimpleValuesUpdated();
+          }
+        }
+      }
+      change = std::max(change, effective_change_type);
     }
   }
 
@@ -204,8 +229,10 @@
     if (!scroll_node_) {
       scroll_node_ =
           ScrollPaintPropertyNode::Create(*scroll_parent, std::move(state));
+      change = PaintPropertyChangeType::kNodeAddedOrRemoved;
     } else {
-      scroll_node_->Update(*scroll_parent, std::move(state));
+      change = std::max(change,
+                        scroll_node_->Update(*scroll_parent, std::move(state)));
     }
   }
 
@@ -217,9 +244,29 @@
     if (!translation_transform_node_) {
       translation_transform_node_ = TransformPaintPropertyNode::Create(
           *scale_transform_node_, std::move(state));
+      change = PaintPropertyChangeType::kNodeAddedOrRemoved;
     } else {
-      translation_transform_node_->Update(*scale_transform_node_,
-                                          std::move(state));
+      auto effective_change_type = translation_transform_node_->Update(
+          *scale_transform_node_, std::move(state));
+      // As an optimization, attempt to directly update the compositor
+      // translation node and return kChangedOnlyCompositedValues which avoids
+      // an expensive PaintArtifactCompositor update.
+      // TODO(crbug.com/953322): We need to implement this optimization for
+      // CompositeAfterPaint as well.
+      if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled() &&
+          effective_change_type ==
+              PaintPropertyChangeType::kChangedOnlySimpleValues) {
+        if (auto* paint_artifact_compositor = GetPaintArtifactCompositor()) {
+          bool updated =
+              paint_artifact_compositor->DirectlyUpdateScrollOffsetTransform(
+                  *translation_transform_node_);
+          if (updated) {
+            effective_change_type =
+                PaintPropertyChangeType::kChangedOnlyCompositedValues;
+            translation_transform_node_->CompositorSimpleValuesUpdated();
+          }
+        }
+      }
     }
   }
 
@@ -241,9 +288,10 @@
     if (!horizontal_scrollbar_effect_node_) {
       horizontal_scrollbar_effect_node_ =
           EffectPaintPropertyNode::Create(*effect_parent, std::move(state));
+      change = PaintPropertyChangeType::kNodeAddedOrRemoved;
     } else {
-      horizontal_scrollbar_effect_node_->Update(*effect_parent,
-                                                std::move(state));
+      change = std::max(change, horizontal_scrollbar_effect_node_->Update(
+                                    *effect_parent, std::move(state)));
     }
 
     overlay_scrollbar_horizontal_->SetLayerState(
@@ -263,8 +311,10 @@
     if (!vertical_scrollbar_effect_node_) {
       vertical_scrollbar_effect_node_ =
           EffectPaintPropertyNode::Create(*effect_parent, std::move(state));
+      change = PaintPropertyChangeType::kNodeAddedOrRemoved;
     } else {
-      vertical_scrollbar_effect_node_->Update(*effect_parent, std::move(state));
+      change = std::max(change, vertical_scrollbar_effect_node_->Update(
+                                    *effect_parent, std::move(state)));
     }
 
     overlay_scrollbar_vertical_->SetLayerState(
@@ -272,6 +322,8 @@
                           *vertical_scrollbar_effect_node_),
         ScrollbarOffset(ScrollbarOrientation::kVerticalScrollbar));
   }
+
+  return change;
 }
 
 VisualViewport::~VisualViewport() {
@@ -1104,6 +1156,12 @@
     MainFrame()->View()->SetPaintArtifactCompositorNeedsUpdate();
 }
 
+PaintArtifactCompositor* VisualViewport::GetPaintArtifactCompositor() const {
+  if (MainFrame() && MainFrame()->View())
+    return MainFrame()->View()->GetPaintArtifactCompositor();
+  return nullptr;
+}
+
 String VisualViewport::DebugName(const GraphicsLayer* graphics_layer) const {
   String name;
   if (graphics_layer == inner_viewport_container_layer_.get()) {
diff --git a/third_party/blink/renderer/core/frame/visual_viewport.h b/third_party/blink/renderer/core/frame/visual_viewport.h
index 4f93bdc5..7f1dc1a1 100644
--- a/third_party/blink/renderer/core/frame/visual_viewport.h
+++ b/third_party/blink/renderer/core/frame/visual_viewport.h
@@ -51,6 +51,7 @@
 }
 
 namespace blink {
+enum class PaintPropertyChangeType : unsigned char;
 class EffectPaintPropertyNode;
 class GraphicsContext;
 class GraphicsLayer;
@@ -58,6 +59,7 @@
 class IntSize;
 class LocalFrame;
 class Page;
+class PaintArtifactCompositor;
 class RootFrameViewport;
 class ScrollPaintPropertyNode;
 class TransformPaintPropertyNode;
@@ -261,8 +263,9 @@
   // Create/update the page scale translation, viewport scroll, and viewport
   // translation property nodes. Also set the layer states (inner viewport
   // container, page scale layer, inner viewport scroll layer) to reference
-  // these nodes.
-  void UpdatePaintPropertyNodesIfNeeded(
+  // these nodes. Returns the maximum paint property change type for any of the
+  // viewport's nodes.
+  PaintPropertyChangeType UpdatePaintPropertyNodesIfNeeded(
       PaintPropertyTreeBuilderFragmentContext& context);
 
   CompositorElementId GetCompositorOverscrollElasticityElementId() const;
@@ -315,6 +318,7 @@
     return *page_;
   }
 
+  PaintArtifactCompositor* GetPaintArtifactCompositor() const;
   CompositorElementId GetCompositorScrollElementId() const;
 
   // Contracts the given size by the thickness of any visible scrollbars. Does
diff --git a/third_party/blink/renderer/core/frame/visual_viewport_test.cc b/third_party/blink/renderer/core/frame/visual_viewport_test.cc
index a63ad7e..faa01de6 100644
--- a/third_party/blink/renderer/core/frame/visual_viewport_test.cc
+++ b/third_party/blink/renderer/core/frame/visual_viewport_test.cc
@@ -47,6 +47,7 @@
 #include "third_party/blink/renderer/core/testing/sim/sim_test.h"
 #include "third_party/blink/renderer/platform/geometry/double_point.h"
 #include "third_party/blink/renderer/platform/geometry/double_rect.h"
+#include "third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h"
 #include "third_party/blink/renderer/platform/graphics/compositor_element_id.h"
 #include "third_party/blink/renderer/platform/graphics/graphics_layer.h"
 #include "third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h"
@@ -115,6 +116,17 @@
         WebWidget::LifecycleUpdateReason::kTest);
   }
 
+  void UpdateAllLifecyclePhasesExceptPaint() {
+    WebView()->MainFrameWidget()->UpdateLifecycle(
+        WebWidget::LifecycleUpdate::kPrePaint,
+        WebWidget::LifecycleUpdateReason::kTest);
+  }
+
+  PaintArtifactCompositor* paint_artifact_compositor() {
+    LocalFrameView& frame_view = *WebView()->MainFrameImpl()->GetFrameView();
+    return frame_view.GetPaintArtifactCompositorForTesting();
+  }
+
   void ForceFullCompositingUpdate() { UpdateAllLifecyclePhases(); }
 
   void RegisterMockedHttpURLLoad(const std::string& fileName) {
@@ -2547,5 +2559,40 @@
   EXPECT_EQ(visual_viewport.GetDeviceEmulationTransformNode(), nullptr);
 }
 
+// When a pinch-zoom occurs, the viewport scale and translation nodes can be
+// directly updated without a PaintArtifactCompositor update.
+TEST_P(VisualViewportTest, DirectPinchZoomPropertyUpdate) {
+  // TODO(crbug.com/953322): Implement this optimization for
+  // CompositeAfterPaint.
+  if (!RuntimeEnabledFeatures::BlinkGenPropertyTreesEnabled() ||
+      RuntimeEnabledFeatures::CompositeAfterPaintEnabled())
+    return;
+
+  InitializeWithAndroidSettings();
+
+  RegisterMockedHttpURLLoad("200-by-800-viewport.html");
+  NavigateTo(base_url_ + "200-by-800-viewport.html");
+
+  WebView()->MainFrameWidget()->Resize(IntSize(100, 200));
+
+  // Scroll visual viewport to the right edge of the frame
+  VisualViewport& visual_viewport = GetFrame()->GetPage()->GetVisualViewport();
+  visual_viewport.SetScaleAndLocation(2.f, true, FloatPoint(150, 10));
+
+  EXPECT_FLOAT_SIZE_EQ(FloatSize(150, 10), visual_viewport.GetScrollOffset());
+  EXPECT_EQ(2.f, visual_viewport.Scale());
+  UpdateAllLifecyclePhases();
+  EXPECT_FALSE(paint_artifact_compositor()->NeedsUpdate());
+
+  // Update the scale and location and ensure that a PaintArtifactCompositor
+  // update is not required.
+  visual_viewport.SetScaleAndLocation(3.f, true, FloatPoint(120, 10));
+  UpdateAllLifecyclePhasesExceptPaint();
+  EXPECT_FALSE(paint_artifact_compositor()->NeedsUpdate());
+
+  EXPECT_FLOAT_SIZE_EQ(FloatSize(120, 10), visual_viewport.GetScrollOffset());
+  EXPECT_EQ(3.f, visual_viewport.Scale());
+}
+
 }  // namespace
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/inspector/browser_protocol.pdl b/third_party/blink/renderer/core/inspector/browser_protocol.pdl
index 196cfcb..7071bac 100644
--- a/third_party/blink/renderer/core/inspector/browser_protocol.pdl
+++ b/third_party/blink/renderer/core/inspector/browser_protocol.pdl
@@ -5620,6 +5620,14 @@
       # Id of the frame that has stopped loading.
       FrameId frameId
 
+  # Fired when page is about to start a download.
+  experimental event downloadWillBegin
+    parameters
+      # Id of the frame that caused download to begin.
+      FrameId frameId
+      # URL of the resource being downloaded.
+      string url
+
   # Fired when interstitial page was hidden
   event interstitialHidden
 
diff --git a/third_party/blink/renderer/core/layout/BUILD.gn b/third_party/blink/renderer/core/layout/BUILD.gn
index ea44a44..5b37e80 100644
--- a/third_party/blink/renderer/core/layout/BUILD.gn
+++ b/third_party/blink/renderer/core/layout/BUILD.gn
@@ -315,6 +315,7 @@
     "ng/geometry/ng_border_edges.h",
     "ng/geometry/ng_box_strut.cc",
     "ng/geometry/ng_box_strut.h",
+    "ng/geometry/ng_fragment_geometry.h",
     "ng/geometry/ng_margin_strut.cc",
     "ng/geometry/ng_margin_strut.h",
     "ng/geometry/ng_static_position.cc",
diff --git a/third_party/blink/renderer/core/layout/ng/geometry/ng_fragment_geometry.h b/third_party/blink/renderer/core/layout/ng/geometry/ng_fragment_geometry.h
new file mode 100644
index 0000000..0c766c6
--- /dev/null
+++ b/third_party/blink/renderer/core/layout/ng/geometry/ng_fragment_geometry.h
@@ -0,0 +1,28 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GEOMETRY_NG_FRAGMENT_GEOMETRY_H_
+#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GEOMETRY_NG_FRAGMENT_GEOMETRY_H_
+
+#include "third_party/blink/renderer/core/layout/geometry/logical_size.h"
+#include "third_party/blink/renderer/core/layout/ng/geometry/ng_box_strut.h"
+
+namespace blink {
+
+// This represents the initial (pre-layout) geometry of a fragment. E.g.
+//  - The inline-size of the fragment.
+//  - The block-size of the fragment (might be |kIndefiniteSize| if height is
+//    'auto' for example).
+//  - The border, scrollbar, and padding.
+// This *doesn't* necessarily represent the final geometry of the fragment.
+struct NGFragmentGeometry {
+  LogicalSize border_box_size;
+  NGBoxStrut border;
+  NGBoxStrut scrollbar;
+  NGBoxStrut padding;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GEOMETRY_NG_FRAGMENT_GEOMETRY_H_
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc
index 9312894..5515fd6 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_inline_box_state.cc
@@ -572,10 +572,18 @@
   DCHECK(item);
   DCHECK(item->Style());
   const ComputedStyle& style = *item->Style();
+
+  NGFragmentGeometry fragment_geometry;
+  fragment_geometry.border_box_size = size;
+  fragment_geometry.border_box_size.inline_size.ClampNegativeToZero();
+  fragment_geometry.padding =
+      NGBoxStrut(padding, IsFlippedLinesWritingMode(style.GetWritingMode()));
+
   // Because children are already in the visual order, use LTR for the
   // fragment builder so that it should not transform the coordinates for RTL.
   NGBoxFragmentBuilder box(item->GetLayoutObject(), &style,
                            style.GetWritingMode(), TextDirection::kLtr);
+  box.SetInitialFragmentGeometry(fragment_geometry);
   box.SetBoxType(NGPhysicalFragment::kInlineBox);
   box.SetStyleVariant(item->StyleVariant());
 
@@ -583,9 +591,6 @@
   // was fragmented. Fragmenting a line box in block direction is not
   // supported today.
   box.SetBorderEdges({true, has_line_right_edge, true, has_line_left_edge});
-  box.SetInlineSize(size.inline_size.ClampNegativeToZero());
-  box.SetBlockSize(size.block_size);
-  box.SetPadding(padding);
 
   for (unsigned i = fragment_start; i < fragment_end; i++) {
     NGLineBoxFragmentBuilder::Child& child = (*line_box)[i];
diff --git a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
index 003eef0..682939a8 100644
--- a/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/inline/ng_line_box_fragment_builder.h
@@ -45,6 +45,10 @@
     return metrics_.LineHeight().ClampNegativeToZero();
   }
 
+  void SetInlineSize(LayoutUnit inline_size) {
+    size_.inline_size = inline_size;
+  }
+
   // Mark this line box is an "empty" line box. See NGLineBoxType.
   void SetIsEmptyLineBox();
 
diff --git a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.cc b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.cc
index 431bb026..c2aa58ab 100644
--- a/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.cc
+++ b/third_party/blink/renderer/core/layout/ng/layout_ng_block_flow.cc
@@ -104,12 +104,13 @@
     container_border_box_logical_height = container->LogicalHeight();
   }
 
-  container_builder.SetInlineSize(container_border_box_logical_width);
-  container_builder.SetBlockSize(container_border_box_logical_height);
-  container_builder.SetBorders(
-      ComputeBorders(constraint_space, container_node));
-  container_builder.SetPadding(
-      ComputePadding(constraint_space, *container_style));
+  NGFragmentGeometry fragment_geometry;
+  fragment_geometry.border_box_size = {container_border_box_logical_width,
+                                       container_border_box_logical_height};
+  fragment_geometry.border = ComputeBorders(constraint_space, container_node);
+  fragment_geometry.padding =
+      ComputePadding(constraint_space, *container_style);
+  container_builder.SetInitialFragmentGeometry(fragment_geometry);
 
   NGStaticPosition static_position =
       LayoutBoxUtils::ComputeStaticPositionFromLegacy(*this);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc
index 7759ab9d..7fe142c 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.cc
@@ -9,6 +9,7 @@
 #include "third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_layout_result.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_length_utils.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_physical_fragment.h"
 
@@ -34,9 +35,11 @@
   NGBlockNode node(block_flow);
   NGConstraintSpace space =
       NGConstraintSpace::CreateFromLayoutObject(*block_flow);
+  NGFragmentGeometry fragment_geometry =
+      CalculateInitialFragmentGeometry(space, node);
 
   scoped_refptr<const NGLayoutResult> result =
-      NGBlockLayoutAlgorithm(node, space).Layout();
+      NGBlockLayoutAlgorithm(node, fragment_geometry, space).Layout();
   return std::make_pair(To<NGPhysicalBoxFragment>(result->PhysicalFragment()),
                         std::move(space));
 }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
index 41ee57e..d76ad196 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.cc
@@ -165,12 +165,16 @@
 
 NGBlockLayoutAlgorithm::NGBlockLayoutAlgorithm(
     NGBlockNode node,
+    const NGFragmentGeometry& fragment_geometry,
     const NGConstraintSpace& space,
     const NGBlockBreakToken* break_token)
     : NGLayoutAlgorithm(node, space, break_token),
+      border_padding_(fragment_geometry.border + fragment_geometry.padding),
+      border_scrollbar_padding_(border_padding_ + fragment_geometry.scrollbar),
       is_resuming_(IsResumingLayout(break_token)),
       exclusion_space_(space.ExclusionSpace()) {
   container_builder_.SetIsNewFormattingContext(space.IsNewFormattingContext());
+  container_builder_.SetInitialFragmentGeometry(fragment_geometry);
 }
 
 // Define the destructor here, so that we can forward-declare more in the
@@ -183,22 +187,18 @@
 
 base::Optional<MinMaxSize> NGBlockLayoutAlgorithm::ComputeMinMaxSize(
     const MinMaxSizeInput& input) const {
-  NGBoxStrut border_padding = ComputeBorders(ConstraintSpace(), Node()) +
-                              ComputePadding(ConstraintSpace(), Style());
   MinMaxSize sizes;
 
   // Size-contained elements don't consider their contents for intrinsic sizing.
   if (node_.ShouldApplySizeContainment()) {
-    if (input.size_type == NGMinMaxSizeType::kBorderBoxSize) {
-      sizes =
-          border_padding.InlineSum() + Node().GetScrollbarSizes().InlineSum();
-    }
+    if (input.size_type == NGMinMaxSizeType::kBorderBoxSize)
+      sizes = border_scrollbar_padding_.InlineSum();
     return sizes;
   }
 
   LayoutUnit child_percentage_resolution_block_size =
       CalculateChildPercentageBlockSizeForMinMax(
-          ConstraintSpace(), Node(), border_padding,
+          ConstraintSpace(), Node(), border_padding_,
           input.percentage_resolution_block_size);
 
   const TextDirection direction = Style().Direction();
@@ -324,7 +324,7 @@
   DCHECK_LE(sizes.min_size, sizes.max_size) << Node().ToString();
 
   if (input.size_type == NGMinMaxSizeType::kBorderBoxSize)
-    sizes += border_padding.InlineSum() + node_.GetScrollbarSizes().InlineSum();
+    sizes += border_scrollbar_padding_.InlineSum();
   return sizes;
 }
 
@@ -369,34 +369,10 @@
 
 inline scoped_refptr<const NGLayoutResult> NGBlockLayoutAlgorithm::Layout(
     NGInlineChildLayoutContext* inline_child_layout_context) {
-  container_builder_.SetBorders(ComputeBorders(ConstraintSpace(), Node()));
-  container_builder_.SetPadding(ComputePadding(ConstraintSpace(), Style()));
-  border_padding_ = container_builder_.Borders() + container_builder_.Padding();
-
-  NGBoxStrut scrollbars = Node().GetScrollbarSizes();
-  border_scrollbar_padding_ = ConstraintSpace().IsAnonymous()
-                                  ? NGBoxStrut()
-                                  : border_padding_ + scrollbars;
-  LogicalSize border_box_size = CalculateBorderBoxSize(
-      ConstraintSpace(), Node(), border_padding_,
-      CalculateDefaultBlockSize(ConstraintSpace(), Node(),
-                                border_scrollbar_padding_));
-
+  LogicalSize border_box_size = container_builder_.InitialBorderBoxSize();
   child_available_size_ =
       ShrinkAvailableSize(border_box_size, border_scrollbar_padding_);
 
-  // When the content box is smaller than the scrollbar, clamp the scrollbar.
-  if (UNLIKELY(!child_available_size_.inline_size && scrollbars.InlineSum() &&
-               ClampScrollbarToContentBox(
-                   &scrollbars,
-                   border_box_size.inline_size - border_padding_.InlineSum()) &&
-               !ConstraintSpace().IsAnonymous())) {
-    // Re-compute dependent values if scrollbar size was clamped.
-    border_scrollbar_padding_ = border_padding_ + scrollbars;
-    child_available_size_ =
-        ShrinkAvailableSize(border_box_size, border_scrollbar_padding_);
-  }
-
   child_percentage_size_ = CalculateChildPercentageSize(
       ConstraintSpace(), Node(), child_available_size_);
   replaced_child_percentage_size_ = CalculateReplacedChildPercentageSize(
@@ -405,13 +381,11 @@
 
   // All of the above calculations with border_scrollbar_padding_ shouldn't
   // include the table cell's intrinsic padding. We can now add this.
-  NGBoxStrut intrinsic_padding =
+  border_scrollbar_padding_ +=
       ComputeIntrinsicPadding(ConstraintSpace(), Node());
-  border_scrollbar_padding_ += intrinsic_padding;
 
   if (ConstraintSpace().HasBlockFragmentation())
     container_builder_.SetHasBlockFragmentation();
-  container_builder_.SetInlineSize(border_box_size.inline_size);
   container_builder_.SetBfcLineOffset(
       ConstraintSpace().BfcOffset().line_offset);
 
@@ -572,7 +546,8 @@
   // function is continued within |FinishLayout|. However it should be read as
   // one function.
   return FinishLayout(&previous_inflow_position, border_box_size,
-                      container_builder_.Borders(), scrollbars);
+                      container_builder_.Borders(),
+                      container_builder_.Scrollbar());
 }
 
 scoped_refptr<const NGLayoutResult> NGBlockLayoutAlgorithm::FinishLayout(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h
index 8632956..3f62811 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h
@@ -56,6 +56,7 @@
   //              fragment within.
   // @param break_token The break token from which the layout should start.
   NGBlockLayoutAlgorithm(NGBlockNode node,
+                         const NGFragmentGeometry&,
                          const NGConstraintSpace& space,
                          const NGBlockBreakToken* break_token = nullptr);
 
@@ -299,12 +300,13 @@
   // Returns kIndefiniteSize in all other cases.
   LayoutUnit CalculateMinimumBlockSize(const NGMarginStrut& end_margin_strut);
 
+  const NGBoxStrut border_padding_;
+  NGBoxStrut border_scrollbar_padding_;
+
   LogicalSize child_available_size_;
   LogicalSize child_percentage_size_;
   LogicalSize replaced_child_percentage_size_;
 
-  NGBoxStrut border_padding_;
-  NGBoxStrut border_scrollbar_padding_;
   LayoutUnit intrinsic_block_size_;
 
   // The line box index at which we ran out of space. This where we'll actually
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc
index 3c8919bc..8305e292 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm_test.cc
@@ -35,9 +35,15 @@
 
   scoped_refptr<const NGPhysicalBoxFragment> RunBlockLayoutAlgorithm(
       const NGConstraintSpace& space,
-      NGBlockNode node) {
+      NGBlockNode node,
+      const NGBreakToken* break_token = nullptr) {
+    NGFragmentGeometry fragment_geometry =
+        CalculateInitialFragmentGeometry(space, node);
+
     scoped_refptr<const NGLayoutResult> result =
-        NGBlockLayoutAlgorithm(node, space).Layout();
+        NGBlockLayoutAlgorithm(node, fragment_geometry, space,
+                               To<NGBlockBreakToken>(break_token))
+            .Layout();
 
     return To<NGPhysicalBoxFragment>(result->PhysicalFragment());
   }
@@ -48,8 +54,10 @@
     NGConstraintSpace space = ConstructBlockLayoutTestConstraintSpace(
         WritingMode::kHorizontalTb, TextDirection::kLtr,
         LogicalSize(LayoutUnit(), LayoutUnit()));
+    NGFragmentGeometry fragment_geometry =
+        CalculateInitialMinMaxFragmentGeometry(space, node);
 
-    NGBlockLayoutAlgorithm algorithm(node, space);
+    NGBlockLayoutAlgorithm algorithm(node, fragment_geometry, space);
     MinMaxSizeInput input(
         /* percentage_resolution_block_size */ (LayoutUnit()));
     auto min_max = algorithm.ComputeMinMaxSize(input);
@@ -57,6 +65,13 @@
     return *min_max;
   }
 
+  scoped_refptr<const NGLayoutResult> RunCachedLayoutResult(
+      const NGConstraintSpace& space,
+      const NGBlockNode& node) {
+    return To<LayoutBlockFlow>(node.GetLayoutBox())
+        ->CachedLayoutResult(space, nullptr);
+  }
+
   String DumpFragmentTree(const NGPhysicalBoxFragment* fragment) {
     NGPhysicalFragment::DumpFlags flags =
         NGPhysicalFragment::DumpHeaderText | NGPhysicalFragment::DumpSubtree |
@@ -87,10 +102,10 @@
 
   NGBlockNode box(ToLayoutBox(GetLayoutObjectByElementId("box")));
 
-  scoped_refptr<const NGPhysicalFragment> frag =
+  scoped_refptr<const NGPhysicalFragment> fragment =
       RunBlockLayoutAlgorithm(space, box);
 
-  EXPECT_EQ(PhysicalSize(LayoutUnit(30), LayoutUnit(40)), frag->Size());
+  EXPECT_EQ(PhysicalSize(LayoutUnit(30), LayoutUnit(40)), fragment->Size());
 }
 
 TEST_F(NGBlockLayoutAlgorithmTest, Caching) {
@@ -112,21 +127,21 @@
             result->PhysicalFragment()->Size());
 
   // Test pointer-equal constraint space.
-  result = block_flow->CachedLayoutResult(space, nullptr);
+  result = RunCachedLayoutResult(space, node);
   EXPECT_NE(result.get(), nullptr);
 
   // Test identical, but not pointer-equal, constraint space.
   space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(100), LayoutUnit(100)));
-  result = block_flow->CachedLayoutResult(space, nullptr);
+  result = RunCachedLayoutResult(space, node);
   EXPECT_NE(result.get(), nullptr);
 
   // Test different constraint space.
   space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(200), LayoutUnit(100)));
-  result = block_flow->CachedLayoutResult(space, nullptr);
+  result = RunCachedLayoutResult(space, node);
   EXPECT_NE(result.get(), nullptr);
 
   // Test a different constraint space that will actually result in a different
@@ -134,12 +149,12 @@
   space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(200), LayoutUnit(200)));
-  result = block_flow->CachedLayoutResult(space, nullptr);
+  result = RunCachedLayoutResult(space, node);
   EXPECT_EQ(result.get(), nullptr);
 
   // Test layout invalidation
   block_flow->SetNeedsLayout("");
-  result = block_flow->CachedLayoutResult(space, nullptr);
+  result = RunCachedLayoutResult(space, node);
   EXPECT_EQ(result.get(), nullptr);
 }
 
@@ -162,21 +177,21 @@
             result->PhysicalFragment()->Size());
 
   // Test pointer-equal constraint space.
-  result = block_flow->CachedLayoutResult(space, nullptr);
+  result = RunCachedLayoutResult(space, node);
   EXPECT_NE(result.get(), nullptr);
 
   // Test identical, but not pointer-equal, constraint space.
   space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(100), LayoutUnit(100)));
-  result = block_flow->CachedLayoutResult(space, nullptr);
+  result = RunCachedLayoutResult(space, node);
   EXPECT_NE(result.get(), nullptr);
 
   // Test different constraint space.
   space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(100), LayoutUnit(200)));
-  result = block_flow->CachedLayoutResult(space, nullptr);
+  result = RunCachedLayoutResult(space, node);
   EXPECT_NE(result.get(), nullptr);
 
   // Test a different constraint space that will actually result in a different
@@ -184,7 +199,7 @@
   space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(200), LayoutUnit(100)));
-  result = block_flow->CachedLayoutResult(space, nullptr);
+  result = RunCachedLayoutResult(space, node);
   EXPECT_EQ(result.get(), nullptr);
 }
 
@@ -251,14 +266,15 @@
   auto run_test = [&](auto id) -> scoped_refptr<const NGLayoutResult> {
     // Grab the box under test.
     auto* box = To<LayoutBlockFlow>(GetLayoutObjectByElementId(id));
+    NGBlockNode node(box);
 
     // Check that we have a cache hit with space100.
     scoped_refptr<const NGLayoutResult> result =
-        box->CachedLayoutResult(space100, nullptr);
+        RunCachedLayoutResult(space100, node);
     EXPECT_NE(result.get(), nullptr);
 
     // Return the result of the cache with space200.
-    return box->CachedLayoutResult(space200, nullptr);
+    return RunCachedLayoutResult(space200, node);
   };
 
   // Test 1: No descendants.
@@ -309,8 +325,8 @@
         <div style="display: inline-block; width: 350px;"></div>
         <div style="display: inline-block; width: 250px;"></div>
       </div>
-      <div id="box3" style="float: left; min-width: 50%;">
-        <div style="display: inline-block; width: 350px;"></div>
+      <div id="box3" style="float: left; min-width: 80%;">
+        <div style="display: inline-block; width: 150px;"></div>
         <div style="display: inline-block; width: 250px;"></div>
       </div>
       <div id="box4" style="float: left; margin-left: 75px;">
@@ -348,41 +364,41 @@
   auto* box4 = To<LayoutBlockFlow>(GetLayoutObjectByElementId("box4"));
 
   // Ensure we cached the result for box1 in the first layout pass.
-  result = box1->CachedLayoutResult(space300, nullptr);
+  result = RunCachedLayoutResult(space300, NGBlockNode(box1));
   EXPECT_NE(result.get(), nullptr);
 
   // box1 was sized to its max-content size in the first layout pass, passing
   // an available size larger than the fragment should hit the cache.
-  result = box1->CachedLayoutResult(space400, nullptr);
+  result = RunCachedLayoutResult(space400, NGBlockNode(box1));
   EXPECT_NE(result.get(), nullptr);
 
   // Passing an available size smaller than the fragment should miss the cache
   // as the fragment may shrink.
-  result = box1->CachedLayoutResult(space100, nullptr);
+  result = RunCachedLayoutResult(space100, NGBlockNode(box1));
   EXPECT_EQ(result.get(), nullptr);
 
   // Ensure we cached the result for box2 in the first layout pass.
-  result = box2->CachedLayoutResult(space300, nullptr);
+  result = RunCachedLayoutResult(space300, NGBlockNode(box2));
   EXPECT_NE(result.get(), nullptr);
 
   // box2 was sized to its min-content size in the first layout pass, passing
   // an available size smaller than the fragment should hit the cache.
-  result = box2->CachedLayoutResult(space200, nullptr);
+  result = RunCachedLayoutResult(space200, NGBlockNode(box2));
   EXPECT_NE(result.get(), nullptr);
 
   // Passing an available size larger than the fragment should miss the cache
   // as the fragment may shrink.
-  result = box2->CachedLayoutResult(space400, nullptr);
+  result = RunCachedLayoutResult(space400, NGBlockNode(box2));
   EXPECT_EQ(result.get(), nullptr);
 
   // box3 was sized to its min-content size in the first layout pass, however
   // it should miss the cache as it has a %-min-size.
-  result = box3->CachedLayoutResult(space200, nullptr);
+  result = RunCachedLayoutResult(space200, NGBlockNode(box3));
   EXPECT_EQ(result.get(), nullptr);
 
   // box4 was sized to its max-content size in the first layout pass (the same
   // as box1) however it should miss the cache due to its margin.
-  result = box4->CachedLayoutResult(space250, nullptr);
+  result = RunCachedLayoutResult(space250, NGBlockNode(box4));
   EXPECT_EQ(result.get(), nullptr);
 }
 
@@ -418,7 +434,7 @@
   auto* box1 = To<LayoutBlockFlow>(GetLayoutObjectByElementId("box1"));
 
   // Ensure we get a cached layout result, even if our BFC line-offset changed.
-  result = box1->CachedLayoutResult(space200, nullptr);
+  result = RunCachedLayoutResult(space200, NGBlockNode(box1));
   EXPECT_NE(result.get(), nullptr);
 }
 
@@ -442,19 +458,20 @@
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(100), kIndefiniteSize));
 
-  scoped_refptr<const NGPhysicalBoxFragment> frag =
+  scoped_refptr<const NGPhysicalBoxFragment> fragment =
       RunBlockLayoutAlgorithm(space, container);
 
-  EXPECT_EQ(LayoutUnit(kWidth), frag->Size().width);
-  EXPECT_EQ(LayoutUnit(kHeight1 + kHeight2 + kMarginTop), frag->Size().height);
-  EXPECT_EQ(NGPhysicalFragment::kFragmentBox, frag->Type());
-  ASSERT_EQ(frag->Children().size(), 2UL);
+  EXPECT_EQ(LayoutUnit(kWidth), fragment->Size().width);
+  EXPECT_EQ(LayoutUnit(kHeight1 + kHeight2 + kMarginTop),
+            fragment->Size().height);
+  EXPECT_EQ(NGPhysicalFragment::kFragmentBox, fragment->Type());
+  ASSERT_EQ(fragment->Children().size(), 2UL);
 
-  const NGLink& first_child = frag->Children()[0];
+  const NGLink& first_child = fragment->Children()[0];
   EXPECT_EQ(kHeight1, first_child->Size().height);
   EXPECT_EQ(0, first_child.Offset().top);
 
-  const NGLink& second_child = frag->Children()[1];
+  const NGLink& second_child = fragment->Children()[1];
   EXPECT_EQ(kHeight2, second_child->Size().height);
   EXPECT_EQ(kHeight1 + kMarginTop, second_child.Offset().top);
 }
@@ -485,10 +502,10 @@
   NGConstraintSpace space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(500), LayoutUnit(500)));
-  scoped_refptr<const NGPhysicalBoxFragment> frag =
+  scoped_refptr<const NGPhysicalBoxFragment> fragment =
       RunBlockLayoutAlgorithm(space, container);
 
-  const NGLink& child = frag->Children()[0];
+  const NGLink& child = fragment->Children()[0];
   const NGLink& child2 =
       static_cast<const NGPhysicalBoxFragment*>(child.get())->Children()[0];
 
@@ -896,17 +913,17 @@
   NGConstraintSpace space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(500), LayoutUnit(500)));
-  scoped_refptr<const NGPhysicalBoxFragment> frag =
+  scoped_refptr<const NGPhysicalBoxFragment> fragment =
       RunBlockLayoutAlgorithm(space, container);
 
-  ASSERT_EQ(frag->Children().size(), 2UL);
+  ASSERT_EQ(fragment->Children().size(), 2UL);
 
-  const NGPhysicalFragment* child1 = frag->Children()[0].get();
-  PhysicalOffset child1_offset = frag->Children()[0].Offset();
+  const NGPhysicalFragment* child1 = fragment->Children()[0].get();
+  PhysicalOffset child1_offset = fragment->Children()[0].Offset();
   EXPECT_EQ(0, child1_offset.top);
   EXPECT_EQ(kHeight, child1->Size().height);
 
-  PhysicalOffset child2_offset = frag->Children()[1].Offset();
+  PhysicalOffset child2_offset = fragment->Children()[1].Offset();
   EXPECT_EQ(kHeight + std::max(kMarginBottom, kMarginTop), child2_offset.top);
 }
 
@@ -1199,13 +1216,13 @@
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(1000), kIndefiniteSize));
 
-  scoped_refptr<const NGPhysicalBoxFragment> frag =
+  scoped_refptr<const NGPhysicalBoxFragment> fragment =
       RunBlockLayoutAlgorithm(space, container);
 
-  ASSERT_EQ(frag->Children().size(), 1UL);
+  ASSERT_EQ(fragment->Children().size(), 1UL);
 
   // div1
-  const NGPhysicalFragment* child = frag->Children()[0].get();
+  const NGPhysicalFragment* child = fragment->Children()[0].get();
   EXPECT_EQ(kBorderLeft + kPaddingLeft + kWidth + kPaddingRight + kBorderRight,
             child->Size().width);
   EXPECT_EQ(kBorderTop + kPaddingTop + kHeight + kPaddingBottom + kBorderBottom,
@@ -1235,14 +1252,14 @@
   NGConstraintSpace space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(100), kIndefiniteSize));
-  scoped_refptr<const NGPhysicalBoxFragment> frag =
+  scoped_refptr<const NGPhysicalBoxFragment> fragment =
       RunBlockLayoutAlgorithm(space, container);
 
-  EXPECT_EQ(LayoutUnit(kWidth + kPaddingLeft), frag->Size().width);
-  EXPECT_EQ(NGPhysicalFragment::kFragmentBox, frag->Type());
-  ASSERT_EQ(frag->Children().size(), 1UL);
+  EXPECT_EQ(LayoutUnit(kWidth + kPaddingLeft), fragment->Size().width);
+  EXPECT_EQ(NGPhysicalFragment::kFragmentBox, fragment->Type());
+  ASSERT_EQ(fragment->Children().size(), 1UL);
 
-  const NGPhysicalFragment* child = frag->Children()[0].get();
+  const NGPhysicalFragment* child = fragment->Children()[0].get();
   EXPECT_EQ(LayoutUnit(12), child->Size().width);
 }
 
@@ -1267,15 +1284,15 @@
   NGConstraintSpace space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(100), kIndefiniteSize));
-  scoped_refptr<const NGPhysicalBoxFragment> frag =
+  scoped_refptr<const NGPhysicalBoxFragment> fragment =
       RunBlockLayoutAlgorithm(space, container);
 
-  EXPECT_EQ(LayoutUnit(kWidth + kPaddingLeft), frag->Size().width);
-  EXPECT_EQ(NGPhysicalFragment::kFragmentBox, frag->Type());
-  ASSERT_EQ(1UL, frag->Children().size());
+  EXPECT_EQ(LayoutUnit(kWidth + kPaddingLeft), fragment->Size().width);
+  EXPECT_EQ(NGPhysicalFragment::kFragmentBox, fragment->Type());
+  ASSERT_EQ(1UL, fragment->Children().size());
 
-  const NGPhysicalFragment* child = frag->Children()[0].get();
-  PhysicalOffset child_offset = frag->Children()[0].Offset();
+  const NGPhysicalFragment* child = fragment->Children()[0].get();
+  PhysicalOffset child_offset = fragment->Children()[0].Offset();
   EXPECT_EQ(LayoutUnit(kChildWidth), child->Size().width);
   EXPECT_EQ(LayoutUnit(kPaddingLeft + 10), child_offset.left);
   EXPECT_EQ(LayoutUnit(0), child_offset.top);
@@ -1770,10 +1787,10 @@
   NGConstraintSpace space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(100), kIndefiniteSize), true);
-  scoped_refptr<const NGPhysicalFragment> frag =
+  scoped_refptr<const NGPhysicalFragment> fragment =
       RunBlockLayoutAlgorithm(space, container);
 
-  EXPECT_EQ(LayoutUnit(kWidthChild2), frag->Size().width);
+  EXPECT_EQ(LayoutUnit(kWidthChild2), fragment->Size().width);
 }
 
 // Verifies that we position empty blocks and floats correctly inside of the
@@ -1927,7 +1944,7 @@
 
   // We should only have one 150x200 fragment with no fragmentation.
   scoped_refptr<const NGPhysicalFragment> fragment =
-      NGBlockLayoutAlgorithm(node, space).Layout()->PhysicalFragment();
+      RunBlockLayoutAlgorithm(space, node);
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(200)), fragment->Size());
   ASSERT_TRUE(fragment->BreakToken()->IsFinished());
 }
@@ -1954,14 +1971,11 @@
       node.CreatesNewFormattingContext(), kFragmentainerSpaceAvailable);
 
   scoped_refptr<const NGPhysicalFragment> fragment =
-      NGBlockLayoutAlgorithm(node, space).Layout()->PhysicalFragment();
+      RunBlockLayoutAlgorithm(space, node);
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(200)), fragment->Size());
   ASSERT_FALSE(fragment->BreakToken()->IsFinished());
 
-  fragment = NGBlockLayoutAlgorithm(
-                 node, space, To<NGBlockBreakToken>(fragment->BreakToken()))
-                 .Layout()
-                 ->PhysicalFragment();
+  fragment = RunBlockLayoutAlgorithm(space, node, fragment->BreakToken());
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(100)), fragment->Size());
   ASSERT_TRUE(fragment->BreakToken()->IsFinished());
 }
@@ -2000,7 +2014,7 @@
       node.CreatesNewFormattingContext(), kFragmentainerSpaceAvailable);
 
   scoped_refptr<const NGPhysicalFragment> fragment =
-      NGBlockLayoutAlgorithm(node, space).Layout()->PhysicalFragment();
+      RunBlockLayoutAlgorithm(space, node);
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(200)), fragment->Size());
   ASSERT_FALSE(fragment->BreakToken()->IsFinished());
 
@@ -2012,10 +2026,7 @@
 
   EXPECT_FALSE(iterator.NextChild());
 
-  fragment = NGBlockLayoutAlgorithm(
-                 node, space, To<NGBlockBreakToken>(fragment->BreakToken()))
-                 .Layout()
-                 ->PhysicalFragment();
+  fragment = RunBlockLayoutAlgorithm(space, node, fragment->BreakToken());
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(140)), fragment->Size());
   ASSERT_TRUE(fragment->BreakToken()->IsFinished());
 
@@ -2068,7 +2079,7 @@
       node.CreatesNewFormattingContext(), kFragmentainerSpaceAvailable);
 
   scoped_refptr<const NGPhysicalFragment> fragment =
-      NGBlockLayoutAlgorithm(node, space).Layout()->PhysicalFragment();
+      RunBlockLayoutAlgorithm(space, node);
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(200)), fragment->Size());
   ASSERT_FALSE(fragment->BreakToken()->IsFinished());
 
@@ -2080,10 +2091,7 @@
 
   EXPECT_FALSE(iterator.NextChild());
 
-  fragment = NGBlockLayoutAlgorithm(
-                 node, space, To<NGBlockBreakToken>(fragment->BreakToken()))
-                 .Layout()
-                 ->PhysicalFragment();
+  fragment = RunBlockLayoutAlgorithm(space, node, fragment->BreakToken());
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(140)), fragment->Size());
   ASSERT_TRUE(fragment->BreakToken()->IsFinished());
 
@@ -2134,7 +2142,7 @@
       node.CreatesNewFormattingContext(), kFragmentainerSpaceAvailable);
 
   scoped_refptr<const NGPhysicalFragment> fragment =
-      NGBlockLayoutAlgorithm(node, space).Layout()->PhysicalFragment();
+      RunBlockLayoutAlgorithm(space, node);
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(70)), fragment->Size());
   ASSERT_FALSE(fragment->BreakToken()->IsFinished());
 
@@ -2146,10 +2154,7 @@
 
   EXPECT_FALSE(iterator.NextChild());
 
-  fragment = NGBlockLayoutAlgorithm(
-                 node, space, To<NGBlockBreakToken>(fragment->BreakToken()))
-                 .Layout()
-                 ->PhysicalFragment();
+  fragment = RunBlockLayoutAlgorithm(space, node, fragment->BreakToken());
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(0)), fragment->Size());
   ASSERT_TRUE(fragment->BreakToken()->IsFinished());
 
@@ -2203,7 +2208,7 @@
       node.CreatesNewFormattingContext(), kFragmentainerSpaceAvailable);
 
   scoped_refptr<const NGPhysicalFragment> fragment =
-      NGBlockLayoutAlgorithm(node, space).Layout()->PhysicalFragment();
+      RunBlockLayoutAlgorithm(space, node);
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(50)), fragment->Size());
   ASSERT_FALSE(fragment->BreakToken()->IsFinished());
 
@@ -2224,10 +2229,8 @@
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(1000), kIndefiniteSize), false,
       node.CreatesNewFormattingContext(), kFragmentainerSpaceAvailable);
-  fragment = NGBlockLayoutAlgorithm(
-                 node, space, To<NGBlockBreakToken>(fragment->BreakToken()))
-                 .Layout()
-                 ->PhysicalFragment();
+
+  fragment = RunBlockLayoutAlgorithm(space, node, fragment->BreakToken());
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(0)), fragment->Size());
   ASSERT_TRUE(fragment->BreakToken()->IsFinished());
 
@@ -2285,7 +2288,7 @@
   AdvanceToLayoutPhase();
 
   scoped_refptr<const NGPhysicalFragment> fragment =
-      NGBlockLayoutAlgorithm(node, space).Layout()->PhysicalFragment();
+      RunBlockLayoutAlgorithm(space, node);
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(60)), fragment->Size());
   ASSERT_TRUE(!fragment->BreakToken() || fragment->BreakToken()->IsFinished());
 
@@ -2333,7 +2336,7 @@
       node.CreatesNewFormattingContext(), kFragmentainerSpaceAvailable);
 
   scoped_refptr<const NGPhysicalFragment> fragment =
-      NGBlockLayoutAlgorithm(node, space).Layout()->PhysicalFragment();
+      RunBlockLayoutAlgorithm(space, node);
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(50)), fragment->Size());
   ASSERT_FALSE(fragment->BreakToken()->IsFinished());
 
@@ -2351,10 +2354,8 @@
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(1000), kIndefiniteSize), false,
       node.CreatesNewFormattingContext(), kFragmentainerSpaceAvailable);
-  fragment = NGBlockLayoutAlgorithm(
-                 node, space, To<NGBlockBreakToken>(fragment->BreakToken()))
-                 .Layout()
-                 ->PhysicalFragment();
+
+  fragment = RunBlockLayoutAlgorithm(space, node, fragment->BreakToken());
   EXPECT_EQ(PhysicalSize(LayoutUnit(150), LayoutUnit(0)), fragment->Size());
   ASSERT_TRUE(fragment->BreakToken()->IsFinished());
 
@@ -2458,7 +2459,7 @@
       LogicalSize(LayoutUnit(1000), kIndefiniteSize));
 
   scoped_refptr<const NGPhysicalFragment> fragment =
-      NGBlockLayoutAlgorithm(node, space).Layout()->PhysicalFragment();
+      RunBlockLayoutAlgorithm(space, node);
   EXPECT_EQ(PhysicalSize(LayoutUnit(200), LayoutUnit(150)), fragment->Size());
 
   FragmentChildIterator iterator(To<NGPhysicalBoxFragment>(fragment.get()));
@@ -2494,7 +2495,7 @@
       LogicalSize(LayoutUnit(1000), kIndefiniteSize), false, true);
 
   scoped_refptr<const NGPhysicalFragment> fragment =
-      NGBlockLayoutAlgorithm(node, space).Layout()->PhysicalFragment();
+      RunBlockLayoutAlgorithm(space, node);
   EXPECT_EQ(PhysicalSize(LayoutUnit(200), LayoutUnit(10)), fragment->Size());
 
   FragmentChildIterator iterator(To<NGPhysicalBoxFragment>(fragment.get()));
@@ -2532,7 +2533,7 @@
       LogicalSize(LayoutUnit(1000), kIndefiniteSize), false, true);
 
   scoped_refptr<const NGPhysicalFragment> fragment =
-      NGBlockLayoutAlgorithm(node, space).Layout()->PhysicalFragment();
+      RunBlockLayoutAlgorithm(space, node);
   EXPECT_EQ(PhysicalSize(LayoutUnit(200), LayoutUnit(10)), fragment->Size());
 
   FragmentChildIterator iterator(To<NGPhysicalBoxFragment>(fragment.get()));
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
index c8d15b7f..9186d43 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_node.cc
@@ -15,6 +15,7 @@
 #include "third_party/blink/renderer/core/layout/layout_multi_column_flow_thread.h"
 #include "third_party/blink/renderer/core/layout/layout_multi_column_set.h"
 #include "third_party/blink/renderer/core/layout/min_max_size.h"
+#include "third_party/blink/renderer/core/layout/ng/geometry/ng_fragment_geometry.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_node.h"
 #include "third_party/blink/renderer/core/layout/ng/legacy_layout_tree_walking.h"
 #include "third_party/blink/renderer/core/layout/ng/list/layout_ng_list_item.h"
@@ -62,11 +63,16 @@
 
  public:
   NGLayoutAlgorithmParams(NGBlockNode node,
+                          const NGFragmentGeometry& fragment_geometry,
                           const NGConstraintSpace& space,
                           const NGBlockBreakToken* break_token = nullptr)
-      : node(node), space(space), break_token(break_token) {}
+      : node(node),
+        fragment_geometry(fragment_geometry),
+        space(space),
+        break_token(break_token) {}
 
   NGBlockNode node;
+  const NGFragmentGeometry& fragment_geometry;
   const NGConstraintSpace& space;
   const NGBlockBreakToken* break_token;
 };
@@ -77,7 +83,8 @@
 template <typename Algorithm, typename Callback>
 NOINLINE void CreateAlgorithmAndRun(const NGLayoutAlgorithmParams& params,
                                     const Callback& callback) {
-  Algorithm algorithm(params.node, params.space, params.break_token);
+  Algorithm algorithm(params.node, params.fragment_geometry, params.space,
+                      params.break_token);
   callback(&algorithm);
 }
 
@@ -155,7 +162,8 @@
   if (LayoutMultiColumnSet* column_set = flow_thread->FirstMultiColumnSet()) {
     NGFragment logical_fragment(writing_mode, fragment);
     auto border_scrollbar_padding =
-        CalculateBorderScrollbarPadding(constraint_space, node);
+        ComputeBorders(constraint_space, node) + node.GetScrollbarSizes() +
+        ComputePadding(constraint_space, node.Style());
 
     column_set->SetLogicalLeft(border_scrollbar_padding.inline_start);
     column_set->SetLogicalTop(border_scrollbar_padding.block_start);
@@ -242,14 +250,15 @@
 
   PrepareForLayout();
 
-  NGBoxStrut old_scrollbars = GetScrollbarSizes();
-
-  NGLayoutAlgorithmParams params(*this, constraint_space,
+  NGFragmentGeometry fragment_geometry =
+      CalculateInitialFragmentGeometry(constraint_space, *this);
+  NGLayoutAlgorithmParams params(*this, fragment_geometry, constraint_space,
                                  To<NGBlockBreakToken>(break_token));
   layout_result = LayoutWithAlgorithm(params);
-
   FinishLayout(block_flow, constraint_space, break_token, layout_result);
-  if (old_scrollbars != GetScrollbarSizes()) {
+
+  NGBoxStrut after_layout_scrollbars = GetScrollbarSizes();
+  if (fragment_geometry.scrollbar != after_layout_scrollbars) {
     // If our scrollbars have changed, we need to relayout because either:
     // - Our size has changed (if shrinking to fit), or
     // - Space available to our children has changed.
@@ -266,6 +275,8 @@
     box_->SetNeedsLayout(layout_invalidation_reason::kScrollbarChanged,
                          kMarkOnlyThis);
 
+    fragment_geometry =
+        CalculateInitialFragmentGeometry(constraint_space, *this);
     layout_result = LayoutWithAlgorithm(params);
     FinishLayout(block_flow, constraint_space, break_token, layout_result);
   }
@@ -423,8 +434,11 @@
     return sizes;
   }
 
+  NGFragmentGeometry fragment_geometry =
+      CalculateInitialMinMaxFragmentGeometry(*constraint_space, *this);
   base::Optional<MinMaxSize> maybe_sizes = ComputeMinMaxSizeWithAlgorithm(
-      NGLayoutAlgorithmParams(*this, *constraint_space), input);
+      NGLayoutAlgorithmParams(*this, fragment_geometry, *constraint_space),
+      input);
 
   if (maybe_sizes.has_value()) {
     if (UNLIKELY(IsHTMLMarqueeElement(box_->GetNode()) &&
@@ -919,21 +933,22 @@
       box_->ForceLayout();
 
     // Synthesize a new layout result.
-    LogicalSize box_size(box_->LogicalWidth(), box_->LogicalHeight());
+    NGFragmentGeometry fragment_geometry;
+    fragment_geometry.border_box_size = {box_->LogicalWidth(),
+                                         box_->LogicalHeight()};
+    fragment_geometry.border = {box_->BorderStart(), box_->BorderEnd(),
+                                box_->BorderBefore(), box_->BorderAfter()};
+    fragment_geometry.scrollbar = GetScrollbarSizes();
+    fragment_geometry.padding = {box_->PaddingStart(), box_->PaddingEnd(),
+                                 box_->PaddingBefore(), box_->PaddingAfter()};
+
     // TODO(kojii): Implement use_first_line_style.
     NGBoxFragmentBuilder builder(*this, box_->Style(), &constraint_space,
                                  writing_mode, box_->StyleRef().Direction());
     builder.SetIsNewFormattingContext(
         constraint_space.IsNewFormattingContext());
+    builder.SetInitialFragmentGeometry(fragment_geometry);
     builder.SetIsLegacyLayoutRoot();
-    builder.SetInlineSize(box_size.inline_size);
-    builder.SetBlockSize(box_size.block_size);
-    NGBoxStrut borders(box_->BorderStart(), box_->BorderEnd(),
-                       box_->BorderBefore(), box_->BorderAfter());
-    builder.SetBorders(borders);
-    NGBoxStrut padding(box_->PaddingStart(), box_->PaddingEnd(),
-                       box_->PaddingBefore(), box_->PaddingAfter());
-    builder.SetPadding(padding);
 
     CopyBaselinesFromLegacyLayout(constraint_space, &builder);
     layout_result = builder.ToBoxFragment();
diff --git a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
index 1d8bfb1..c635639 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_box_fragment_builder.h
@@ -8,6 +8,7 @@
 #include "third_party/blink/renderer/core/layout/geometry/physical_rect.h"
 #include "third_party/blink/renderer/core/layout/ng/geometry/ng_border_edges.h"
 #include "third_party/blink/renderer/core/layout/ng/geometry/ng_box_strut.h"
+#include "third_party/blink/renderer/core/layout/ng/geometry/ng_fragment_geometry.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_baseline.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_break_token.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h"
@@ -56,30 +57,34 @@
     layout_object_ = layout_object;
   }
 
+  NGBoxFragmentBuilder& SetInitialFragmentGeometry(
+      const NGFragmentGeometry& initial_fragment_geometry) {
+    initial_fragment_geometry_ = &initial_fragment_geometry;
+    size_ = initial_fragment_geometry_->border_box_size;
+    return *this;
+  }
+
   NGBoxFragmentBuilder& SetIntrinsicBlockSize(LayoutUnit intrinsic_block_size) {
     intrinsic_block_size_ = intrinsic_block_size;
     return *this;
   }
-  NGBoxFragmentBuilder& SetBorders(const NGBoxStrut& border) {
+  const NGBoxStrut& Borders() const {
+    DCHECK(initial_fragment_geometry_);
     DCHECK_NE(BoxType(), NGPhysicalFragment::kInlineBox);
-    borders_ = border;
-    return *this;
+    return initial_fragment_geometry_->border;
   }
-  const NGBoxStrut& Borders() const { return borders_; }
-  NGBoxFragmentBuilder& SetPadding(const NGBoxStrut& padding) {
-    DCHECK_NE(BoxType(), NGPhysicalFragment::kInlineBox);
-    padding_ = padding;
-    return *this;
+  const NGBoxStrut& Scrollbar() const {
+    DCHECK(initial_fragment_geometry_);
+    return initial_fragment_geometry_->scrollbar;
   }
-  NGBoxFragmentBuilder& SetPadding(const NGLineBoxStrut& padding) {
-    DCHECK_EQ(BoxType(), NGPhysicalFragment::kInlineBox);
-    // Convert to flow-relative, because ToInlineBoxFragment() will convert
-    // the padding to physical coordinates using flow-relative writing-mode.
-    padding_ = NGBoxStrut(padding, IsFlippedLinesWritingMode(GetWritingMode()));
-    return *this;
+  const NGBoxStrut& Padding() const {
+    DCHECK(initial_fragment_geometry_);
+    return initial_fragment_geometry_->padding;
   }
-  const NGBoxStrut& Padding() const { return padding_; }
-
+  const LogicalSize& InitialBorderBoxSize() const {
+    DCHECK(initial_fragment_geometry_);
+    return initial_fragment_geometry_->border_box_size;
+  }
   // Remove all children.
   void RemoveChildren();
 
@@ -227,9 +232,8 @@
  private:
   scoped_refptr<const NGLayoutResult> ToBoxFragment(WritingMode);
 
+  const NGFragmentGeometry* initial_fragment_geometry_ = nullptr;
   LayoutUnit intrinsic_block_size_;
-  NGBoxStrut borders_;
-  NGBoxStrut padding_;
 
   NGPhysicalFragment::NGBoxType box_type_;
   bool is_fieldset_container_ = false;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
index 1b863c8..d683ca9 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.cc
@@ -6,6 +6,7 @@
 
 #include <algorithm>
 #include "third_party/blink/renderer/core/layout/geometry/logical_size.h"
+#include "third_party/blink/renderer/core/layout/ng/geometry/ng_fragment_geometry.h"
 #include "third_party/blink/renderer/core/layout/ng/inline/ng_baseline.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_box_fragment.h"
@@ -26,69 +27,24 @@
          style.GetColumnFill() == EColumnFill::kBalance;
 }
 
-// Constrain a balanced column block size to not overflow the multicol
-// container.
-LayoutUnit ConstrainColumnBlockSize(LayoutUnit size,
-                                    NGBlockNode node,
-                                    const NGConstraintSpace& space) {
-  // The {,max-}{height,width} properties are specified on the multicol
-  // container, but here we're calculating the column block sizes inside the
-  // multicol container, which isn't exactly the same. We may shrink the column
-  // block size here, but we'll never stretch it, because the value passed is
-  // the perfect balanced block size. Making it taller would only disrupt the
-  // balanced output, for no reason. The only thing we need to worry about here
-  // is to not overflow the multicol container.
-
-  // First of all we need to convert the size to a value that can be compared
-  // against the resolved properties on the multicol container. That means that
-  // we have to convert the value from content-box to border-box.
-  NGBoxStrut border_scrollbar_padding =
-      CalculateBorderScrollbarPadding(space, node);
-  LayoutUnit extra = border_scrollbar_padding.BlockSum();
-  size += extra;
-
-  NGBoxStrut border_padding =
-      ComputeBorders(space, node) + ComputePadding(space, node.Style());
-
-  const ComputedStyle& style = node.Style();
-  LayoutUnit max = ResolveMaxBlockLength(space, style, border_padding,
-                                         style.LogicalMaxHeight(), size,
-                                         LengthResolvePhase::kLayout);
-  LayoutUnit extent = ResolveMainBlockLength(space, style, border_padding,
-                                             style.LogicalHeight(), size,
-                                             LengthResolvePhase::kLayout);
-  if (extent != kIndefiniteSize) {
-    // A specified height/width will just constrain the maximum length.
-    max = std::min(max, extent);
-  }
-
-  // Constrain and convert the value back to content-box.
-  size = std::min(size, max);
-  return size - extra;
-}
-
 }  // namespace
 
 NGColumnLayoutAlgorithm::NGColumnLayoutAlgorithm(
     NGBlockNode node,
+    const NGFragmentGeometry& fragment_geometry,
     const NGConstraintSpace& space,
     const NGBreakToken* break_token)
-    : NGLayoutAlgorithm(node, space, To<NGBlockBreakToken>(break_token)) {
+    : NGLayoutAlgorithm(node, space, To<NGBlockBreakToken>(break_token)),
+      border_padding_(fragment_geometry.border + fragment_geometry.padding),
+      border_scrollbar_padding_(border_padding_ + fragment_geometry.scrollbar) {
   container_builder_.SetIsNewFormattingContext(space.IsNewFormattingContext());
+  container_builder_.SetInitialFragmentGeometry(fragment_geometry);
 }
 
 scoped_refptr<const NGLayoutResult> NGColumnLayoutAlgorithm::Layout() {
-  // TODO(layout-dev): Store some combination of border, scrollbar, padding on
-  // this class.
-  NGBoxStrut borders = ComputeBorders(ConstraintSpace(), Node());
-  NGBoxStrut scrollbars = Node().GetScrollbarSizes();
-  NGBoxStrut padding = ComputePadding(ConstraintSpace(), Style()) +
-                       ComputeIntrinsicPadding(ConstraintSpace(), Node());
-  NGBoxStrut border_scrollbar_padding = borders + scrollbars + padding;
-  LogicalSize border_box_size =
-      CalculateBorderBoxSize(ConstraintSpace(), Node(), borders + padding);
+  LogicalSize border_box_size = container_builder_.InitialBorderBoxSize();
   LogicalSize content_box_size =
-      ShrinkAvailableSize(border_box_size, border_scrollbar_padding);
+      ShrinkAvailableSize(border_box_size, border_scrollbar_padding_);
   LogicalSize column_size = CalculateColumnSize(content_box_size);
 
   WritingMode writing_mode = ConstraintSpace().GetWritingMode();
@@ -96,7 +52,7 @@
   // Omit leading border+padding+scrollbar for all fragments but the first.
   LayoutUnit column_block_offset = IsResumingLayout(BreakToken())
                                        ? LayoutUnit()
-                                       : border_scrollbar_padding.block_start;
+                                       : border_scrollbar_padding_.block_start;
 
   // Figure out how much space we've already been able to process in previous
   // fragments, if this multicol container participates in an outer
@@ -150,7 +106,7 @@
     }
 
     LayoutUnit intrinsic_block_size;
-    LayoutUnit column_inline_offset(border_scrollbar_padding.inline_start);
+    LayoutUnit column_inline_offset(border_scrollbar_padding_.inline_start);
     int actual_column_count = 0;
     int forced_break_count = 0;
 
@@ -168,8 +124,11 @@
       NGConstraintSpace child_space = CreateConstraintSpaceForColumns(
           column_size, separate_leading_margins);
 
-      NGBlockLayoutAlgorithm child_algorithm(Node(), child_space,
-                                             break_token.get());
+      NGFragmentGeometry fragment_geometry =
+          CalculateInitialFragmentGeometry(child_space, Node());
+
+      NGBlockLayoutAlgorithm child_algorithm(Node(), fragment_geometry,
+                                             child_space, break_token.get());
       child_algorithm.SetBoxType(NGPhysicalFragment::kColumnBox);
       scoped_refptr<const NGLayoutResult> result = child_algorithm.Layout();
       const auto* column =
@@ -226,7 +185,7 @@
         if (previously_used_block_size)
           used_block_size += previously_used_block_size;
         else
-          fragment_block_size += border_scrollbar_padding.block_start;
+          fragment_block_size += border_scrollbar_padding_.block_start;
         container_builder_.SetUsedBlockSize(used_block_size);
         container_builder_.SetBlockSize(fragment_block_size);
         container_builder_.SetDidBreak();
@@ -266,10 +225,6 @@
     break;
   } while (true);
 
-  NGOutOfFlowLayoutPart(Node(), ConstraintSpace(), borders + scrollbars,
-                        &container_builder_)
-      .Run();
-
   // TODO(mstensho): Propagate baselines.
 
   // If we need another fragment for this multicol container (because we're
@@ -279,7 +234,8 @@
     LayoutUnit block_size;
     if (border_box_size.block_size == kIndefiniteSize) {
       // Get the block size from the columns if it's auto.
-      block_size = column_size.block_size + border_scrollbar_padding.BlockSum();
+      block_size =
+          column_size.block_size + border_scrollbar_padding_.BlockSum();
     } else {
       // TODO(mstensho): end border and padding may overflow the parent
       // fragmentainer, and we should avoid that.
@@ -288,9 +244,11 @@
     container_builder_.SetBlockSize(block_size);
   }
 
-  container_builder_.SetInlineSize(border_box_size.inline_size);
-  container_builder_.SetBorders(ComputeBorders(ConstraintSpace(), Node()));
-  container_builder_.SetPadding(ComputePadding(ConstraintSpace(), Style()));
+  NGOutOfFlowLayoutPart(
+      Node(), ConstraintSpace(),
+      container_builder_.Borders() + container_builder_.Scrollbar(),
+      &container_builder_)
+      .Run();
 
   return container_builder_.ToBoxFragment();
 }
@@ -298,7 +256,10 @@
 base::Optional<MinMaxSize> NGColumnLayoutAlgorithm::ComputeMinMaxSize(
     const MinMaxSizeInput& input) const {
   // First calculate the min/max sizes of columns.
-  NGBlockLayoutAlgorithm algorithm(Node(), ConstraintSpace());
+  NGConstraintSpace space = CreateConstraintSpaceForMinMax();
+  NGFragmentGeometry fragment_geometry =
+      CalculateInitialMinMaxFragmentGeometry(space, Node());
+  NGBlockLayoutAlgorithm algorithm(Node(), fragment_geometry, space);
   MinMaxSizeInput child_input(input);
   child_input.size_type = NGMinMaxSizeType::kContentBoxSize;
   base::Optional<MinMaxSize> min_max_sizes =
@@ -324,9 +285,7 @@
   sizes += column_gap * (column_count - 1);
 
   if (input.size_type == NGMinMaxSizeType::kBorderBoxSize) {
-    LayoutUnit border_scrollbar_padding =
-        CalculateBorderScrollbarPadding(ConstraintSpace(), node_).InlineSum();
-    sizes += border_scrollbar_padding;
+    sizes += border_scrollbar_padding_.InlineSum();
   }
 
   return sizes;
@@ -358,8 +317,10 @@
   // make us lay out all the multicol content as one single tall strip. When
   // we're done with this layout pass, we can examine the result and calculate
   // an ideal column block size.
-  NGConstraintSpace space = CreateConstaintSpaceForBalancing(column_size);
-  NGBlockLayoutAlgorithm balancing_algorithm(Node(), space);
+  NGConstraintSpace space = CreateConstraintSpaceForBalancing(column_size);
+  NGFragmentGeometry fragment_geometry =
+      CalculateInitialFragmentGeometry(space, Node());
+  NGBlockLayoutAlgorithm balancing_algorithm(Node(), fragment_geometry, space);
   scoped_refptr<const NGLayoutResult> result = balancing_algorithm.Layout();
 
   // TODO(mstensho): This is where the fun begins. We need to examine the entire
@@ -376,7 +337,7 @@
       single_strip_block_size.ToFloat() / static_cast<float>(column_count));
 
   // Finally, honor {,min-,max-}{height,width} properties.
-  return ConstrainColumnBlockSize(block_size, Node(), ConstraintSpace());
+  return ConstrainColumnBlockSize(block_size);
 }
 
 LayoutUnit NGColumnLayoutAlgorithm::StretchColumnBlockSize(
@@ -387,7 +348,42 @@
     return current_column_size;
   LayoutUnit length = current_column_size + minimal_space_shortage;
   // Honor {,min-,max-}{height,width} properties.
-  return ConstrainColumnBlockSize(length, Node(), ConstraintSpace());
+  return ConstrainColumnBlockSize(length);
+}
+
+// Constrain a balanced column block size to not overflow the multicol
+// container.
+LayoutUnit NGColumnLayoutAlgorithm::ConstrainColumnBlockSize(
+    LayoutUnit size) const {
+  // The {,max-}{height,width} properties are specified on the multicol
+  // container, but here we're calculating the column block sizes inside the
+  // multicol container, which isn't exactly the same. We may shrink the column
+  // block size here, but we'll never stretch it, because the value passed is
+  // the perfect balanced block size. Making it taller would only disrupt the
+  // balanced output, for no reason. The only thing we need to worry about here
+  // is to not overflow the multicol container.
+
+  // First of all we need to convert the size to a value that can be compared
+  // against the resolved properties on the multicol container. That means that
+  // we have to convert the value from content-box to border-box.
+  LayoutUnit extra = border_scrollbar_padding_.BlockSum();
+  size += extra;
+
+  const ComputedStyle& style = Style();
+  LayoutUnit max = ResolveMaxBlockLength(
+      ConstraintSpace(), style, border_padding_, style.LogicalMaxHeight(), size,
+      LengthResolvePhase::kLayout);
+  LayoutUnit extent = ResolveMainBlockLength(
+      ConstraintSpace(), style, border_padding_, style.LogicalHeight(), size,
+      LengthResolvePhase::kLayout);
+  if (extent != kIndefiniteSize) {
+    // A specified height/width will just constrain the maximum length.
+    max = std::min(max, extent);
+  }
+
+  // Constrain and convert the value back to content-box.
+  size = std::min(size, max);
+  return size - extra;
 }
 
 NGConstraintSpace NGColumnLayoutAlgorithm::CreateConstraintSpaceForColumns(
@@ -417,7 +413,7 @@
   return space_builder.ToConstraintSpace();
 }
 
-NGConstraintSpace NGColumnLayoutAlgorithm::CreateConstaintSpaceForBalancing(
+NGConstraintSpace NGColumnLayoutAlgorithm::CreateConstraintSpaceForBalancing(
     const LogicalSize& column_size) const {
   NGConstraintSpaceBuilder space_builder(
       ConstraintSpace(), Style().GetWritingMode(), /* is_new_fc */ true);
@@ -429,4 +425,14 @@
   return space_builder.ToConstraintSpace();
 }
 
+NGConstraintSpace NGColumnLayoutAlgorithm::CreateConstraintSpaceForMinMax()
+    const {
+  NGConstraintSpaceBuilder space_builder(
+      ConstraintSpace(), Style().GetWritingMode(), /* is_new_fc */ true);
+  space_builder.SetIsAnonymous(true);
+  space_builder.SetIsIntermediateLayout(true);
+
+  return space_builder.ToConstraintSpace();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.h
index f6746720..9b8168b 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.h
@@ -22,6 +22,7 @@
                                NGBlockBreakToken> {
  public:
   NGColumnLayoutAlgorithm(NGBlockNode node,
+                          const NGFragmentGeometry&,
                           const NGConstraintSpace& space,
                           const NGBreakToken* break_token = nullptr);
 
@@ -43,11 +44,17 @@
       LayoutUnit current_column_size,
       LayoutUnit container_content_box_block_size) const;
 
+  LayoutUnit ConstrainColumnBlockSize(LayoutUnit size) const;
+
   NGConstraintSpace CreateConstraintSpaceForColumns(
       const LogicalSize& column_size,
       bool separate_leading_margins) const;
-  NGConstraintSpace CreateConstaintSpaceForBalancing(
+  NGConstraintSpace CreateConstraintSpaceForBalancing(
       const LogicalSize& column_size) const;
+  NGConstraintSpace CreateConstraintSpaceForMinMax() const;
+
+  const NGBoxStrut border_padding_;
+  const NGBoxStrut border_scrollbar_padding_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc
index 3cee17279..03c266f 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm_test.cc
@@ -7,6 +7,7 @@
 #include "third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_column_layout_algorithm.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_length_utils.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
 
 namespace blink {
@@ -30,8 +31,10 @@
   scoped_refptr<const NGPhysicalBoxFragment> RunBlockLayoutAlgorithm(
       const NGConstraintSpace& space,
       NGBlockNode node) {
+    NGFragmentGeometry fragment_geometry =
+        CalculateInitialFragmentGeometry(space, node);
     scoped_refptr<const NGLayoutResult> result =
-        NGBlockLayoutAlgorithm(node, space).Layout();
+        NGBlockLayoutAlgorithm(node, fragment_geometry, space).Layout();
 
     return To<NGPhysicalBoxFragment>(result->PhysicalFragment());
   }
@@ -1986,7 +1989,9 @@
   NGConstraintSpace space = ConstructBlockLayoutTestConstraintSpace(
       WritingMode::kHorizontalTb, TextDirection::kLtr,
       LogicalSize(LayoutUnit(1000), kIndefiniteSize));
-  NGColumnLayoutAlgorithm algorithm(node, space);
+  NGFragmentGeometry fragment_geometry =
+      CalculateInitialFragmentGeometry(space, node);
+  NGColumnLayoutAlgorithm algorithm(node, fragment_geometry, space);
   base::Optional<MinMaxSize> size;
   MinMaxSizeInput zero_input(
       /* percentage_resolution_block_size */ (LayoutUnit()));
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
index 34eab40..5428b83 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
@@ -20,10 +20,13 @@
 
 NGFieldsetLayoutAlgorithm::NGFieldsetLayoutAlgorithm(
     NGBlockNode node,
+    const NGFragmentGeometry& fragment_geometry,
     const NGConstraintSpace& space,
     const NGBreakToken* break_token)
-    : NGLayoutAlgorithm(node, space, To<NGBlockBreakToken>(break_token)) {
+    : NGLayoutAlgorithm(node, space, To<NGBlockBreakToken>(break_token)),
+      border_padding_(fragment_geometry.border + fragment_geometry.padding) {
   container_builder_.SetIsNewFormattingContext(space.IsNewFormattingContext());
+  container_builder_.SetInitialFragmentGeometry(fragment_geometry);
 }
 
 scoped_refptr<const NGLayoutResult> NGFieldsetLayoutAlgorithm::Layout() {
@@ -40,20 +43,19 @@
   // with the actual fieldset contents. Since scrollbars are handled by the
   // anonymous child box, and since padding is inside the scrollport, padding
   // also needs to be handled by the anonymous child.
-  NGBoxStrut borders = ComputeBorders(ConstraintSpace(), Node());
-  NGBoxStrut padding = ComputePadding(ConstraintSpace(), Style());
-  NGBoxStrut border_padding = borders + padding;
-  LogicalSize border_box_size =
-      CalculateBorderBoxSize(ConstraintSpace(), Node(), border_padding);
+  NGBoxStrut borders = container_builder_.Borders();
+  NGBoxStrut padding = container_builder_.Padding();
+  LogicalSize border_box_size = container_builder_.InitialBorderBoxSize();
   const auto writing_mode = ConstraintSpace().GetWritingMode();
-  LayoutUnit block_start_padding_edge = borders.block_start;
+  LayoutUnit block_start_padding_edge =
+      container_builder_.Borders().block_start;
 
   if (NGBlockNode legend = Node().GetRenderedLegend()) {
     // Lay out the legend. While the fieldset container normally ignores its
     // padding, the legend is laid out within what would have been the content
     // box had the fieldset been a regular block with no weirdness.
     LogicalSize content_box_size =
-        ShrinkAvailableSize(border_box_size, border_padding);
+        ShrinkAvailableSize(border_box_size, border_padding_);
     auto legend_space =
         CreateConstraintSpaceForLegend(legend, content_box_size);
     auto result = legend.Layout(legend_space, BreakToken());
@@ -66,9 +68,9 @@
     // that the center of the border will be flush with the center of the
     // border-box of the legend.
     // TODO(mstensho): inline alignment
-    LogicalOffset legend_offset =
-        LogicalOffset(border_padding.inline_start + legend_margins.inline_start,
-                      legend_margins.block_start);
+    LogicalOffset legend_offset = LogicalOffset(
+        border_padding_.inline_start + legend_margins.inline_start,
+        legend_margins.block_start);
     LayoutUnit legend_margin_box_block_size =
         logical_fragment.BlockSize() + legend_margins.BlockSum();
     LayoutUnit space_left = borders.block_start - legend_margin_box_block_size;
@@ -114,7 +116,7 @@
 
   // Recompute the block-axis size now that we know our content size.
   border_box_size.block_size = ComputeBlockSizeForFragment(
-      ConstraintSpace(), Style(), border_padding, intrinsic_block_size);
+      ConstraintSpace(), Style(), border_padding_, intrinsic_block_size);
 
   // The above computation utility knows nothing about fieldset weirdness. The
   // legend may eat from the available content box block size. Make room for
@@ -125,11 +127,8 @@
       std::max(border_box_size.block_size, minimum_border_box_block_size);
 
   container_builder_.SetIsFieldsetContainer();
-  container_builder_.SetInlineSize(border_box_size.inline_size);
   container_builder_.SetIntrinsicBlockSize(intrinsic_block_size);
   container_builder_.SetBlockSize(border_box_size.block_size);
-  container_builder_.SetBorders(borders);
-  container_builder_.SetPadding(padding);
 
   NGOutOfFlowLayoutPart(Node(), ConstraintSpace(), borders_with_legend,
                         &container_builder_)
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h
index e8aa659..007a393 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h
@@ -21,8 +21,9 @@
                                NGBoxFragmentBuilder,
                                NGBlockBreakToken> {
  public:
-  NGFieldsetLayoutAlgorithm(NGBlockNode node,
-                            const NGConstraintSpace& space,
+  NGFieldsetLayoutAlgorithm(NGBlockNode,
+                            const NGFragmentGeometry& fragment_geometry,
+                            const NGConstraintSpace&,
                             const NGBreakToken* break_token = nullptr);
 
   scoped_refptr<const NGLayoutResult> Layout() override;
@@ -35,6 +36,8 @@
       LogicalSize available_size);
   const NGConstraintSpace CreateConstraintSpaceForFieldsetContent(
       LogicalSize padding_box_size);
+
+  const NGBoxStrut border_padding_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
index d372120..78272457 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm_test.cc
@@ -6,6 +6,7 @@
 
 #include "third_party/blink/renderer/core/layout/ng/ng_base_layout_algorithm_test.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_length_utils.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.h"
 
 namespace blink {
@@ -32,8 +33,10 @@
   scoped_refptr<const NGPhysicalBoxFragment> RunBlockLayoutAlgorithm(
       const NGConstraintSpace& space,
       NGBlockNode node) {
+    NGFragmentGeometry fragment_geometry =
+        CalculateInitialFragmentGeometry(space, node);
     scoped_refptr<const NGLayoutResult> result =
-        NGBlockLayoutAlgorithm(node, space).Layout();
+        NGBlockLayoutAlgorithm(node, fragment_geometry, space).Layout();
 
     return To<NGPhysicalBoxFragment>(result->PhysicalFragment());
   }
@@ -51,8 +54,10 @@
     NGConstraintSpace space = ConstructBlockLayoutTestConstraintSpace(
         WritingMode::kHorizontalTb, TextDirection::kLtr,
         LogicalSize(LayoutUnit(), LayoutUnit()));
+    NGFragmentGeometry fragment_geometry =
+        CalculateInitialMinMaxFragmentGeometry(space, node);
 
-    NGFieldsetLayoutAlgorithm algorithm(node, space);
+    NGFieldsetLayoutAlgorithm algorithm(node, fragment_geometry, space);
     MinMaxSizeInput input(
         /* percentage_resolution_block_size */ (LayoutUnit()));
     auto min_max = algorithm.ComputeMinMaxSize(input);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
index 21989bae..023ed28f 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
@@ -19,17 +19,17 @@
 
 namespace blink {
 
-NGFlexLayoutAlgorithm::NGFlexLayoutAlgorithm(NGBlockNode node,
-                                             const NGConstraintSpace& space,
-                                             const NGBreakToken* break_token)
+NGFlexLayoutAlgorithm::NGFlexLayoutAlgorithm(
+    NGBlockNode node,
+    const NGFragmentGeometry& fragment_geometry,
+    const NGConstraintSpace& space,
+    const NGBreakToken* break_token)
     : NGLayoutAlgorithm(node, space, To<NGBlockBreakToken>(break_token)),
-      border_scrollbar_padding_(
-          CalculateBorderScrollbarPadding(ConstraintSpace(), Node())),
-      borders_(ComputeBorders(ConstraintSpace(), Node())),
-      padding_(ComputePadding(ConstraintSpace(), Style())),
-      border_padding_(borders_ + padding_),
+      border_padding_(fragment_geometry.border + fragment_geometry.padding),
+      border_scrollbar_padding_(border_padding_ + fragment_geometry.scrollbar),
       is_column_(Style().IsColumnFlexDirection()) {
   container_builder_.SetIsNewFormattingContext(space.IsNewFormattingContext());
+  container_builder_.SetInitialFragmentGeometry(fragment_geometry);
 }
 
 bool NGFlexLayoutAlgorithm::MainAxisIsInlineAxis(NGBlockNode child) {
@@ -243,8 +243,7 @@
 }
 
 scoped_refptr<const NGLayoutResult> NGFlexLayoutAlgorithm::Layout() {
-  border_box_size_ =
-      CalculateBorderBoxSize(ConstraintSpace(), Node(), border_padding_);
+  border_box_size_ = container_builder_.InitialBorderBoxSize();
   content_box_size_ =
       ShrinkAvailableSize(border_box_size_, border_scrollbar_padding_);
 
@@ -320,18 +319,16 @@
       ConstraintSpace(), Style(), border_padding_, intrinsic_block_size);
 
   container_builder_.SetBlockSize(block_size);
-  container_builder_.SetInlineSize(border_box_size_.inline_size);
-  container_builder_.SetBorders(borders_);
-  container_builder_.SetPadding(padding_);
   container_builder_.SetIntrinsicBlockSize(
       algorithm_->IntrinsicContentBlockSize() +
       border_scrollbar_padding_.BlockSum());
 
   GiveLinesAndItemsFinalPositionAndSize();
 
-  NGOutOfFlowLayoutPart(Node(), ConstraintSpace(),
-                        borders_ + Node().GetScrollbarSizes(),
-                        &container_builder_)
+  NGOutOfFlowLayoutPart(
+      Node(), ConstraintSpace(),
+      container_builder_.Borders() + Node().GetScrollbarSizes(),
+      &container_builder_)
       .Run();
 
   return container_builder_.ToBoxFragment();
@@ -407,7 +404,7 @@
 
   LayoutUnit child_percentage_resolution_block_size =
       CalculateChildPercentageBlockSizeForMinMax(
-          ConstraintSpace(), Node(), borders_ + padding_,
+          ConstraintSpace(), Node(), border_padding_,
           input.percentage_resolution_block_size);
 
   // Use default MinMaxSizeInput:
diff --git a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.h
index 30bb939..d40fad3 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.h
@@ -23,6 +23,7 @@
                                NGBlockBreakToken> {
  public:
   NGFlexLayoutAlgorithm(NGBlockNode,
+                        const NGFragmentGeometry&,
                         const NGConstraintSpace&,
                         const NGBreakToken*);
 
@@ -45,10 +46,8 @@
   // not reimplement.
   bool IsMultiline() const;
 
-  const NGBoxStrut border_scrollbar_padding_;
-  const NGBoxStrut borders_;
-  const NGBoxStrut padding_;
   const NGBoxStrut border_padding_;
+  const NGBoxStrut border_scrollbar_padding_;
   const bool is_column_;
   LogicalSize border_box_size_;
   LogicalSize content_box_size_;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
index d25a146..a43218b6 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_fragment_builder.h
@@ -45,11 +45,6 @@
   LayoutUnit InlineSize() const { return size_.inline_size; }
   LayoutUnit BlockSize() const { return size_.block_size; }
   const LogicalSize& Size() const { return size_; }
-  NGFragmentBuilder& SetInlineSize(LayoutUnit inline_size) {
-    DCHECK_GE(inline_size, LayoutUnit());
-    size_.inline_size = inline_size;
-    return *this;
-  }
   void SetBlockSize(LayoutUnit block_size) { size_.block_size = block_size; }
 
   const LayoutObject* GetLayoutObject() const { return layout_object_; }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_inline_layout_test.cc b/third_party/blink/renderer/core/layout/ng/ng_inline_layout_test.cc
index 60f3c5b..babd1f6 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_inline_layout_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_inline_layout_test.cc
@@ -8,6 +8,7 @@
 #include "third_party/blink/renderer/core/layout/ng/ng_block_layout_algorithm.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_constraint_space_builder.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_layout_result.h"
+#include "third_party/blink/renderer/core/layout/ng/ng_length_utils.h"
 #include "third_party/blink/renderer/core/testing/sim/sim_compositor.h"
 #include "third_party/blink/renderer/core/testing/sim/sim_request.h"
 #include "third_party/blink/renderer/core/testing/sim/sim_test.h"
@@ -47,8 +48,11 @@
   NGConstraintSpace constraint_space = ConstraintSpaceForElement(block_flow);
   NGBlockNode node(block_flow);
 
+  NGFragmentGeometry fragment_geometry =
+      CalculateInitialFragmentGeometry(constraint_space, node);
   scoped_refptr<const NGLayoutResult> result =
-      NGBlockLayoutAlgorithm(node, constraint_space).Layout();
+      NGBlockLayoutAlgorithm(node, fragment_geometry, constraint_space)
+          .Layout();
   EXPECT_TRUE(result);
 
   String expected_text("Hello World!");
@@ -72,8 +76,11 @@
   NGConstraintSpace constraint_space = ConstraintSpaceForElement(block_flow);
   NGBlockNode node(block_flow);
 
+  NGFragmentGeometry fragment_geometry =
+      CalculateInitialFragmentGeometry(constraint_space, node);
   scoped_refptr<const NGLayoutResult> result =
-      NGBlockLayoutAlgorithm(node, constraint_space).Layout();
+      NGBlockLayoutAlgorithm(node, fragment_geometry, constraint_space)
+          .Layout();
   EXPECT_TRUE(result);
 
   StringBuilder expected_text;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
index a46b55dc..34e10925 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.cc
@@ -1,4 +1,4 @@
-// Copyright 2016 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.
 
@@ -957,6 +957,30 @@
   return IsLtr(direction) ? line_offset : space_left - line_offset;
 }
 
+namespace {
+
+// Calculates default content size for html and body elements in quirks mode.
+// Returns |kIndefiniteSize| in all other cases.
+LayoutUnit CalculateDefaultBlockSize(
+    const NGConstraintSpace& space,
+    const NGBlockNode& node,
+    const NGBoxStrut& border_scrollbar_padding) {
+  // In quirks mode, html and body elements will completely fill the ICB, block
+  // percentages should resolve against this size.
+  if (node.IsQuirkyAndFillsViewport()) {
+    LayoutUnit block_size = space.AvailableSize().block_size;
+    block_size -= ComputeMarginsForSelf(space, node.Style()).BlockSum();
+    return std::max(block_size.ClampNegativeToZero(),
+                    border_scrollbar_padding.BlockSum());
+  }
+  return kIndefiniteSize;
+}
+
+// Clamp the inline size of the scrollbar, unless it's larger than the inline
+// size of the content box, in which case we'll return that instead. Scrollbar
+// handling is quite bad in such situations, and this method here is just to
+// make sure that left-hand scrollbars don't mess up scrollWidth. For the full
+// story, visit http://crbug.com/724255.
 bool ClampScrollbarToContentBox(NGBoxStrut* scrollbars,
                                 LayoutUnit content_box_inline_size) {
   DCHECK(scrollbars->InlineSum());
@@ -972,41 +996,58 @@
   return true;
 }
 
-NGBoxStrut CalculateBorderScrollbarPadding(
-    const NGConstraintSpace& constraint_space,
-    const NGBlockNode node) {
-  // If we are producing an anonymous fragment (e.g. a column), it has no
-  // borders, padding or scrollbars. Using the ones from the container can only
-  // cause trouble.
-  if (constraint_space.IsAnonymous())
-    return NGBoxStrut();
-  return ComputeBorders(constraint_space, node) +
-         ComputePadding(constraint_space, node.Style()) +
-         ComputeIntrinsicPadding(constraint_space, node) +
-         node.GetScrollbarSizes();
-}
+}  // namespace
 
-LogicalSize CalculateBorderBoxSize(const NGConstraintSpace& constraint_space,
-                                   const NGBlockNode& node,
-                                   const NGBoxStrut& border_padding,
-                                   LayoutUnit block_content_size) {
+NGFragmentGeometry CalculateInitialFragmentGeometry(
+    const NGConstraintSpace& constraint_space,
+    const NGBlockNode& node) {
+  const ComputedStyle& style = node.Style();
+
+  NGBoxStrut border = ComputeBorders(constraint_space, node);
+  NGBoxStrut padding = ComputePadding(constraint_space, style);
+  NGBoxStrut scrollbar =
+      constraint_space.IsAnonymous() ? NGBoxStrut() : node.GetScrollbarSizes();
+  NGBoxStrut border_padding = border + padding;
+  NGBoxStrut border_scrollbar_padding = border_padding + scrollbar;
+
   // If we have a percentage size, we need to set the
-  // HasPercentHeightDescendants flag correctly so that flexboz knows it may
+  // HasPercentHeightDescendants flag correctly so that flexbox knows it may
   // need to redo layout and can also do some performance optimizations.
-  if (node.Style().LogicalHeight().IsPercentOrCalc() ||
-      node.Style().LogicalMinHeight().IsPercentOrCalc() ||
-      node.Style().LogicalMaxHeight().IsPercentOrCalc() ||
-      (node.GetLayoutBox()->IsFlexItemIncludingNG() &&
-       node.Style().FlexBasis().IsPercentOrCalc())) {
+  if (style.LogicalHeight().IsPercentOrCalc() ||
+      style.LogicalMinHeight().IsPercentOrCalc() ||
+      style.LogicalMaxHeight().IsPercentOrCalc() ||
+      (node.IsFlexItem() && style.FlexBasis().IsPercentOrCalc())) {
     // This call has the side-effect of setting HasPercentHeightDescendants
     // correctly.
     node.GetLayoutBox()->ComputePercentageLogicalHeight(Length::Percent(0));
   }
 
-  return LogicalSize(
+  LayoutUnit default_block_size = CalculateDefaultBlockSize(
+      constraint_space, node, border_scrollbar_padding);
+  LogicalSize border_box_size(
       ComputeInlineSizeForFragment(constraint_space, node, border_padding),
       ComputeBlockSizeForFragment(constraint_space, node.Style(),
-                                  border_padding, block_content_size));
+                                  border_padding, default_block_size));
+
+  if (UNLIKELY(border_box_size.inline_size <
+                   border_scrollbar_padding.InlineSum() &&
+               scrollbar.InlineSum() && !constraint_space.IsAnonymous())) {
+    ClampScrollbarToContentBox(
+        &scrollbar, border_box_size.inline_size - border_padding.InlineSum());
+  }
+
+  return {border_box_size, border, scrollbar, padding};
+}
+
+NGFragmentGeometry CalculateInitialMinMaxFragmentGeometry(
+    const NGConstraintSpace& constraint_space,
+    const NGBlockNode& node) {
+  NGBoxStrut border = ComputeBorders(constraint_space, node);
+  NGBoxStrut padding = ComputePadding(constraint_space, node.Style());
+  NGBoxStrut scrollbar =
+      constraint_space.IsAnonymous() ? NGBoxStrut() : node.GetScrollbarSizes();
+
+  return {/* border_box_size */ LogicalSize(), border, scrollbar, padding};
 }
 
 LogicalSize ShrinkAvailableSize(LogicalSize size, const NGBoxStrut& inset) {
@@ -1022,21 +1063,6 @@
   return size;
 }
 
-LayoutUnit CalculateDefaultBlockSize(
-    const NGConstraintSpace& space,
-    const NGBlockNode& node,
-    const NGBoxStrut& border_scrollbar_padding) {
-  // In quirks mode, html and body elements will completely fill the ICB, block
-  // percentages should resolve against this size.
-  if (node.IsQuirkyAndFillsViewport()) {
-    LayoutUnit block_size = space.AvailableSize().block_size;
-    block_size -= ComputeMarginsForSelf(space, node.Style()).BlockSum();
-    return std::max(block_size.ClampNegativeToZero(),
-                    border_scrollbar_padding.BlockSum());
-  }
-  return kIndefiniteSize;
-}
-
 namespace {
 
 // Implements the common part of the child percentage size calculation. Deals
diff --git a/third_party/blink/renderer/core/layout/ng/ng_length_utils.h b/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
index 3311fdbc..fefcd6c 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_length_utils.h
@@ -11,6 +11,7 @@
 #include "third_party/blink/renderer/core/layout/geometry/physical_size.h"
 #include "third_party/blink/renderer/core/layout/min_max_size.h"
 #include "third_party/blink/renderer/core/layout/ng/geometry/ng_box_strut.h"
+#include "third_party/blink/renderer/core/layout/ng/geometry/ng_fragment_geometry.h"
 #include "third_party/blink/renderer/core/layout/ng/ng_constraint_space.h"
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/core/style/computed_style_constants.h"
@@ -421,38 +422,24 @@
   return std::max(min, std::min(length, max));
 }
 
-// Clamp the inline size of the scrollbar, unless it's larger than the inline
-// size of the content box, in which case we'll return that instead. Scrollbar
-// handling is quite bad in such situations, and this method here is just to
-// make sure that left-hand scrollbars don't mess up scrollWidth. For the full
-// story, visit http://crbug.com/724255.
-bool ClampScrollbarToContentBox(NGBoxStrut* scrollbars,
-                                LayoutUnit content_box_inline_size);
+// Calculates the initial (pre-layout) fragment geometry given a node, and a
+// constraint space.
+// The "pre-layout" block-size may be indefinite, as we'll only have enough
+// information to determine this post-layout.
+CORE_EXPORT NGFragmentGeometry
+CalculateInitialFragmentGeometry(const NGConstraintSpace&, const NGBlockNode&);
 
-NGBoxStrut CalculateBorderScrollbarPadding(
-    const NGConstraintSpace& constraint_space,
-    const NGBlockNode node);
-
-// border_padding can be passed in as an optimization; otherwise this function
-// will compute it itself.
-LogicalSize CalculateBorderBoxSize(
-    const NGConstraintSpace& constraint_space,
-    const NGBlockNode& node,
-    const NGBoxStrut& border_padding,
-    LayoutUnit block_content_size = kIndefiniteSize);
+// Similar to |CalculateInitialFragmentGeometry| however will only calculate
+// the border, scrollbar, and padding (resolving percentages to zero).
+CORE_EXPORT NGFragmentGeometry
+CalculateInitialMinMaxFragmentGeometry(const NGConstraintSpace&,
+                                       const NGBlockNode&);
 
 // Shrink and return the available size by an inset. This may e.g. be used to
 // convert from border-box to content-box size. Indefinite block size is
 // allowed, in which case the inset will be ignored for block size.
 LogicalSize ShrinkAvailableSize(LogicalSize size, const NGBoxStrut& inset);
 
-// Calculates default content size for html and body elements in quirks mode.
-// Returns kIndefiniteSize in all other cases.
-LayoutUnit CalculateDefaultBlockSize(
-    const NGConstraintSpace&,
-    const NGBlockNode&,
-    const NGBoxStrut& border_scrollbar_padding);
-
 // Calculates the percentage resolution size that children of the node should
 // use.
 LogicalSize CalculateChildPercentageSize(
diff --git a/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc
index e3d56f77..ab29773 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.cc
@@ -16,38 +16,39 @@
 
 namespace blink {
 
-NGPageLayoutAlgorithm::NGPageLayoutAlgorithm(NGBlockNode node,
-                                             const NGConstraintSpace& space,
-                                             const NGBreakToken* break_token)
-    : NGLayoutAlgorithm(node, space, To<NGBlockBreakToken>(break_token)) {
+NGPageLayoutAlgorithm::NGPageLayoutAlgorithm(
+    NGBlockNode node,
+    const NGFragmentGeometry& fragment_geometry,
+    const NGConstraintSpace& space,
+    const NGBreakToken* break_token)
+    : NGLayoutAlgorithm(node, space, To<NGBlockBreakToken>(break_token)),
+      border_padding_(fragment_geometry.border + fragment_geometry.padding),
+      border_scrollbar_padding_(border_padding_ + fragment_geometry.scrollbar) {
   container_builder_.SetIsNewFormattingContext(space.IsNewFormattingContext());
+  container_builder_.SetInitialFragmentGeometry(fragment_geometry);
 }
 
 scoped_refptr<const NGLayoutResult> NGPageLayoutAlgorithm::Layout() {
-  NGBoxStrut borders = ComputeBorders(ConstraintSpace(), Node());
-  NGBoxStrut scrollbars = Node().GetScrollbarSizes();
-  NGBoxStrut padding = ComputePadding(ConstraintSpace(), Style());
-  NGBoxStrut border_scrollbar_padding = borders + scrollbars + padding;
-  LogicalSize border_box_size =
-      CalculateBorderBoxSize(ConstraintSpace(), Node(), borders + padding);
+  LogicalSize border_box_size = container_builder_.InitialBorderBoxSize();
   LogicalSize content_box_size =
-      ShrinkAvailableSize(border_box_size, border_scrollbar_padding);
+      ShrinkAvailableSize(border_box_size, border_scrollbar_padding_);
   LogicalSize page_size = content_box_size;
 
   NGConstraintSpace child_space = CreateConstraintSpaceForPages(page_size);
-  container_builder_.SetInlineSize(border_box_size.inline_size);
 
   WritingMode writing_mode = ConstraintSpace().GetWritingMode();
   scoped_refptr<const NGBlockBreakToken> break_token = BreakToken();
   LayoutUnit intrinsic_block_size;
-  LogicalOffset page_offset(border_scrollbar_padding.StartOffset());
+  LogicalOffset page_offset(border_scrollbar_padding_.StartOffset());
   // TODO(mstensho): Handle auto block size.
   LogicalOffset page_progression(LayoutUnit(), page_size.block_size);
 
   do {
     // Lay out one page. Each page will become a fragment.
-    NGBlockLayoutAlgorithm child_algorithm(Node(), child_space,
-                                           break_token.get());
+    NGFragmentGeometry fragment_geometry =
+        CalculateInitialFragmentGeometry(child_space, Node());
+    NGBlockLayoutAlgorithm child_algorithm(Node(), fragment_geometry,
+                                           child_space, break_token.get());
     scoped_refptr<const NGLayoutResult> result = child_algorithm.Layout();
     const auto* page = To<NGPhysicalBoxFragment>(result->PhysicalFragment());
 
@@ -66,13 +67,13 @@
 
   // Recompute the block-axis size now that we know our content size.
   border_box_size.block_size = ComputeBlockSizeForFragment(
-      ConstraintSpace(), Style(), borders + padding, intrinsic_block_size);
+      ConstraintSpace(), Style(), border_padding_, intrinsic_block_size);
   container_builder_.SetBlockSize(border_box_size.block_size);
-  container_builder_.SetBorders(ComputeBorders(ConstraintSpace(), Node()));
-  container_builder_.SetPadding(ComputePadding(ConstraintSpace(), Style()));
 
-  NGOutOfFlowLayoutPart(Node(), ConstraintSpace(), borders + scrollbars,
-                        &container_builder_)
+  NGOutOfFlowLayoutPart(
+      Node(), ConstraintSpace(),
+      container_builder_.Borders() + container_builder_.Scrollbar(),
+      &container_builder_)
       .Run();
 
   // TODO(mstensho): Propagate baselines.
@@ -82,7 +83,10 @@
 
 base::Optional<MinMaxSize> NGPageLayoutAlgorithm::ComputeMinMaxSize(
     const MinMaxSizeInput& input) const {
-  NGBlockLayoutAlgorithm algorithm(Node(), ConstraintSpace());
+  NGFragmentGeometry fragment_geometry =
+      CalculateInitialMinMaxFragmentGeometry(ConstraintSpace(), Node());
+  NGBlockLayoutAlgorithm algorithm(Node(), fragment_geometry,
+                                   ConstraintSpace());
   return algorithm.ComputeMinMaxSize(input);
 }
 
diff --git a/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.h
index 73e4690a6..545128e 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_page_layout_algorithm.h
@@ -23,6 +23,7 @@
                                NGBlockBreakToken> {
  public:
   NGPageLayoutAlgorithm(NGBlockNode node,
+                        const NGFragmentGeometry& fragment_geometry,
                         const NGConstraintSpace& space,
                         const NGBreakToken* break_token = nullptr);
 
@@ -34,6 +35,9 @@
  private:
   NGConstraintSpace CreateConstraintSpaceForPages(
       const LogicalSize& size) const;
+
+  NGBoxStrut border_padding_;
+  NGBoxStrut border_scrollbar_padding_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
index 904a30f..b96f1eb 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_physical_box_fragment.cc
@@ -59,10 +59,12 @@
               : kFragmentBox,
           builder->BoxType()),
       baselines_(builder->baselines_),
-      borders_(builder->borders_.ConvertToPhysical(builder->GetWritingMode(),
-                                                   builder->Direction())),
-      padding_(builder->padding_.ConvertToPhysical(builder->GetWritingMode(),
-                                                   builder->Direction())) {
+      borders_(builder->initial_fragment_geometry_->border.ConvertToPhysical(
+          builder->GetWritingMode(),
+          builder->Direction())),
+      padding_(builder->initial_fragment_geometry_->padding.ConvertToPhysical(
+          builder->GetWritingMode(),
+          builder->Direction())) {
   DCHECK(GetLayoutObject() && GetLayoutObject()->IsBoxModelObject());
   is_fieldset_container_ = builder->is_fieldset_container_;
   is_legacy_layout_root_ = builder->is_legacy_layout_root_;
diff --git a/third_party/blink/renderer/core/loader/modulescript/installed_service_worker_module_script_fetcher.cc b/third_party/blink/renderer/core/loader/modulescript/installed_service_worker_module_script_fetcher.cc
index 0f6db12..e94a1132 100644
--- a/third_party/blink/renderer/core/loader/modulescript/installed_service_worker_module_script_fetcher.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/installed_service_worker_module_script_fetcher.cc
@@ -55,10 +55,8 @@
           kDoNotSupportReferrerPolicyLegacyKeywords, &response_referrer_policy);
     }
 
-    global_scope_->Initialize(response_url, response_referrer_policy);
-
-    // TODO(nhiroki): Move this call into WorkerGlobalScope::Initialize().
-    global_scope_->SetAddressSpace(script_data->GetResponseAddressSpace());
+    global_scope_->Initialize(response_url, response_referrer_policy,
+                              script_data->GetResponseAddressSpace());
 
     // TODO(nhiroki): Set CSP etc (https://crbug.com/937757).
   }
diff --git a/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc b/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc
index 2acf1222..1a65e36f 100644
--- a/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc
+++ b/third_party/blink/renderer/core/loader/modulescript/worker_module_script_fetcher.cc
@@ -90,9 +90,6 @@
           kDoNotSupportReferrerPolicyLegacyKeywords, &response_referrer_policy);
     }
 
-    // Step 12.3-12.5 are implemented in Initialize().
-    global_scope_->Initialize(response_url, response_referrer_policy);
-
     // Calculate an address space from worker script's response url according to
     // the "CORS and RFC1918" spec:
     // https://wicg.github.io/cors-rfc1918/#integration-html
@@ -109,7 +106,10 @@
     }
     if (SecurityOrigin::Create(response_url)->IsLocalhost())
       response_address_space = mojom::IPAddressSpace::kLocal;
-    global_scope_->SetAddressSpace(response_address_space);
+
+    // Step 12.3-12.5 are implemented in Initialize().
+    global_scope_->Initialize(response_url, response_referrer_policy,
+                              response_address_space);
 
     // Step 12.6. "Execute the Initialize a global object's CSP list algorithm
     // on worker global scope and response. [CSP]" [spec text]
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
index 6a3136f..366ad30 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -80,7 +80,7 @@
       has_svg_hidden_container_ancestor(false),
       supports_composited_raster_invalidation(true) {}
 
-void VisualViewportPaintPropertyTreeBuilder::Update(
+PaintPropertyChangeType VisualViewportPaintPropertyTreeBuilder::Update(
     VisualViewport& visual_viewport,
     PaintPropertyTreeBuilderContext& full_context) {
   if (full_context.fragments.IsEmpty())
@@ -88,7 +88,8 @@
 
   PaintPropertyTreeBuilderFragmentContext& context = full_context.fragments[0];
 
-  visual_viewport.UpdatePaintPropertyNodesIfNeeded(context);
+  auto property_changed =
+      visual_viewport.UpdatePaintPropertyNodesIfNeeded(context);
 
   context.current.transform = visual_viewport.GetScrollTranslationNode();
   context.absolute_position.transform =
@@ -102,6 +103,7 @@
 #if DCHECK_IS_ON()
   paint_property_tree_printer::UpdateDebugNames(visual_viewport);
 #endif
+  return property_changed;
 }
 
 void PaintPropertyTreeBuilder::SetupContextForFrame(
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.h b/third_party/blink/renderer/core/paint/paint_property_tree_builder.h
index 7513c19..bf0c35a 100644
--- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.h
+++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.h
@@ -187,8 +187,10 @@
 
  public:
   // Update the paint properties for the visual viewport and ensure the context
-  // is up to date.
-  static void Update(VisualViewport&, PaintPropertyTreeBuilderContext&);
+  // is up to date. Returns the maximum paint property change type for any of
+  // the viewport nodes.
+  static PaintPropertyChangeType Update(VisualViewport&,
+                                        PaintPropertyTreeBuilderContext&);
 };
 
 // Creates paint property tree nodes for non-local effects in the layout tree.
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
index 9d00fbf..05d5a84 100644
--- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
+++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
@@ -50,10 +50,15 @@
   if (needs_tree_builder_context_update)
     GeometryMapper::ClearCache();
 
-  VisualViewportPaintPropertyTreeBuilder::Update(
+  auto property_changed = VisualViewportPaintPropertyTreeBuilder::Update(
       root_frame_view.GetPage()->GetVisualViewport(),
       *context_storage_.back().tree_builder_context);
 
+  if (property_changed >
+      PaintPropertyChangeType::kChangedOnlyCompositedValues) {
+    root_frame_view.SetPaintArtifactCompositorNeedsUpdate();
+  }
+
   Walk(root_frame_view);
   paint_invalidator_.ProcessPendingDelayedPaintInvalidations();
   context_storage_.pop_back();
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
index bab2adee..85b4f9e 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
@@ -73,9 +73,12 @@
   KURL response_script_url = creation_params->script_url;
   network::mojom::ReferrerPolicy response_referrer_policy =
       creation_params->referrer_policy;
+  mojom::IPAddressSpace response_address_space =
+      *creation_params->response_address_space;
   auto* global_scope = MakeGarbageCollected<DedicatedWorkerGlobalScope>(
       std::move(creation_params), thread, time_origin);
-  global_scope->Initialize(response_script_url, response_referrer_policy);
+  global_scope->Initialize(response_script_url, response_referrer_policy,
+                           response_address_space);
   return global_scope;
 }
 
@@ -94,7 +97,8 @@
 // https://html.spec.whatwg.org/C/#worker-processing-model
 void DedicatedWorkerGlobalScope::Initialize(
     const KURL& response_url,
-    network::mojom::ReferrerPolicy response_referrer_policy) {
+    network::mojom::ReferrerPolicy response_referrer_policy,
+    mojom::IPAddressSpace response_address_space) {
   // Step 12.3. "Set worker global scope's url to response's url."
   InitializeURL(response_url);
 
@@ -106,6 +110,9 @@
   // parsing the `Referrer-Policy` header of response."
   SetReferrerPolicy(response_referrer_policy);
 
+  // https://wicg.github.io/cors-rfc1918/#integration-html
+  SetAddressSpace(response_address_space);
+
   // TODO(nhiroki): Move the step 12.6 from DidFetchClassicScript() to this
   // function.
 }
@@ -245,10 +252,8 @@
   }
 
   // Step 12.3-12.5 are implemented in Initialize().
-  Initialize(classic_script_loader->ResponseURL(), response_referrer_policy);
-
-  // https://wicg.github.io/cors-rfc1918/#integration-html
-  SetAddressSpace(classic_script_loader->ResponseAddressSpace());
+  Initialize(classic_script_loader->ResponseURL(), response_referrer_policy,
+             classic_script_loader->ResponseAddressSpace());
 
   // Step 12.6. "Execute the Initialize a global object's CSP list algorithm
   // on worker global scope and response. [CSP]"
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.h b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.h
index 42c7499..3f2e870f 100644
--- a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.h
+++ b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.h
@@ -74,9 +74,9 @@
   const AtomicString& InterfaceName() const override;
 
   // Implements WorkerGlobalScope.
-  void Initialize(
-      const KURL& response_url,
-      network::mojom::ReferrerPolicy response_referrer_policy) override;
+  void Initialize(const KURL& response_url,
+                  network::mojom::ReferrerPolicy response_referrer_policy,
+                  mojom::IPAddressSpace response_address_space) override;
   void FetchAndRunClassicScript(
       const KURL& script_url,
       const FetchClientSettingsObjectSnapshot& outside_settings_object,
diff --git a/third_party/blink/renderer/core/workers/experimental/thread_pool_thread.cc b/third_party/blink/renderer/core/workers/experimental/thread_pool_thread.cc
index 0b4da858..c6d569d 100644
--- a/third_party/blink/renderer/core/workers/experimental/thread_pool_thread.cc
+++ b/third_party/blink/renderer/core/workers/experimental/thread_pool_thread.cc
@@ -36,11 +36,12 @@
   }
 
   // WorkerGlobalScope
-  void Initialize(
-      const KURL& response_url,
-      network::mojom::ReferrerPolicy response_referrer_policy) override {
+  void Initialize(const KURL& response_url,
+                  network::mojom::ReferrerPolicy response_referrer_policy,
+                  mojom::IPAddressSpace response_address_space) override {
     InitializeURL(response_url);
     SetReferrerPolicy(response_referrer_policy);
+    SetAddressSpace(response_address_space);
   }
   void FetchAndRunClassicScript(
       const KURL& script_url,
diff --git a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
index 866a6d4..027bac8 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
@@ -65,9 +65,12 @@
   KURL response_script_url = creation_params->script_url;
   network::mojom::ReferrerPolicy response_referrer_policy =
       creation_params->referrer_policy;
+  mojom::IPAddressSpace response_address_space =
+      *creation_params->response_address_space;
   auto* global_scope = MakeGarbageCollected<SharedWorkerGlobalScope>(
       std::move(creation_params), thread, time_origin);
-  global_scope->Initialize(response_script_url, response_referrer_policy);
+  global_scope->Initialize(response_script_url, response_referrer_policy,
+                           response_address_space);
   return global_scope;
 }
 
@@ -86,7 +89,8 @@
 // https://html.spec.whatwg.org/C/#worker-processing-model
 void SharedWorkerGlobalScope::Initialize(
     const KURL& response_url,
-    network::mojom::ReferrerPolicy response_referrer_policy) {
+    network::mojom::ReferrerPolicy response_referrer_policy,
+    mojom::IPAddressSpace response_address_space) {
   // Step 12.3. "Set worker global scope's url to response's url."
   InitializeURL(response_url);
 
@@ -98,6 +102,9 @@
   // parsing the `Referrer-Policy` header of response."
   SetReferrerPolicy(response_referrer_policy);
 
+  // https://wicg.github.io/cors-rfc1918/#integration-html
+  SetAddressSpace(response_address_space);
+
   // TODO(nhiroki): Move the step 12.6 from DidFetchClassicScript() to this
   // function.
 }
@@ -203,10 +210,8 @@
   }
 
   // Step 12.3-12.5 are implemented in Initialize().
-  Initialize(classic_script_loader->ResponseURL(), response_referrer_policy);
-
-  // https://wicg.github.io/cors-rfc1918/#integration-html
-  SetAddressSpace(classic_script_loader->ResponseAddressSpace());
+  Initialize(classic_script_loader->ResponseURL(), response_referrer_policy,
+             classic_script_loader->ResponseAddressSpace());
 
   // Step 12.6. "Execute the Initialize a global object's CSP list algorithm
   // on worker global scope and response. [CSP]"
diff --git a/third_party/blink/renderer/core/workers/shared_worker_global_scope.h b/third_party/blink/renderer/core/workers/shared_worker_global_scope.h
index d7966e1c..441ee296 100644
--- a/third_party/blink/renderer/core/workers/shared_worker_global_scope.h
+++ b/third_party/blink/renderer/core/workers/shared_worker_global_scope.h
@@ -68,9 +68,9 @@
   const AtomicString& InterfaceName() const override;
 
   // WorkerGlobalScope
-  void Initialize(
-      const KURL& response_url,
-      network::mojom::ReferrerPolicy response_referrer_policy) override;
+  void Initialize(const KURL& response_url,
+                  network::mojom::ReferrerPolicy response_referrer_policy,
+                  mojom::IPAddressSpace response_address_space) override;
   void FetchAndRunClassicScript(
       const KURL& script_url,
       const FetchClientSettingsObjectSnapshot& outside_settings_object,
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.cc b/third_party/blink/renderer/core/workers/worker_global_scope.cc
index f405b955..3c9ef2a 100644
--- a/third_party/blink/renderer/core/workers/worker_global_scope.cc
+++ b/third_party/blink/renderer/core/workers/worker_global_scope.cc
@@ -458,16 +458,6 @@
 
   SetWorkerSettings(std::move(creation_params->worker_settings));
 
-  // Set address space here for workers whose script is fetched on the main
-  // thread. For off-the-main-thread fetches, this is instead set after the
-  // script is fetched.
-  if (creation_params->off_main_thread_fetch_option ==
-      OffMainThreadWorkerScriptFetchOption::kDisabled) {
-    SetAddressSpace(*creation_params->response_address_space);
-  } else {
-    DCHECK(!creation_params->response_address_space);
-  }
-
   OriginTrialContext::AddTokens(this,
                                 creation_params->origin_trial_tokens.get());
   // TODO(sammc): Require a valid |creation_params->interface_provider| once all
diff --git a/third_party/blink/renderer/core/workers/worker_global_scope.h b/third_party/blink/renderer/core/workers/worker_global_scope.h
index 02cfed0..617b16d 100644
--- a/third_party/blink/renderer/core/workers/worker_global_scope.h
+++ b/third_party/blink/renderer/core/workers/worker_global_scope.h
@@ -31,6 +31,7 @@
 #include "services/network/public/mojom/fetch_api.mojom-shared.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 #include "services/service_manager/public/mojom/interface_provider.mojom-blink.h"
+#include "third_party/blink/public/mojom/net/ip_address_space.mojom-blink.h"
 #include "third_party/blink/public/mojom/script/script_type.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
 #include "third_party/blink/renderer/core/core_export.h"
@@ -147,7 +148,8 @@
   //   https://w3c.github.io/ServiceWorker/#run-service-worker-algorithm
   virtual void Initialize(
       const KURL& response_url,
-      network::mojom::ReferrerPolicy response_referrer_policy) = 0;
+      network::mojom::ReferrerPolicy response_referrer_policy,
+      mojom::IPAddressSpace response_address_space) = 0;
 
   // These methods should be called in the scope of a pausable
   // task runner. ie. They should not be called when the context
diff --git a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
index 86a7298f..777975ba 100644
--- a/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
+++ b/third_party/blink/renderer/core/workers/worker_thread_test_helper.h
@@ -57,11 +57,12 @@
   }
 
   // WorkerGlobalScope
-  void Initialize(
-      const KURL& response_url,
-      network::mojom::ReferrerPolicy response_referrer_policy) override {
+  void Initialize(const KURL& response_url,
+                  network::mojom::ReferrerPolicy response_referrer_policy,
+                  mojom::IPAddressSpace response_address_space) override {
     InitializeURL(response_url);
     SetReferrerPolicy(response_referrer_policy);
+    SetAddressSpace(response_address_space);
   }
   void FetchAndRunClassicScript(
       const KURL& script_url,
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/ResourceTreeModel.js b/third_party/blink/renderer/devtools/front_end/sdk/ResourceTreeModel.js
index d3c947f..a167c7e 100644
--- a/third_party/blink/renderer/devtools/front_end/sdk/ResourceTreeModel.js
+++ b/third_party/blink/renderer/devtools/front_end/sdk/ResourceTreeModel.js
@@ -1015,4 +1015,12 @@
    */
   compilationCacheProduced(url, data) {
   }
+
+  /**
+   * @override
+   * @param {!Protocol.Page.FrameId} frameId
+   * @param {string} url
+   */
+  downloadWillBegin(frameId, url) {
+  }
 };
diff --git a/third_party/blink/renderer/devtools/front_end/sdk/ScreenCaptureModel.js b/third_party/blink/renderer/devtools/front_end/sdk/ScreenCaptureModel.js
index bdc42f9..64064d8 100644
--- a/third_party/blink/renderer/devtools/front_end/sdk/ScreenCaptureModel.js
+++ b/third_party/blink/renderer/devtools/front_end/sdk/ScreenCaptureModel.js
@@ -235,6 +235,14 @@
    */
   compilationCacheProduced(url, data) {
   }
+
+  /**
+   * @override
+   * @param {!Protocol.Page.FrameId} frameId
+   * @param {string} url
+   */
+  downloadWillBegin(frameId, url) {
+  }
 };
 
 SDK.SDKModel.register(SDK.ScreenCaptureModel, SDK.Target.Capability.ScreenCapture, false);
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
index d45e5b3..944021d 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -131,10 +131,13 @@
   KURL response_url = creation_params->script_url;
   network::mojom::ReferrerPolicy response_referrer_policy =
       creation_params->referrer_policy;
+  mojom::IPAddressSpace response_address_space =
+      *creation_params->response_address_space;
   auto* global_scope = MakeGarbageCollected<ServiceWorkerGlobalScope>(
       std::move(creation_params), thread, std::move(cache_storage_info),
       time_origin);
-  global_scope->Initialize(response_url, response_referrer_policy);
+  global_scope->Initialize(response_url, response_referrer_policy,
+                           response_address_space);
   return global_scope;
 }
 
@@ -424,7 +427,8 @@
 // https://w3c.github.io/ServiceWorker/#run-service-worker-algorithm
 void ServiceWorkerGlobalScope::Initialize(
     const KURL& response_url,
-    network::mojom::ReferrerPolicy response_referrer_policy) {
+    network::mojom::ReferrerPolicy response_referrer_policy,
+    mojom::IPAddressSpace response_address_space) {
   // Step 4.5. "Set workerGlobalScope's url to serviceWorker's script url."
   InitializeURL(response_url);
 
@@ -436,6 +440,9 @@
   // script resource's referrer policy."
   SetReferrerPolicy(response_referrer_policy);
 
+  // https://wicg.github.io/cors-rfc1918/#integration-html
+  SetAddressSpace(response_address_space);
+
   // TODO(nhiroki): Move the step 4.8-4.12 from RunClassicScript() to this
   // function.
 }
@@ -450,10 +457,7 @@
     std::unique_ptr<Vector<uint8_t>> cached_meta_data,
     const v8_inspector::V8StackTraceId& stack_id) {
   // Step 4.5-4.7 are implemented in Initialize().
-  Initialize(response_url, response_referrer_policy);
-
-  // https://wicg.github.io/cors-rfc1918/#integration-html
-  SetAddressSpace(response_address_space);
+  Initialize(response_url, response_referrer_policy, response_address_space);
 
   // TODO(nhiroki): Clarify mappings between the steps 4.8-4.11 and
   // implementation.
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
index 68ae33bb..6400ae2 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
@@ -81,9 +81,9 @@
   bool ShouldInstallV8Extensions() const final;
 
   // Implements WorkerGlobalScope:
-  void Initialize(
-      const KURL& response_url,
-      network::mojom::ReferrerPolicy response_referrer_policy) override;
+  void Initialize(const KURL& response_url,
+                  network::mojom::ReferrerPolicy response_referrer_policy,
+                  mojom::IPAddressSpace response_address_space) override;
   // Fetches and runs the top-level classic worker script for the 'new' or
   // 'update' service worker cases.
   void FetchAndRunClassicScript(
diff --git a/third_party/blink/renderer/modules/webaudio/analyser_node.cc b/third_party/blink/renderer/modules/webaudio/analyser_node.cc
index 01583d25..7208af4 100644
--- a/third_party/blink/renderer/modules/webaudio/analyser_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/analyser_node.cc
@@ -34,8 +34,10 @@
 namespace blink {
 
 AnalyserHandler::AnalyserHandler(AudioNode& node, float sample_rate)
-    : AudioBasicInspectorHandler(kNodeTypeAnalyser, node, sample_rate, 1) {
+    : AudioBasicInspectorHandler(kNodeTypeAnalyser, node, sample_rate) {
   channel_count_ = 2;
+  AddOutput(1);
+
   Initialize();
 }
 
diff --git a/third_party/blink/renderer/modules/webaudio/audio_basic_inspector_node.cc b/third_party/blink/renderer/modules/webaudio/audio_basic_inspector_node.cc
index 5df6a02..9a68056 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_basic_inspector_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/audio_basic_inspector_node.cc
@@ -30,14 +30,11 @@
 
 namespace blink {
 
-AudioBasicInspectorHandler::AudioBasicInspectorHandler(
-    NodeType node_type,
-    AudioNode& node,
-    float sample_rate,
-    unsigned output_channel_count)
+AudioBasicInspectorHandler::AudioBasicInspectorHandler(NodeType node_type,
+                                                       AudioNode& node,
+                                                       float sample_rate)
     : AudioHandler(node_type, node, sample_rate), need_automatic_pull_(false) {
   AddInput();
-  AddOutput(output_channel_count);
 }
 
 // We override pullInputs() as an optimization allowing this node to take
diff --git a/third_party/blink/renderer/modules/webaudio/audio_basic_inspector_node.h b/third_party/blink/renderer/modules/webaudio/audio_basic_inspector_node.h
index 884495b..0aac98d7 100644
--- a/third_party/blink/renderer/modules/webaudio/audio_basic_inspector_node.h
+++ b/third_party/blink/renderer/modules/webaudio/audio_basic_inspector_node.h
@@ -30,22 +30,20 @@
 
 namespace blink {
 
-// AudioBasicInspectorNode is an AudioNode with one input and one output where
-// the output might not necessarily connect to another node's input.
-// If the output is not connected to any other node, then the
-// AudioBasicInspectorNode's processIfNecessary() function will be called
-// automatically by BaseAudioContext before the end of each render quantum so
-// that it can inspect the audio stream.
+// AudioBasicInspectorNode is an AudioNode with one input and possibly one
+// output where the output might not necessarily connect to another node's
+// input.  (It is up to the subclasses to create the output, if needed.)  If the
+// output is not connected to any other node, then the AudioBasicInspectorNode's
+// processIfNecessary() function will be called automatically by
+// BaseAudioContext before the end of each render quantum so that it can inspect
+// the audio stream.
 class AudioBasicInspectorHandler : public AudioHandler {
  public:
-  AudioBasicInspectorHandler(NodeType,
-                             AudioNode&,
-                             float sample_rate,
-                             unsigned output_channel_count);
+  AudioBasicInspectorHandler(NodeType, AudioNode&, float sample_rate);
 
   // AudioHandler
-  void PullInputs(uint32_t frames_to_process) final;
-  void CheckNumberOfChannelsForInput(AudioNodeInput*) final;
+  void PullInputs(uint32_t frames_to_process) override;
+  void CheckNumberOfChannelsForInput(AudioNodeInput*) override;
 
   // AudioNode
   double TailTime() const override { return 0; }
diff --git a/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.cc b/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.cc
index 0338f1d8..4fd481d9 100644
--- a/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.cc
+++ b/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.cc
@@ -47,8 +47,7 @@
     uint32_t number_of_channels)
     : AudioBasicInspectorHandler(kNodeTypeMediaStreamAudioDestination,
                                  node,
-                                 node.context()->sampleRate(),
-                                 number_of_channels),
+                                 node.context()->sampleRate()),
       source_(static_cast<MediaStreamAudioDestinationNode&>(node).source()),
       mix_bus_(AudioBus::Create(number_of_channels,
                                 audio_utilities::kRenderQuantumFrames)) {
@@ -126,6 +125,50 @@
   return kMaxChannelCount;
 }
 
+void MediaStreamAudioDestinationHandler::PullInputs(
+    uint32_t frames_to_process) {
+  DCHECK_EQ(NumberOfOutputs(), 0u);
+
+  // Just render the input; there's no output for this node.
+  Input(0).Pull(nullptr, frames_to_process);
+}
+
+void MediaStreamAudioDestinationHandler::CheckNumberOfChannelsForInput(
+    AudioNodeInput* input) {
+  DCHECK(Context()->IsAudioThread());
+  Context()->AssertGraphOwner();
+
+  DCHECK_EQ(input, &this->Input(0));
+  if (input != &this->Input(0))
+    return;
+
+  AudioHandler::CheckNumberOfChannelsForInput(input);
+
+  UpdatePullStatusIfNeeded();
+}
+
+void MediaStreamAudioDestinationHandler::UpdatePullStatusIfNeeded() {
+  Context()->AssertGraphOwner();
+
+  unsigned number_of_input_connections =
+      Input(0).NumberOfRenderingConnections();
+  if (number_of_input_connections && !need_automatic_pull_) {
+    // When an AudioBasicInspectorNode is not connected to any downstream node
+    // while still connected from upstream node(s), add it to the context's
+    // automatic pull list.
+    Context()->GetDeferredTaskHandler().AddAutomaticPullNode(this);
+    need_automatic_pull_ = true;
+  } else if (!number_of_input_connections && need_automatic_pull_) {
+    // The AudioBasicInspectorNode is connected to nothing and is
+    // not an AnalyserNode, remove it from the context's automatic
+    // pull list.  AnalyserNode's need to be pulled even with no
+    // inputs so that the internal state gets updated to hold the
+    // right time and FFT data.
+    Context()->GetDeferredTaskHandler().RemoveAutomaticPullNode(this);
+    need_automatic_pull_ = false;
+  }
+}
+
 // ----------------------------------------------------------------
 
 MediaStreamAudioDestinationNode::MediaStreamAudioDestinationNode(
diff --git a/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.h b/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.h
index 1266035..97db66c 100644
--- a/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.h
+++ b/third_party/blink/renderer/modules/webaudio/media_stream_audio_destination_node.h
@@ -51,6 +51,14 @@
 
   bool RequiresTailProcessing() const final { return false; }
 
+  // This node has no outputs, so we need methods that are different from the
+  // ones provided by AudioBasicInspectorHnadler, which assume an output.
+  void PullInputs(uint32_t frames_to_process) override;
+  void CheckNumberOfChannelsForInput(AudioNodeInput*) override;
+
+  // AudioNode
+  void UpdatePullStatusIfNeeded() override;
+
  private:
   MediaStreamAudioDestinationHandler(AudioNode&, uint32_t number_of_channels);
   // As an audio source, we will never propagate silence.
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
index e7ad1eb..f302926 100644
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -483,6 +483,10 @@
   RuntimeEnabledFeatures::SetWebXRHitTestEnabled(enable);
 }
 
+void WebRuntimeFeatures::EnableWebXRPlaneDetection(bool enable) {
+  RuntimeEnabledFeatures::SetWebXRPlaneDetectionEnabled(enable);
+}
+
 void WebRuntimeFeatures::EnablePresentationAPI(bool enable) {
   RuntimeEnabledFeatures::SetPresentationEnabled(enable);
 }
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
index 42e2292..00e7ad79 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.cc
@@ -1112,6 +1112,15 @@
   return false;
 }
 
+bool PaintArtifactCompositor::DirectlyUpdatePageScaleTransform(
+    const TransformPaintPropertyNode& transform) {
+  if (auto* property_trees = GetPropertyTreesForDirectUpdate()) {
+    return property_tree_manager_.DirectlyUpdatePageScaleTransform(
+        property_trees, transform);
+  }
+  return false;
+}
+
 static bool IsRenderSurfaceCandidate(
     const cc::EffectNode& effect,
     const Vector<const EffectPaintPropertyNode*>& blink_effects) {
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h
index c9e0991..f977718 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h
+++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor.h
@@ -141,6 +141,7 @@
   bool DirectlyUpdateCompositedOpacityValue(const EffectPaintPropertyNode&);
   bool DirectlyUpdateScrollOffsetTransform(const TransformPaintPropertyNode&);
   bool DirectlyUpdateTransform(const TransformPaintPropertyNode&);
+  bool DirectlyUpdatePageScaleTransform(const TransformPaintPropertyNode&);
 
   // The root layer of the tree managed by this object.
   cc::Layer* RootLayer() const { return root_layer_.get(); }
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
index 292460db..ccefc5e 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.cc
@@ -85,9 +85,14 @@
   if (it == effect_node_map_.end())
     return false;
   auto* cc_effect = property_trees->effect_tree.Node(it->value);
-  if (!cc_effect || cc_effect->is_currently_animating_opacity)
+  if (!cc_effect)
     return false;
 
+  // We directly update opacity only when it's not animating in compositor. If
+  // the compositor has not cleared is_currently_animating_opacity, we should
+  // clear it now to let the compositor respect the new value.
+  cc_effect->is_currently_animating_opacity = false;
+
   cc_effect->opacity = effect.Opacity();
   cc_effect->effect_changed = true;
   property_trees->effect_tree.set_needs_update(true);
@@ -112,9 +117,11 @@
     return false;
   auto* cc_transform = property_trees->transform_tree.Node(transform_it->value);
 
-  if (!cc_scroll_node || !cc_transform || cc_transform->is_currently_animating)
+  if (!cc_scroll_node || !cc_transform)
     return false;
 
+  DCHECK(!cc_transform->is_currently_animating);
+
   UpdateCcTransformLocalMatrix(*cc_transform, transform);
   SetCcTransformNodeScrollToTransformTranslation(*cc_transform, transform);
   property_trees->scroll_tree.SetScrollOffset(
@@ -137,11 +144,35 @@
   if (transform_it == transform_node_map_.end())
     return false;
   auto* cc_transform = property_trees->transform_tree.Node(transform_it->value);
-  if (!cc_transform || cc_transform->is_currently_animating)
+  if (!cc_transform)
     return false;
 
   UpdateCcTransformLocalMatrix(*cc_transform, transform);
 
+  // We directly update transform only when the transform is not animating in
+  // compositor. If the compositor has not cleared the is_currently_animating
+  // flag, we should clear it to let the compositor respect the new value.
+  cc_transform->is_currently_animating = false;
+
+  cc_transform->transform_changed = true;
+  property_trees->transform_tree.set_needs_update(true);
+  return true;
+}
+
+bool PropertyTreeManager::DirectlyUpdatePageScaleTransform(
+    cc::PropertyTrees* property_trees,
+    const TransformPaintPropertyNode& transform) {
+  DCHECK(!transform.ScrollNode());
+
+  auto transform_it = transform_node_map_.find(&transform);
+  if (transform_it == transform_node_map_.end())
+    return false;
+  auto* cc_transform = property_trees->transform_tree.Node(transform_it->value);
+  if (!cc_transform)
+    return false;
+
+  UpdateCcTransformLocalMatrix(*cc_transform, transform);
+  AdjustPageScaleToUsePostLocal(*cc_transform);
   cc_transform->transform_changed = true;
   property_trees->transform_tree.set_needs_update(true);
   return true;
@@ -439,17 +470,22 @@
   int id = EnsureCompositorTransformNode(node);
   DCHECK(GetTransformTree().Node(id));
   cc::TransformNode& compositor_node = *GetTransformTree().Node(id);
+  AdjustPageScaleToUsePostLocal(compositor_node);
+  compositor_node.transform_changed = true;
+  GetTransformTree().set_needs_update(true);
+  return id;
+}
 
+void PropertyTreeManager::AdjustPageScaleToUsePostLocal(
+    cc::TransformNode& page_scale) {
   // The page scale node is special because its transform matrix is assumed to
   // be in the post_local matrix by the compositor. There should be no
   // translation from the origin so we clear the other matrices.
-  DCHECK_EQ(node.Origin(), FloatPoint3D());
-  compositor_node.post_local.matrix() = compositor_node.local.matrix();
-  compositor_node.pre_local.matrix().setIdentity();
-  compositor_node.local.matrix().setIdentity();
-  compositor_node.transform_changed = true;
-
-  return id;
+  DCHECK(page_scale.local.IsScale2d());
+  DCHECK(page_scale.pre_local.IsIdentity());
+  page_scale.post_local.matrix() = page_scale.local.matrix();
+  page_scale.pre_local.matrix().setIdentity();
+  page_scale.local.matrix().setIdentity();
 }
 
 int PropertyTreeManager::EnsureCompositorClipNode(
diff --git a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h
index e89647a..2b6ab16 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h
+++ b/third_party/blink/renderer/platform/graphics/compositing/property_tree_manager.h
@@ -129,6 +129,8 @@
                                            const TransformPaintPropertyNode&);
   bool DirectlyUpdateTransform(cc::PropertyTrees*,
                                const TransformPaintPropertyNode&);
+  bool DirectlyUpdatePageScaleTransform(cc::PropertyTrees*,
+                                        const TransformPaintPropertyNode&);
 
  private:
   void SetupRootTransformNode();
@@ -154,6 +156,14 @@
 
   void UpdateCcTransformLocalMatrix(cc::TransformNode&,
                                     const TransformPaintPropertyNode&);
+  // Move the page scale from the local matrix to the post_local matrix. The
+  // compositor has an assumption that the page scale is in the post_local
+  // matrix but |UpdateCcTransformLocalMatrix| uses the local matrix.
+  void AdjustPageScaleToUsePostLocal(cc::TransformNode&);
+  // Move the local translation into the scroll_offset field of the compositor
+  // transform node. The compositor uses a speical scroll_offset field instead
+  // of the local matrix for scroll nodes, whereas
+  // blink::TransformPaintPropertyNode represents this as a 2d translation.
   void SetCcTransformNodeScrollToTransformTranslation(
       cc::TransformNode&,
       const TransformPaintPropertyNode&);
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 1d514c5..03e808fe 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -422,6 +422,7 @@
     },
     {
       name: "CustomUserTiming",
+      status: "experimental",
     },
     {
       name: "Database",
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index a05f4614..6bbb084 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -2511,6 +2511,8 @@
 crbug.com/802067 [ Mac ] external/wpt/pointerlock/movementX_Y_basic.html [ Failure ]
 crbug.com/802067 [ Mac ] external/wpt/pointerevents/pointerlock/pointerevent_movementxy-manual.html [ Failure ]
 
+crbug.com/957181 external/wpt/resource-timing/nested-context-navigations.html [ Pass Failure ]
+
 # Since there is no compositor thread when running tests then there is no main thread event queue. Hence the
 # logic for this test will be skipped when running Layout tests.
 crbug.com/770028 external/wpt/pointerevents/extension/pointerevent_pointerrawmove-manual.html [ Skip ]
@@ -2816,13 +2818,6 @@
 
 crbug.com/863896 http/tests/permissions/test-query.html [ Timeout ]
 
-# These tests will pass when we ship User Timing L3.
-crbug.com/758385 external/wpt/user-timing/mark-errors.html [ Failure ]
-crbug.com/758385 external/wpt/user-timing/mark-l3.html [ Failure ]
-crbug.com/758385 external/wpt/user-timing/mark-measure-return-objects.html [ Failure ]
-crbug.com/758385 external/wpt/user-timing/measure-l3.html [ Failure ]
-crbug.com/758385 external/wpt/user-timing/measure-with-dict.html [ Failure ]
-
 crbug.com/876485 fast/performance/performance-measure-null-exception.html [ Failure ]
 
 # These tests requires enabling the flag LongTaskV2 in a virtual test suite.
@@ -5545,8 +5540,6 @@
 crbug.com/869492 virtual/threaded/external/wpt/feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html [ Failure ]
 crbug.com/869492 virtual/unified-autoplay/external/wpt/feature-policy/experimental-features/lazyload/loading-frame-default-eager-disabled-tentative.sub.html [ Failure ]
 
-crbug.com/914441 external/wpt/user-timing/mark-measure-feature-detection.html [ Failure ]
-
 # New rebaselines because LayoutNG is more correct
 crbug.com/902591 [ Linux ] svg/zoom/page/zoom-svg-float-border-padding.xml [ Failure ]
 
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 0b8d7c7..54fae0ea 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1066,5 +1066,10 @@
     "prefix": "native-file-system",
     "base": "external/wpt/native-file-system",
     "args": ["--enable-features=NativeFileSystemAPI"]
+  },
+  {
+    "prefix": "user-timing-l2",
+    "base": "external/wpt/user-timing",
+    "args": ["--disable-blink-features=CustomUserTiming"]
   }
 ]
diff --git a/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any-expected.txt b/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any-expected.txt
index 7d03cc1..13e883b 100644
--- a/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 71 tests; 68 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 71 tests; 70 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idlharness
 PASS idl_test setup
 PASS Partial interface Performance: original interface defined
@@ -61,10 +61,10 @@
 PASS PerformanceMark interface: existence and properties of interface prototype object
 PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark interface: attribute detail
 PASS PerformanceMark must be primary interface of mark
 PASS Stringification of mark
-FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMark interface: mark must inherit property "detail" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "name" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "entryType" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "startTime" with the proper type
diff --git a/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.serviceworker-expected.txt
index 7d03cc1..13e883b 100644
--- a/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.serviceworker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.serviceworker-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 71 tests; 68 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 71 tests; 70 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idlharness
 PASS idl_test setup
 PASS Partial interface Performance: original interface defined
@@ -61,10 +61,10 @@
 PASS PerformanceMark interface: existence and properties of interface prototype object
 PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark interface: attribute detail
 PASS PerformanceMark must be primary interface of mark
 PASS Stringification of mark
-FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMark interface: mark must inherit property "detail" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "name" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "entryType" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "startTime" with the proper type
diff --git a/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.sharedworker-expected.txt
index 7d03cc1..13e883b 100644
--- a/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.sharedworker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.sharedworker-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 71 tests; 68 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 71 tests; 70 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idlharness
 PASS idl_test setup
 PASS Partial interface Performance: original interface defined
@@ -61,10 +61,10 @@
 PASS PerformanceMark interface: existence and properties of interface prototype object
 PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark interface: attribute detail
 PASS PerformanceMark must be primary interface of mark
 PASS Stringification of mark
-FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMark interface: mark must inherit property "detail" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "name" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "entryType" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "startTime" with the proper type
diff --git a/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.worker-expected.txt
index 7d03cc1..13e883b 100644
--- a/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.worker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/performance-timeline/idlharness.any.worker-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 71 tests; 68 PASS, 3 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 71 tests; 70 PASS, 1 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idlharness
 PASS idl_test setup
 PASS Partial interface Performance: original interface defined
@@ -61,10 +61,10 @@
 PASS PerformanceMark interface: existence and properties of interface prototype object
 PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark interface: attribute detail
 PASS PerformanceMark must be primary interface of mark
 PASS Stringification of mark
-FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMark interface: mark must inherit property "detail" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "name" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "entryType" with the proper type
 PASS PerformanceEntry interface: mark must inherit property "startTime" with the proper type
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/clearMarks.html b/third_party/blink/web_tests/external/wpt/user-timing/clearMarks.html
index 22d6726..92c60a3 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/clearMarks.html
+++ b/third_party/blink/web_tests/external/wpt/user-timing/clearMarks.html
@@ -17,7 +17,9 @@
 {
     const entrylist_checker = new performance_entrylist_checker('mark');
     const string_mark_names = mark_names.map(function (x) { return String(x)});
-    mark_names.forEach(performance.mark, performance);
+    mark_names.forEach(function(name) {
+        performance.mark(name);
+    });
 
     for (let i = 0; i < mark_names.length; ++i)
     {
@@ -30,13 +32,19 @@
             'First loop: marks that we cleared for "' + mark_names[i] + '" should not exist anymore.');
     }
 
-    mark_names.forEach(performance.mark, performance);
+    mark_names.forEach(function(name) {
+        performance.mark(name);
+    });
     performance.clearMarks();
     test_equals(performance.getEntriesByType('mark').length, 0, 'No marks should exist after we clear all.');
 
     // Following cases test clear existed mark name that is tied for two times.
-    mark_names.forEach(performance.mark, performance);
-    mark_names.forEach(performance.mark, performance);
+    mark_names.forEach(function(name) {
+        performance.mark(name);
+    });
+    mark_names.forEach(function(name) {
+        performance.mark(name);
+    });
 
     for (let i = 0; i < mark_names.length; ++i)
     {
@@ -50,8 +58,12 @@
     }
 
     // Following cases test clear functionality when mark names are tied for two times.
-    mark_names.forEach(performance.mark, performance);
-    mark_names.forEach(performance.mark, performance);
+    mark_names.forEach(function(name) {
+        performance.mark(name);
+    });
+    mark_names.forEach(function(name) {
+        performance.mark(name);
+    });
     var entry_number_before_useless_clear = performance.getEntriesByType('Mark').length;
     performance.clearMarks('NonExist');
     var entry_number_after_useless_clear = performance.getEntriesByType('Mark').length;
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/clearMeasures.html b/third_party/blink/web_tests/external/wpt/user-timing/clearMeasures.html
index 488bece3..54d410056 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/clearMeasures.html
+++ b/third_party/blink/web_tests/external/wpt/user-timing/clearMeasures.html
@@ -19,7 +19,9 @@
     const entrylist_checker = new performance_entrylist_checker('measure');
     const measure_names = measures.map(function(x) {return x[0];});
 
-    mark_names.forEach(context.mark, context);
+    mark_names.forEach(function(name) {
+        context.mark(name);
+    });
     measures.forEach(context.initialMeasures, context);
     for (let i = 0; i < measures.length; ++i)
     {
@@ -38,7 +40,9 @@
 
     // Following cases test clear existed measure name that is tied twice.
     measures.forEach(context.initialMeasures, context);
-    mark_names.forEach(context.mark, context);
+    mark_names.forEach(function(name) {
+        context.mark(name);
+    });
     measures.forEach(context.initialMeasures, context);
     for (let i = 0; i < measures.length; ++i)
     {
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/clear_all_measures.any.js b/third_party/blink/web_tests/external/wpt/user-timing/clear_all_measures.any.js
index 5fd2a29..32c993f 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/clear_all_measures.any.js
+++ b/third_party/blink/web_tests/external/wpt/user-timing/clear_all_measures.any.js
@@ -1,8 +1,8 @@
 test(function()
 {
-    self.performance.mark("mark1", "responseStart");
+    self.performance.mark("mark1");
     self.performance.measure("measure1", "mark1");
-    self.performance.mark("mark2", "responseStart");
+    self.performance.mark("mark2");
     self.performance.measure("measure2", "mark2");
 
     // test that two measures have been created
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/clear_non_existent_measure.any.js b/third_party/blink/web_tests/external/wpt/user-timing/clear_non_existent_measure.any.js
index 5e2c7ed..9de0b5f 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/clear_non_existent_measure.any.js
+++ b/third_party/blink/web_tests/external/wpt/user-timing/clear_non_existent_measure.any.js
@@ -1,8 +1,8 @@
 test(function()
 {
-    self.performance.mark("mark1", "responseStart");
+    self.performance.mark("mark1");
     self.performance.measure("measure1", "mark1");
-    self.performance.mark("mark2", "responseStart");
+    self.performance.mark("mark2");
     self.performance.measure("measure2", "mark2");
 
     // test that two measures have been created
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/clear_one_measure.any.js b/third_party/blink/web_tests/external/wpt/user-timing/clear_one_measure.any.js
index a4db264d..a5e6637 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/clear_one_measure.any.js
+++ b/third_party/blink/web_tests/external/wpt/user-timing/clear_one_measure.any.js
@@ -1,8 +1,8 @@
 test(function()
 {
-    self.performance.mark("mark1", "responseStart");
+    self.performance.mark("mark1");
     self.performance.measure("measure1", "mark1");
-    self.performance.mark("mark2", "responseStart");
+    self.performance.mark("mark2");
     self.performance.measure("measure2", "mark2");
 
     // test that two measures have been created
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any-expected.txt b/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any-expected.txt
index 0990fcc..e4665ff 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any-expected.txt
@@ -7,20 +7,20 @@
 PASS PerformanceMark interface: existence and properties of interface prototype object
 PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark interface: attribute detail
 PASS PerformanceMark must be primary interface of mark
 PASS Stringification of mark
-FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMark interface: mark must inherit property "detail" with the proper type
 PASS PerformanceMeasure interface: existence and properties of interface object
 PASS PerformanceMeasure interface object length
 PASS PerformanceMeasure interface object name
 PASS PerformanceMeasure interface: existence and properties of interface prototype object
 PASS PerformanceMeasure interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMeasure interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMeasure interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMeasure interface: attribute detail
 PASS PerformanceMeasure must be primary interface of measure
 PASS Stringification of measure
-FAIL PerformanceMeasure interface: measure must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMeasure interface: measure must inherit property "detail" with the proper type
 PASS Performance interface: operation mark(DOMString, PerformanceMarkOptions)
 PASS Performance interface: operation clearMarks(DOMString)
 PASS Performance interface: operation measure(DOMString, [object Object],[object Object], DOMString)
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.serviceworker-expected.txt
index 0990fcc..e4665ff 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.serviceworker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.serviceworker-expected.txt
@@ -7,20 +7,20 @@
 PASS PerformanceMark interface: existence and properties of interface prototype object
 PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark interface: attribute detail
 PASS PerformanceMark must be primary interface of mark
 PASS Stringification of mark
-FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMark interface: mark must inherit property "detail" with the proper type
 PASS PerformanceMeasure interface: existence and properties of interface object
 PASS PerformanceMeasure interface object length
 PASS PerformanceMeasure interface object name
 PASS PerformanceMeasure interface: existence and properties of interface prototype object
 PASS PerformanceMeasure interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMeasure interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMeasure interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMeasure interface: attribute detail
 PASS PerformanceMeasure must be primary interface of measure
 PASS Stringification of measure
-FAIL PerformanceMeasure interface: measure must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMeasure interface: measure must inherit property "detail" with the proper type
 PASS Performance interface: operation mark(DOMString, PerformanceMarkOptions)
 PASS Performance interface: operation clearMarks(DOMString)
 PASS Performance interface: operation measure(DOMString, [object Object],[object Object], DOMString)
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.sharedworker-expected.txt
index 0990fcc..e4665ff 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.sharedworker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.sharedworker-expected.txt
@@ -7,20 +7,20 @@
 PASS PerformanceMark interface: existence and properties of interface prototype object
 PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark interface: attribute detail
 PASS PerformanceMark must be primary interface of mark
 PASS Stringification of mark
-FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMark interface: mark must inherit property "detail" with the proper type
 PASS PerformanceMeasure interface: existence and properties of interface object
 PASS PerformanceMeasure interface object length
 PASS PerformanceMeasure interface object name
 PASS PerformanceMeasure interface: existence and properties of interface prototype object
 PASS PerformanceMeasure interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMeasure interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMeasure interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMeasure interface: attribute detail
 PASS PerformanceMeasure must be primary interface of measure
 PASS Stringification of measure
-FAIL PerformanceMeasure interface: measure must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMeasure interface: measure must inherit property "detail" with the proper type
 PASS Performance interface: operation mark(DOMString, PerformanceMarkOptions)
 PASS Performance interface: operation clearMarks(DOMString)
 PASS Performance interface: operation measure(DOMString, [object Object],[object Object], DOMString)
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.worker-expected.txt
index 0990fcc..e4665ff 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.worker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/user-timing/idlharness.any.worker-expected.txt
@@ -7,20 +7,20 @@
 PASS PerformanceMark interface: existence and properties of interface prototype object
 PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark interface: attribute detail
 PASS PerformanceMark must be primary interface of mark
 PASS Stringification of mark
-FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMark interface: mark must inherit property "detail" with the proper type
 PASS PerformanceMeasure interface: existence and properties of interface object
 PASS PerformanceMeasure interface object length
 PASS PerformanceMeasure interface object name
 PASS PerformanceMeasure interface: existence and properties of interface prototype object
 PASS PerformanceMeasure interface: existence and properties of interface prototype object's "constructor" property
 PASS PerformanceMeasure interface: existence and properties of interface prototype object's @@unscopables property
-FAIL PerformanceMeasure interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMeasure interface: attribute detail
 PASS PerformanceMeasure must be primary interface of measure
 PASS Stringification of measure
-FAIL PerformanceMeasure interface: measure must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMeasure interface: measure must inherit property "detail" with the proper type
 PASS Performance interface: operation mark(DOMString, PerformanceMarkOptions)
 PASS Performance interface: operation clearMarks(DOMString)
 PASS Performance interface: operation measure(DOMString, [object Object],[object Object], DOMString)
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/mark-l3.html b/third_party/blink/web_tests/external/wpt/user-timing/mark-l3.html
index 429768d..bb4b22510 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/mark-l3.html
+++ b/third_party/blink/web_tests/external/wpt/user-timing/mark-l3.html
@@ -3,7 +3,7 @@
 <title>User Timing L3: mark</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="resources/user-timing-helpers.js"></script>
+<script src="resources/user-timing-helper.js"></script>
 <script>
   async_test(function (t) {
     let mark_entries = [];
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/mark.html b/third_party/blink/web_tests/external/wpt/user-timing/mark.html
index a7074f1e..e03e9e6 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/mark.html
+++ b/third_party/blink/web_tests/external/wpt/user-timing/mark.html
@@ -19,7 +19,9 @@
     const string_mark_names = mark_names.map(function (x) { return String(x)});
 
     test_equals(performance.getEntriesByType("mark").length, 0, 'There should be ' + 0 + ' marks');
-    mark_names.forEach(performance.mark, performance);
+    mark_names.forEach(function(name) {
+        performance.mark(name);
+    });
     let mark_entrylist = performance.getEntriesByType('mark');
 
     entrylist_checker.entrylist_check(mark_entrylist, mark_names.length, string_mark_names, 'Checking all entries.');
@@ -31,7 +33,9 @@
             'First loop: checking entry of name "' + mark_entrylist[i].name + '".');
     }
 
-    mark_names.forEach(performance.mark, performance);
+    mark_names.forEach(function(name) {
+        performance.mark(name);
+    });
     mark_entrylist = performance.getEntriesByType('mark');
     entrylist_checker.entrylist_check(mark_entrylist, mark_names.length * 2, string_mark_names, 'Checking all doubly marked entries.');
 
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/measure-exceptions.html b/third_party/blink/web_tests/external/wpt/user-timing/measure-exceptions.html
new file mode 100644
index 0000000..0c532e7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/user-timing/measure-exceptions.html
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+<head>
+    This tests that 'performance.measure' throws exceptions with reasonable messages.
+</head>
+<body>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+    window.performance.clearMarks();
+    window.performance.clearMeasures();
+
+    window.performance.mark('mark');
+
+    const eventMarks = [
+        'unloadEventStart',
+        'unloadEventEnd',
+        'redirectStart',
+        'redirectEnd',
+        'secureConnectionStart',
+        'domInteractive',
+        'domContentLoadedEventStart',
+        'domContentLoadedEventEnd',
+        'domComplete',
+        'loadEventStart',
+        'loadEventEnd',
+    ];
+    eventMarks.forEach(function(name) {
+        test(()=>{
+            assert_throws("InvalidAccessError", ()=>{
+                window.performance.measure("measuring", name, "mark");
+            }, "Should throw");
+        }, `Passing '${name}' as a mark to measure API should cause error when the mark is empty.`);
+    });
+
+    const args = [
+        51.15,  // Verify that number is parsed as string, not number.
+        "DoesNotExist", // Non-existant mark name should cause error.
+    ];
+    args.forEach(each => {
+        test(()=>{
+            assert_throws("SyntaxError", ()=>{
+                window.performance.measure("measuring", each, "mark");
+            }, "Should throw");
+        }, `Passing ${each} as a mark to measure API should cause error.`);
+    });
+</script>
+</body>
+</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/measure-with-dict.html b/third_party/blink/web_tests/external/wpt/user-timing/measure-with-dict.html
index 83990a6..47a4f3f5 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/measure-with-dict.html
+++ b/third_party/blink/web_tests/external/wpt/user-timing/measure-with-dict.html
@@ -3,7 +3,7 @@
 <title>User Timing L3: measure is customizable</title>
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
-<script src="resources/user-timing-helpers.js"></script>
+<script src="resources/user-timing-helper.js"></script>
 <script>
   async_test(function (t) {
     let measureEntries = [];
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/measure_associated_with_navigation_timing.html b/third_party/blink/web_tests/external/wpt/user-timing/measure_associated_with_navigation_timing.html
index 9fd4664..702e3d5 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/measure_associated_with_navigation_timing.html
+++ b/third_party/blink/web_tests/external/wpt/user-timing/measure_associated_with_navigation_timing.html
@@ -25,7 +25,9 @@
     ];
     const context = new PerformanceContext(window.performance);
 
-    mark_names.forEach(context.mark, context);
+    mark_names.forEach(function(name) {
+        context.mark(name);
+    });
     measures_for_timing_order.forEach(context.initialMeasures, context);
     test_greater_than(context.getEntriesByName('nav2now', 'measure')[0].duration, 0, 'Measure of navigationStart to now should be positive value.');
     test_greater_than(context.getEntriesByName('loadTime', 'measure')[0].duration, 0, 'Measure of navigationStart to loadEventEnd should be positive value.');
@@ -33,7 +35,9 @@
     test_equals(context.getEntriesByName('loadTime', 'measure')[0].duration + context.getEntriesByName('loadEventEnd2a', 'measure')[0].duration, context.getEntriesByName('nav2a', 'measure')[0].duration, 'loadTime plus loadEventEnd to a mark "a" should equal to navigationStart to "a".');
 
     // Following cases test for scenarios that measure names are tied twice.
-    mark_names.forEach(context.mark, context);
+    mark_names.forEach(function(name) {
+        context.mark(name);
+    });
     measures_for_timing_order.forEach(context.initialMeasures, context);
 
     test_greater_than(context.getEntriesByName('nav2now', 'measure')[1].duration, context.getEntriesByName('nav2now', 'measure')[0].duration, 'Second measure of current mark to navigationStart should be negative value.');
diff --git a/third_party/blink/web_tests/external/wpt/user-timing/measures.html b/third_party/blink/web_tests/external/wpt/user-timing/measures.html
index d0ab11e3..0de6896 100644
--- a/third_party/blink/web_tests/external/wpt/user-timing/measures.html
+++ b/third_party/blink/web_tests/external/wpt/user-timing/measures.html
@@ -21,7 +21,9 @@
 
     test_equals(context.getEntriesByType('measure').length, 0, 'There should be ' + 0 + ' entries returned.');
 
-    mark_names.forEach(context.mark, context);
+    mark_names.forEach(function(name) {
+        context.mark(name);
+    });
     measures.forEach(context.initialMeasures, context);
 
     let measure_entrylist = context.getEntriesByType('measure');
@@ -36,7 +38,9 @@
     }
 
     // Following cases test for scenarios that measure names are tied for two times
-    mark_names.forEach(context.mark, context);
+    mark_names.forEach(function(name) {
+        context.mark(name);
+    });
     measures.forEach(context.initialMeasures, context);
 
     measure_entrylist = context.getEntriesByType('measure');
diff --git a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audionode-interface/audionode-connect-method-chaining.html b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audionode-interface/audionode-connect-method-chaining.html
index 4163a84..5703a2a6 100644
--- a/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audionode-interface/audionode-connect-method-chaining.html
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-audionode-interface/audionode-connect-method-chaining.html
@@ -91,8 +91,9 @@
             context, should,
             {name: 'MediaElementSource', args: [mediaElement]});
 
-        testConnectMethod(context, should, {name: 'MediaStreamDestination'});
-
+        // MediaStreamAudioDestinationNode has no output so it connect method
+        // chaining isn't possible.
+        
         // MediaStreamSourceNode requires 'stream' object to be constructed,
         // which is a part of MediaStreamDestinationNode.
         let streamDestination = context.createMediaStreamDestination();
diff --git a/third_party/blink/web_tests/webaudio/MediaStreamAudioDestination/ctor-mediastreamaudiodestination.html b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html
similarity index 82%
rename from third_party/blink/web_tests/webaudio/MediaStreamAudioDestination/ctor-mediastreamaudiodestination.html
rename to third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html
index 06c27bd8..5d3fd0c 100644
--- a/third_party/blink/web_tests/webaudio/MediaStreamAudioDestination/ctor-mediastreamaudiodestination.html
+++ b/third_party/blink/web_tests/external/wpt/webaudio/the-audio-api/the-mediastreamaudiodestinationnode-interface/ctor-mediastreamaudiodestination.html
@@ -4,11 +4,11 @@
     <title>
       Test Constructor: MediaStreamAudioDestinationNode
     </title>
-    <script src="../../resources/testharness.js"></script>
-    <script src="../../resources/testharnessreport.js"></script>
-    <script src="../resources/audit-util.js"></script>
-    <script src="../resources/audit.js"></script>
-    <script src="../resources/audionodeoptions.js"></script>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/webaudio/resources/audit-util.js"></script>
+    <script src="/webaudio/resources/audit.js"></script>
+    <script src="/webaudio/resources/audionodeoptions.js"></script>
   </head>
   <body>
     <script id="layout-test-code">
@@ -36,7 +36,7 @@
             should, 'MediaStreamAudioDestinationNode', context, {
               prefix: prefix,
               numberOfInputs: 1,
-              numberOfOutputs: 1,
+              numberOfOutputs: 0,
               channelCount: 2,
               channelCountMode: 'explicit',
               channelInterpretation: 'speakers'
diff --git a/third_party/blink/web_tests/fast/performance/performance-measure-exceptions-expected.txt b/third_party/blink/web_tests/fast/performance/performance-measure-exceptions-expected.txt
index e28c4d8e..c609ed6c 100644
--- a/third_party/blink/web_tests/fast/performance/performance-measure-exceptions-expected.txt
+++ b/third_party/blink/web_tests/fast/performance/performance-measure-exceptions-expected.txt
@@ -15,7 +15,6 @@
 PASS window.performance.measure("measuring", 'loadEventStart', "mark") threw exception InvalidAccessError: Failed to execute 'measure' on 'Performance': 'loadEventStart' is empty: either the event hasn't happened yet, or it would provide cross-origin timing information..
 PASS window.performance.measure("measuring", 'loadEventEnd', "mark") threw exception InvalidAccessError: Failed to execute 'measure' on 'Performance': 'loadEventEnd' is empty: either the event hasn't happened yet, or it would provide cross-origin timing information..
 PASS window.performance.measure("measuring", 51.15, "mark") threw exception SyntaxError: Failed to execute 'measure' on 'Performance': The mark '51.15' does not exist..
-PASS window.performance.measure("measuring", {}, "mark") threw exception SyntaxError: Failed to execute 'measure' on 'Performance': The mark '[object Object]' does not exist..
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/blink/web_tests/fast/performance/performance-measure-exceptions.html b/third_party/blink/web_tests/fast/performance/performance-measure-exceptions.html
deleted file mode 100644
index 0e289f24..0000000
--- a/third_party/blink/web_tests/fast/performance/performance-measure-exceptions.html
+++ /dev/null
@@ -1,42 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-</head>
-<body>
-    <script src="../../resources/js-test.js"></script>
-    <script>
-        description("This tests that 'performance.measure' throws exceptions with reasonable messages.");
-
-        window.performance.clearMarks();
-        window.performance.clearMeasures();
-        shouldThrow('window.performance.measure("DoesNotExist", "AlsoDoesNotExist")', '"SyntaxError: Failed to execute \'measure\' on \'Performance\': The mark \'AlsoDoesNotExist\' does not exist."');
-
-        window.performance.mark('mark');
-
-        const eventMarks = [
-            'unloadEventStart',
-            'unloadEventEnd',
-            'redirectStart',
-            'redirectEnd',
-            'secureConnectionStart',
-            'domInteractive',
-            'domContentLoadedEventStart',
-            'domContentLoadedEventEnd',
-            'domComplete',
-            'loadEventStart',
-            'loadEventEnd',
-        ];
-        eventMarks.forEach(function(name) {
-            shouldThrow('window.performance.measure("measuring", \'' + name + '\', "mark")', '"InvalidAccessError: Failed to execute \'measure\' on \'Performance\': \'' + name + '\' is empty: either the event hasn\'t happened yet, or it would provide cross-origin timing information."');
-        });
-
-        const argAndConvertedArgs = {
-            "51.15": "51.15",
-            "{}": "[object Object]",
-        };
-        Object.entries(argAndConvertedArgs).forEach(function(pair) {
-            shouldThrow('window.performance.measure("measuring", ' + pair[0] + ', "mark")', '"SyntaxError: Failed to execute \'measure\' on \'Performance\': The mark \'' + pair[1]+ '\' does not exist."');
-        });
-    </script>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/page/download-will-begin-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/page/download-will-begin-expected.txt
new file mode 100644
index 0000000..5781585
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/page/download-will-begin-expected.txt
@@ -0,0 +1,12 @@
+Tests we properly emit Page.downloadWillBegin.
+Downloading via a navigation: 
+{
+    frameId : <string>
+    url : http://127.0.0.1:8000/devtools/network/resources/resource.php?download=1
+}
+Downloading by clicking a link: 
+{
+    frameId : <string>
+    url : http://127.0.0.1:8000/devtools/network/resources/resource.php
+}
+
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/page/download-will-begin.js b/third_party/blink/web_tests/http/tests/inspector-protocol/page/download-will-begin.js
new file mode 100644
index 0000000..86d333e
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/page/download-will-begin.js
@@ -0,0 +1,22 @@
+(async function(testRunner) {
+  var {page, session, dp} = await testRunner.startBlank('Tests we properly emit Page.downloadWillBegin.');
+
+  async function waitForDownloadAndDump() {
+    const params = (await dp.Page.onceDownloadWillBegin()).params;
+    testRunner.log(params);
+  }
+  await dp.Page.enable();
+  testRunner.log('Downloading via a navigation: ');
+  session.evaluate('location.href = "/devtools/network/resources/resource.php?download=1"');
+  await waitForDownloadAndDump();
+  testRunner.log('Downloading by clicking a link: ');
+  session.evaluate(`
+    const a = document.createElement('a');
+    a.href = '/devtools/network/resources/resource.php';
+    a.download = 'hello.text';
+    document.body.appendChild(a);
+    a.click();
+  `);
+  await waitForDownloadAndDump();
+  testRunner.completeTest();
+})
diff --git a/third_party/blink/web_tests/http/tests/misc/performance-entry-serializer-expected.txt b/third_party/blink/web_tests/http/tests/misc/performance-entry-serializer-expected.txt
new file mode 100644
index 0000000..788c31ad
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/misc/performance-entry-serializer-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL PerformanceEntry subclasses should serialize all attributes assert_equals: PerformanceMark.detail expected (object) null but got (undefined) undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 0e306bc..54c776b 100644
--- a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -1019,9 +1019,11 @@
     method toJSON
 interface PerformanceMark : PerformanceEntry
     attribute @@toStringTag
+    getter detail
     method constructor
 interface PerformanceMeasure : PerformanceEntry
     attribute @@toStringTag
+    getter detail
     method constructor
 interface PerformanceObserver
     static getter supportedEntryTypes
diff --git a/third_party/blink/web_tests/virtual/user-timing-l2/README.md b/third_party/blink/web_tests/virtual/user-timing-l2/README.md
new file mode 100644
index 0000000..796cd330
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/user-timing-l2/README.md
@@ -0,0 +1,2 @@
+This directory is for testing the L2 of UserTiming before we ship the L3
+completely.
\ No newline at end of file
diff --git a/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any-expected.txt b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any-expected.txt
new file mode 100644
index 0000000..0990fcc
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any-expected.txt
@@ -0,0 +1,37 @@
+This is a testharness.js-based test.
+PASS idl_test setup
+PASS Partial interface Performance: original interface defined
+PASS PerformanceMark interface: existence and properties of interface object
+FAIL PerformanceMark interface object length assert_equals: wrong value for PerformanceMark.length expected 1 but got 0
+PASS PerformanceMark interface object name
+PASS PerformanceMark interface: existence and properties of interface prototype object
+PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
+PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
+FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark must be primary interface of mark
+PASS Stringification of mark
+FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMeasure interface: existence and properties of interface object
+PASS PerformanceMeasure interface object length
+PASS PerformanceMeasure interface object name
+PASS PerformanceMeasure interface: existence and properties of interface prototype object
+PASS PerformanceMeasure interface: existence and properties of interface prototype object's "constructor" property
+PASS PerformanceMeasure interface: existence and properties of interface prototype object's @@unscopables property
+FAIL PerformanceMeasure interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMeasure must be primary interface of measure
+PASS Stringification of measure
+FAIL PerformanceMeasure interface: measure must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS Performance interface: operation mark(DOMString, PerformanceMarkOptions)
+PASS Performance interface: operation clearMarks(DOMString)
+PASS Performance interface: operation measure(DOMString, [object Object],[object Object], DOMString)
+PASS Performance interface: operation clearMeasures(DOMString)
+PASS Performance interface: performance must inherit property "mark(DOMString, PerformanceMarkOptions)" with the proper type
+PASS Performance interface: calling mark(DOMString, PerformanceMarkOptions) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "clearMarks(DOMString)" with the proper type
+PASS Performance interface: calling clearMarks(DOMString) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "measure(DOMString, [object Object],[object Object], DOMString)" with the proper type
+PASS Performance interface: calling measure(DOMString, [object Object],[object Object], DOMString) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "clearMeasures(DOMString)" with the proper type
+PASS Performance interface: calling clearMeasures(DOMString) on performance with too few arguments must throw TypeError
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any.serviceworker-expected.txt b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any.serviceworker-expected.txt
new file mode 100644
index 0000000..0990fcc
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any.serviceworker-expected.txt
@@ -0,0 +1,37 @@
+This is a testharness.js-based test.
+PASS idl_test setup
+PASS Partial interface Performance: original interface defined
+PASS PerformanceMark interface: existence and properties of interface object
+FAIL PerformanceMark interface object length assert_equals: wrong value for PerformanceMark.length expected 1 but got 0
+PASS PerformanceMark interface object name
+PASS PerformanceMark interface: existence and properties of interface prototype object
+PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
+PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
+FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark must be primary interface of mark
+PASS Stringification of mark
+FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMeasure interface: existence and properties of interface object
+PASS PerformanceMeasure interface object length
+PASS PerformanceMeasure interface object name
+PASS PerformanceMeasure interface: existence and properties of interface prototype object
+PASS PerformanceMeasure interface: existence and properties of interface prototype object's "constructor" property
+PASS PerformanceMeasure interface: existence and properties of interface prototype object's @@unscopables property
+FAIL PerformanceMeasure interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMeasure must be primary interface of measure
+PASS Stringification of measure
+FAIL PerformanceMeasure interface: measure must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS Performance interface: operation mark(DOMString, PerformanceMarkOptions)
+PASS Performance interface: operation clearMarks(DOMString)
+PASS Performance interface: operation measure(DOMString, [object Object],[object Object], DOMString)
+PASS Performance interface: operation clearMeasures(DOMString)
+PASS Performance interface: performance must inherit property "mark(DOMString, PerformanceMarkOptions)" with the proper type
+PASS Performance interface: calling mark(DOMString, PerformanceMarkOptions) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "clearMarks(DOMString)" with the proper type
+PASS Performance interface: calling clearMarks(DOMString) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "measure(DOMString, [object Object],[object Object], DOMString)" with the proper type
+PASS Performance interface: calling measure(DOMString, [object Object],[object Object], DOMString) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "clearMeasures(DOMString)" with the proper type
+PASS Performance interface: calling clearMeasures(DOMString) on performance with too few arguments must throw TypeError
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any.sharedworker-expected.txt b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any.sharedworker-expected.txt
new file mode 100644
index 0000000..0990fcc
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any.sharedworker-expected.txt
@@ -0,0 +1,37 @@
+This is a testharness.js-based test.
+PASS idl_test setup
+PASS Partial interface Performance: original interface defined
+PASS PerformanceMark interface: existence and properties of interface object
+FAIL PerformanceMark interface object length assert_equals: wrong value for PerformanceMark.length expected 1 but got 0
+PASS PerformanceMark interface object name
+PASS PerformanceMark interface: existence and properties of interface prototype object
+PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
+PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
+FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark must be primary interface of mark
+PASS Stringification of mark
+FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMeasure interface: existence and properties of interface object
+PASS PerformanceMeasure interface object length
+PASS PerformanceMeasure interface object name
+PASS PerformanceMeasure interface: existence and properties of interface prototype object
+PASS PerformanceMeasure interface: existence and properties of interface prototype object's "constructor" property
+PASS PerformanceMeasure interface: existence and properties of interface prototype object's @@unscopables property
+FAIL PerformanceMeasure interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMeasure must be primary interface of measure
+PASS Stringification of measure
+FAIL PerformanceMeasure interface: measure must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS Performance interface: operation mark(DOMString, PerformanceMarkOptions)
+PASS Performance interface: operation clearMarks(DOMString)
+PASS Performance interface: operation measure(DOMString, [object Object],[object Object], DOMString)
+PASS Performance interface: operation clearMeasures(DOMString)
+PASS Performance interface: performance must inherit property "mark(DOMString, PerformanceMarkOptions)" with the proper type
+PASS Performance interface: calling mark(DOMString, PerformanceMarkOptions) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "clearMarks(DOMString)" with the proper type
+PASS Performance interface: calling clearMarks(DOMString) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "measure(DOMString, [object Object],[object Object], DOMString)" with the proper type
+PASS Performance interface: calling measure(DOMString, [object Object],[object Object], DOMString) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "clearMeasures(DOMString)" with the proper type
+PASS Performance interface: calling clearMeasures(DOMString) on performance with too few arguments must throw TypeError
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any.worker-expected.txt b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any.worker-expected.txt
new file mode 100644
index 0000000..0990fcc
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/idlharness.any.worker-expected.txt
@@ -0,0 +1,37 @@
+This is a testharness.js-based test.
+PASS idl_test setup
+PASS Partial interface Performance: original interface defined
+PASS PerformanceMark interface: existence and properties of interface object
+FAIL PerformanceMark interface object length assert_equals: wrong value for PerformanceMark.length expected 1 but got 0
+PASS PerformanceMark interface object name
+PASS PerformanceMark interface: existence and properties of interface prototype object
+PASS PerformanceMark interface: existence and properties of interface prototype object's "constructor" property
+PASS PerformanceMark interface: existence and properties of interface prototype object's @@unscopables property
+FAIL PerformanceMark interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMark must be primary interface of mark
+PASS Stringification of mark
+FAIL PerformanceMark interface: mark must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS PerformanceMeasure interface: existence and properties of interface object
+PASS PerformanceMeasure interface object length
+PASS PerformanceMeasure interface object name
+PASS PerformanceMeasure interface: existence and properties of interface prototype object
+PASS PerformanceMeasure interface: existence and properties of interface prototype object's "constructor" property
+PASS PerformanceMeasure interface: existence and properties of interface prototype object's @@unscopables property
+FAIL PerformanceMeasure interface: attribute detail assert_true: The prototype object must have a property "detail" expected true got false
+PASS PerformanceMeasure must be primary interface of measure
+PASS Stringification of measure
+FAIL PerformanceMeasure interface: measure must inherit property "detail" with the proper type assert_inherits: property "detail" not found in prototype chain
+PASS Performance interface: operation mark(DOMString, PerformanceMarkOptions)
+PASS Performance interface: operation clearMarks(DOMString)
+PASS Performance interface: operation measure(DOMString, [object Object],[object Object], DOMString)
+PASS Performance interface: operation clearMeasures(DOMString)
+PASS Performance interface: performance must inherit property "mark(DOMString, PerformanceMarkOptions)" with the proper type
+PASS Performance interface: calling mark(DOMString, PerformanceMarkOptions) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "clearMarks(DOMString)" with the proper type
+PASS Performance interface: calling clearMarks(DOMString) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "measure(DOMString, [object Object],[object Object], DOMString)" with the proper type
+PASS Performance interface: calling measure(DOMString, [object Object],[object Object], DOMString) on performance with too few arguments must throw TypeError
+PASS Performance interface: performance must inherit property "clearMeasures(DOMString)" with the proper type
+PASS Performance interface: calling clearMeasures(DOMString) on performance with too few arguments must throw TypeError
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-errors-expected.txt b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-errors-expected.txt
new file mode 100644
index 0000000..d1fc52d
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-errors-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+FAIL Number should be rejected as the mark-options. assert_throws: Number passed as a dict argument should cause type-error. function "function() { self.performance.mark("mark1", 123); }" did not throw
+FAIL NaN should be rejected as the mark-options. assert_throws: NaN passed as a dict argument should cause type-error. function "function() { self.performance.mark("mark1", NaN); }" did not throw
+FAIL Infinity should be rejected as the mark-options. assert_throws: Infinity passed as a dict argument should cause type-error. function "function() { self.performance.mark("mark1", Infinity); }" did not throw
+FAIL String should be rejected as the mark-options. assert_throws: String passed as a dict argument should cause type-error. function "function() { self.performance.mark("mark1", "string"); }" did not throw
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-l3-expected.txt b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-l3-expected.txt
new file mode 100644
index 0000000..e7f33f83
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-l3-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL mark entries' detail and startTime are customizable. Cannot read property 'name' of null
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-measure-feature-detection-expected.txt b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-measure-feature-detection-expected.txt
new file mode 100644
index 0000000..b16a10d
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-measure-feature-detection-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+FAIL Test PerformanceMark existence and feature detection assert_equals: performance.mark should be void in UserTiming L2. expected "undefined" but got "object"
+FAIL Test PerformanceMeasure existence and feature detection assert_equals: performance.measure should be void in UserTiming L2. expected "undefined" but got "object"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-measure-return-objects-expected.txt b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-measure-return-objects-expected.txt
new file mode 100644
index 0000000..4a0beda
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/mark-measure-return-objects-expected.txt
@@ -0,0 +1,8 @@
+This is a testharness.js-based test.
+FAIL L3: performance.measure(name) should return an entry. assert_true: expected true got false
+FAIL L3: performance.measure(name, param1) should return an entry. Failed to execute 'measure' on 'Performance': The mark '[object Object]' does not exist.
+FAIL L3: performance.measure(name, param1, param2) should return an entry. assert_true: expected true got false
+FAIL L3: performance.mark(name) should return an entry. assert_true: expected true got false
+FAIL L3: performance.mark(name, param) should return an entry. assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/measure-l3-expected.txt b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/measure-l3-expected.txt
new file mode 100644
index 0000000..d9f35a2
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/measure-l3-expected.txt
@@ -0,0 +1,6 @@
+This is a testharness.js-based test.
+FAIL When the end mark is given and the start is unprovided, the end time of the measure entry should be the end mark's time, the start time should be 0. Cannot read property 'startTime' of null
+FAIL When the start mark is given and the end is unprovided, the start time of the measure entry should be the start mark's time, the end should be now. Cannot read property 'startTime' of null
+FAIL When start and end mark are both given, the start time and end time of the measure entry should be the the marks' time, repectively Cannot read property 'startTime' of null
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/measure-with-dict-expected.txt b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/measure-with-dict-expected.txt
new file mode 100644
index 0000000..f2933f82
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/user-timing-l2/external/wpt/user-timing/measure-with-dict-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+FAIL measure entries' detail and start/end are customizable Failed to execute 'measure' on 'Performance': The mark '[object Object]' does not exist.
+PASS measure should throw exception when passing option object and end at the same time
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/webaudio/MediaStreamAudioDestination/mediastreamaudiodestinationnode.html b/third_party/blink/web_tests/webaudio/MediaStreamAudioDestination/mediastreamaudiodestinationnode.html
index 1fe988df..b40b3eb 100644
--- a/third_party/blink/web_tests/webaudio/MediaStreamAudioDestination/mediastreamaudiodestinationnode.html
+++ b/third_party/blink/web_tests/webaudio/MediaStreamAudioDestination/mediastreamaudiodestinationnode.html
@@ -41,10 +41,9 @@
                 'mediaStreamDestination.numberOfInputs')
                 .beEqualTo(1);
 
-            // We should have no outputs, but since we're implemented using
-            // AudioBasicInspectorNode, we have one.
+            // We should have no outputs
             should(mediaStreamDestination.numberOfOutputs, 'Number of outputs')
-                .beEqualTo(1);
+                .beEqualTo(0);
 
             // FIXME: add a test where we create a PeerConnection and call
             // addStream(mediaStreamDestination.stream).
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index bc78595..499ee06 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -958,9 +958,11 @@
 [Worker]     method toJSON
 [Worker] interface PerformanceMark : PerformanceEntry
 [Worker]     attribute @@toStringTag
+[Worker]     getter detail
 [Worker]     method constructor
 [Worker] interface PerformanceMeasure : PerformanceEntry
 [Worker]     attribute @@toStringTag
+[Worker]     getter detail
 [Worker]     method constructor
 [Worker] interface PerformanceObserver
 [Worker]     static getter supportedEntryTypes
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
index 4e98794..1d789ad 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -5389,9 +5389,11 @@
     method toJSON
 interface PerformanceMark : PerformanceEntry
     attribute @@toStringTag
+    getter detail
     method constructor
 interface PerformanceMeasure : PerformanceEntry
     attribute @@toStringTag
+    getter detail
     method constructor
 interface PerformanceNavigation
     attribute @@toStringTag
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
index 8990b75..857d0d4 100644
--- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -940,9 +940,11 @@
 [Worker]     method toJSON
 [Worker] interface PerformanceMark : PerformanceEntry
 [Worker]     attribute @@toStringTag
+[Worker]     getter detail
 [Worker]     method constructor
 [Worker] interface PerformanceMeasure : PerformanceEntry
 [Worker]     attribute @@toStringTag
+[Worker]     getter detail
 [Worker]     method constructor
 [Worker] interface PerformanceObserver
 [Worker]     static getter supportedEntryTypes
diff --git a/third_party/closure_compiler/externs/bluetooth.js b/third_party/closure_compiler/externs/bluetooth.js
index ff071e0..d6a884a 100644
--- a/third_party/closure_compiler/externs/bluetooth.js
+++ b/third_party/closure_compiler/externs/bluetooth.js
@@ -1,4 +1,4 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
+// Copyright 2019 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
@@ -55,6 +55,17 @@
 };
 
 /**
+ * @enum {string}
+ * @see https://developer.chrome.com/extensions/bluetooth#type-Transport
+ */
+chrome.bluetooth.Transport = {
+  INVALID: 'invalid',
+  CLASSIC: 'classic',
+  LE: 'le',
+  DUAL: 'dual',
+};
+
+/**
  * @typedef {{
  *   address: string,
  *   name: string,
@@ -82,7 +93,8 @@
  *   connectable: (boolean|undefined),
  *   uuids: (!Array<string>|undefined),
  *   inquiryRssi: (number|undefined),
- *   inquiryTxPower: (number|undefined)
+ *   inquiryTxPower: (number|undefined),
+ *   transport: (!chrome.bluetooth.Transport|undefined)
  * }}
  * @see https://developer.chrome.com/extensions/bluetooth#type-Device
  */
diff --git a/third_party/libvpx/README.chromium b/third_party/libvpx/README.chromium
index 3699a86..6c5d6ad 100644
--- a/third_party/libvpx/README.chromium
+++ b/third_party/libvpx/README.chromium
@@ -5,9 +5,9 @@
 License File: source/libvpx/LICENSE
 Security Critical: yes
 
-Date: Monday April 15 2019
+Date: Thursday April 25 2019
 Branch: master
-Commit: da5be113f3205544658db52201a66273cf7d6e70
+Commit: e50f4e4112a0e031dfc9df7a115fb0f8931bd4e1
 
 Description:
 Contains the sources used to compile libvpx binaries used by Google Chrome and
diff --git a/third_party/libvpx/source/config/ios/arm-neon/vpx_config.asm b/third_party/libvpx/source/config/ios/arm-neon/vpx_config.asm
index 7a7f7fb..042def7 100644
--- a/third_party/libvpx/source/config/ios/arm-neon/vpx_config.asm
+++ b/third_party/libvpx/source/config/ios/arm-neon/vpx_config.asm
@@ -1,8 +1,6 @@
 @ This file was created from a .asm file
 @  using the ads2gas_apple.pl script.
 
-	.set WIDE_REFERENCE, 0
-	.set ARCHITECTURE, 5
 	.syntax unified
 .set ARCH_ARM ,  1
 .set ARCH_MIPS ,  0
diff --git a/third_party/libvpx/source/config/ios/arm64/vpx_config.asm b/third_party/libvpx/source/config/ios/arm64/vpx_config.asm
index c4860ad..175bf73 100644
--- a/third_party/libvpx/source/config/ios/arm64/vpx_config.asm
+++ b/third_party/libvpx/source/config/ios/arm64/vpx_config.asm
@@ -1,8 +1,6 @@
 @ This file was created from a .asm file
 @  using the ads2gas_apple.pl script.
 
-	.set WIDE_REFERENCE, 0
-	.set ARCHITECTURE, 5
 	.syntax unified
 .set ARCH_ARM ,  1
 .set ARCH_MIPS ,  0
diff --git a/third_party/libvpx/source/config/vpx_version.h b/third_party/libvpx/source/config/vpx_version.h
index e9705ee6..6f19050 100644
--- a/third_party/libvpx/source/config/vpx_version.h
+++ b/third_party/libvpx/source/config/vpx_version.h
@@ -2,7 +2,7 @@
 #define VERSION_MAJOR  1
 #define VERSION_MINOR  8
 #define VERSION_PATCH  0
-#define VERSION_EXTRA  "380-gda5be113f3"
+#define VERSION_EXTRA  "424-ge50f4e411"
 #define VERSION_PACKED ((VERSION_MAJOR<<16)|(VERSION_MINOR<<8)|(VERSION_PATCH))
-#define VERSION_STRING_NOSP "v1.8.0-380-gda5be113f3"
-#define VERSION_STRING      " v1.8.0-380-gda5be113f3"
+#define VERSION_STRING_NOSP "v1.8.0-424-ge50f4e411"
+#define VERSION_STRING      " v1.8.0-424-ge50f4e411"
diff --git a/third_party/libvpx/source/config/win/arm64/vpx_config.asm b/third_party/libvpx/source/config/win/arm64/vpx_config.asm
index 02c1c51..0e3d1481 100644
--- a/third_party/libvpx/source/config/win/arm64/vpx_config.asm
+++ b/third_party/libvpx/source/config/win/arm64/vpx_config.asm
@@ -1,8 +1,6 @@
 @ This file was created from a .asm file
 @  using the ads2gas_apple.pl script.
 
-	.set WIDE_REFERENCE, 0
-	.set ARCHITECTURE, 5
 	.syntax unified
 .set ARCH_ARM ,  1
 .set ARCH_MIPS ,  0
diff --git a/third_party/unrar/src/unrar_wrapper.h b/third_party/unrar/src/unrar_wrapper.h
index 64cc4f4..1626af0 100644
--- a/third_party/unrar/src/unrar_wrapper.h
+++ b/third_party/unrar/src/unrar_wrapper.h
@@ -10,14 +10,8 @@
 #include "base/files/platform_file.h"
 #include "base/memory/scoped_refptr.h"
 
-// TODO(drubery): Remove this once http://crbug/909778 is fully rolled out.
-#include "third_party/unrar/src/rar.hpp"
-
 namespace third_party_unrar {
 
-// TODO(drubery): Remove this once http://crbug/909778 is fully rolled out.
-static const int kUnrarEndarcHead = HEAD_ENDARC;
-
 // Forward declare the unrar symbols needed for extraction, so users of
 // RarReader don't need all the symbols from unrar.
 class Archive;
diff --git a/tools/chrome_proxy/webdriver/common.py b/tools/chrome_proxy/webdriver/common.py
index 62f2bc62..c2ef4404 100644
--- a/tools/chrome_proxy/webdriver/common.py
+++ b/tools/chrome_proxy/webdriver/common.py
@@ -25,6 +25,10 @@
 from selenium import webdriver
 from selenium.webdriver.chrome.options import Options
 
+# Pretty printer for debug output.
+def PrettyPrintJSON(obj):
+  return json.dumps(obj, indent=2)
+
 # These network condition values are used in SetNetworkConnection()
 NETWORKS = {
     '4G': {
@@ -322,7 +326,7 @@
       self._logger.info('Using the Chrome binary at this path: %s',
         self._flags.chrome_exec)
     self._logger.debug('ChromeOptions will be parsed into these capabilities: '
-      '%s', json.dumps(chrome_options.to_capabilities()))
+      '%s', PrettyPrintJSON(chrome_options.to_capabilities()))
     driver = webdriver.Chrome(executable_path=self._flags.chrome_driver,
       desired_capabilities=capabilities, chrome_options=chrome_options)
     driver.command_executor._commands.update({
@@ -598,7 +602,8 @@
       json_file_content = json_file_content[:end] + ']}'
       return json.loads(json_file_content)
 
-  def GetPerformanceLogs(self, method_filter=r'Network\.responseReceived'):
+  def GetPerformanceLogs(self, method_filter=r'Network\.(requestWillBeSent|' +
+                                                        'responseReceived)'):
     """Returns all logged Performance events from Chrome. Raises an Exception if
     no pages have been loaded since the last time this function was called.
 
@@ -614,7 +619,7 @@
     all_messages = []
     for log in self._driver.execute('getLog', {'type': 'performance'})['value']:
       message = json.loads(log['message'])['message']
-      self._logger.debug('Got Performance log: %s', log['message'])
+      self._logger.debug('Got Performance log:\n%s', PrettyPrintJSON(message))
       if re.match(method_filter, message['method']):
         all_messages.append(message)
     self._logger.info('Got %d performance logs with filter method=%s',
@@ -664,8 +669,12 @@
     """
     if override_has_logs:
       self._has_logs = True
-    def MakeHTTPResponse(log_dict):
-      params = log_dict['params']
+
+    all_requests = {}  # map from requestId to params
+    all_responses = [] # list of HTTPResponse
+
+    def MakeHTTPResponse(message):
+      params = message['params']
       response_dict = params['response']
       http_response_dict = {
         'response_headers': response_dict['headers'] if 'headers' in
@@ -678,11 +687,21 @@
         'port': response_dict['remotePort'] if 'remotePort' in response_dict
           else -1,
         'status': response_dict['status'] if 'status' in response_dict else -1,
-        'request_type': params['type'] if 'type' in params else ''
+        'request_type': params['type'] if 'type' in params else '',
+        'redirect_chain': [],
       }
+      for request in all_requests[params['requestId']][:-1]:
+        http_response_dict['redirect_chain'].append(request['request']['url'])
       return HTTPResponse(**http_response_dict)
-    all_responses = []
+
     for message in self.GetPerformanceLogs():
+      if message['method'] == 'Network.requestWillBeSent':
+        requestId = message['params']['requestId']
+        if requestId not in all_requests:
+          all_requests[requestId] = [message['params']]
+        else:
+          all_requests[requestId].append(message['params'])
+        continue
       response = MakeHTTPResponse(message)
       self._logger.debug('New HTTPResponse: %s', str(response))
       is_favicon = response.url.endswith('favicon.ico')
@@ -717,7 +736,7 @@
   """
 
   def __init__(self, response_headers, request_headers, url, protocol, port,
-      status, request_type):
+      status, request_type, redirect_chain):
     self._response_headers = {}
     self._request_headers = {}
     self._url = url
@@ -725,6 +744,7 @@
     self._port = port
     self._status = status
     self._request_type = request_type
+    self._redirect_chain = redirect_chain # empty if no redirects
     self._flags = ParseFlags()
     # Make all header names lower case.
     for name in response_headers:
@@ -733,16 +753,16 @@
       self._request_headers[name.lower()] = request_headers[name]
 
   def __str__(self):
-    self_dict = {
+    return PrettyPrintJSON({
       'response_headers': self._response_headers,
       'request_headers': self._request_headers,
       'url': self._url,
       'protocol': self._protocol,
       'port': self._port,
       'status': self._status,
-      'request_type': self._request_type
-    }
-    return json.dumps(self_dict, indent=2)
+      'request_type': self._request_type,
+      'redirect_chain': self._redirect_chain,
+    })
 
   @property
   def response_headers(self):
@@ -772,6 +792,10 @@
   def request_type(self):
     return self._request_type
 
+  @property
+  def redirect_chain(self):
+    return self._redirect_chain
+
   def ResponseHasViaHeader(self):
     return 'via' in self._response_headers and (self._response_headers['via'] ==
       self._flags.via_header_value)
diff --git a/tools/chrome_proxy/webdriver/https_previews.py b/tools/chrome_proxy/webdriver/https_previews.py
index d3b0170..a5777543 100644
--- a/tools/chrome_proxy/webdriver/https_previews.py
+++ b/tools/chrome_proxy/webdriver/https_previews.py
@@ -16,6 +16,7 @@
 
 NAV_THROTTLE_VERSION = "v1_NavThrottle"
 URL_LOADER_VERSION = "v2_URLLoader"
+LITEPAGES_REGEXP = r'https://\w+\.litepages\.googlezip\.net/.*'
 
 # These are integration tests for server provided previews and the
 # protocol that supports them. This class is intended as an abstract base class
@@ -67,6 +68,8 @@
 
     Args:
       t: the TestDriver object.
+      expectedText: text that should appear in the HTML response body.
+      expectedImages: the number of images that should be fetched.
     """
     lite_page_responses = 0
     image_responses = 0
@@ -75,15 +78,12 @@
       content_type = ''
       if 'content-type' in response.response_headers:
         content_type = response.response_headers['content-type']
-
       if 'text/html' in content_type:
-        self.assertRegexpMatches(response.url,
-                                 r"https://\w+\.litepages\.googlezip\.net/")
+        self.assertRegexpMatches(response.url, LITEPAGES_REGEXP)
         self.assertEqual(200, response.status)
         lite_page_responses += 1
       if 'image/' in content_type:
-        self.assertRegexpMatches(response.url,
-                                 r"https://\w+\.litepages\.googlezip\.net/")
+        self.assertRegexpMatches(response.url, LITEPAGES_REGEXP)
         self.assertEqual(200, response.status)
         image_responses += 1
 
@@ -95,11 +95,15 @@
 
     self.assertPreviewShownViaHistogram(t, 'LitePageRedirect')
 
-  def _AssertShowingOriginalPage(self, t, expectedURL, expectedStatus):
+  def _AssertShowingOriginalPage(self, t, expectedURL, expectedStatus,
+                                 expectedBypassCount = 1):
     """Asserts that Chrome has not loaded a Lite Page from the litepages server.
 
     Args:
       t: the TestDriver object.
+      expectedURL: the URL of the mainframe HTML response.
+      expectedStatus: the HTTP response status for the mainframe HTML response.
+      expectBypass: true if we expect a bypass from the litepages server.
     """
     html_responses = 0
 
@@ -108,8 +112,9 @@
         self.assertEqual(expectedStatus, response.status)
         html_responses += 1
 
+    bypass_count = t.GetHistogram('Previews.ServerLitePage.ServerResponse', 2)
     self.assertEqual(1, html_responses)
-
+    self.assertEqual(expectedBypassCount, bypass_count['count'])
     self.assertPreviewNotShownViaHistogram(t, 'LitePageRedirect')
 
   # Verifies that a Lite Page is not served when the server returns a bypass.
@@ -121,6 +126,23 @@
       t.LoadURL(url)
       self._AssertShowingOriginalPage(t, url, 200)
 
+  # Verifies that a Lite Page is not served when the server returns a bypass.
+  # Additionally, verifies that after receiving the host-blacklisted directive,
+  # previews will not be attempted for future navigations on the same host.
+  @ChromeVersionEqualOrAfterM(74)
+  def testServerReturnsBypassWithHostBlacklisted(self):
+    with TestDriver() as t:
+      self.EnableLitePageServerPreviewsAndInit(t)
+      url = 'https://mobilespeed-test2.appspot.com/static/litepagetests/bypass.html'
+      t.LoadURL(url)
+      self._AssertShowingOriginalPage(t, url, 200)
+      # Ensure the reload doesn't use a cached page.
+      t.LoadURL('chrome://settings/clearBrowserData')
+      # This second navigation should not attempt a preview, so the bypass count
+      # should not have been incremented a second time.
+      t.LoadURL(url)
+      self._AssertShowingOriginalPage(t, url, 200, expectedBypassCount = 1)
+
   # Verifies that a Lite Page is not served when the server returns a 404.
   @ChromeVersionEqualOrAfterM(74)
   def testServerReturns404(self):
@@ -215,9 +237,8 @@
 
       # Verify that the request is served by a Lite Page.
       lite_page_responses = 0
-      lite_page_regexp = re.compile('https://\w+\.litepages\.googlezip\.net/p')
       for response in t.GetHTTPResponses():
-        if lite_page_regexp.search(response.url) and response.status == 200:
+        if re.match(LITEPAGES_REGEXP, response.url) and response.status == 200:
           lite_page_responses += 1
       self.assertEqual(1, lite_page_responses)
 
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index a5d1a39..edc62c5 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -795,6 +795,24 @@
     },
 
     'tryserver.chromium.mac': {
+      'gpu-fyi-try-mac-amd-10.14': 'gpu_fyi_tests_release_trybot',
+      'gpu-fyi-try-mac-amd-dqp': 'deqp_release_trybot',
+      'gpu-fyi-try-mac-amd-pro-rel': 'gpu_fyi_tests_release_trybot',
+      'gpu-fyi-try-mac-amd-retina-dbg': 'gpu_fyi_tests_debug_trybot',
+      'gpu-fyi-try-mac-amd-retina-exp': 'gpu_fyi_tests_release_trybot',
+      'gpu-fyi-try-mac-amd-retina-rel': 'gpu_fyi_tests_release_trybot',
+      'gpu-fyi-try-mac-asan': 'gpu_fyi_tests_release_trybot_asan',
+      'gpu-fyi-try-mac-intel-10.14': 'gpu_fyi_tests_release_trybot',
+      'gpu-fyi-try-mac-intel-dbg': 'gpu_fyi_tests_debug_trybot',
+      'gpu-fyi-try-mac-intel-dqp': 'deqp_release_trybot',
+      'gpu-fyi-try-mac-intel-exp': 'gpu_fyi_tests_release_trybot',
+      'gpu-fyi-try-mac-intel-rel': 'gpu_fyi_tests_release_trybot',
+      'gpu-fyi-try-mac-nvidia-10.14': 'gpu_fyi_tests_release_trybot',
+      'gpu-fyi-try-mac-nvidia-retina-dbg': 'gpu_fyi_tests_debug_trybot',
+      'gpu-fyi-try-mac-nvidia-retina-exp': 'gpu_fyi_tests_release_trybot',
+      'gpu-fyi-try-mac-nvidia-retina-rel': 'gpu_fyi_tests_release_trybot',
+      'gpu-try-mac-amd-retina-dbg': 'gpu_tests_debug_trybot',
+      'gpu-try-mac-intel-dbg': 'gpu_tests_debug_trybot',
       'ios-device': 'ios_error',
       'ios-device-xcode-clang': 'ios_error',
       'ios-simulator': 'ios_error',
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 315120b..5d7a786f 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -32405,6 +32405,8 @@
   <int value="-1907342706" label="ReadItLaterInMenu:disabled"/>
   <int value="-1903365454" label="SyncPseudoUSSPreferences:disabled"/>
   <int value="-1899715534" label="GamepadPollingInterval:enabled"/>
+  <int value="-1899409297"
+      label="ProcessSharingWithStrictSiteInstances:disabled"/>
   <int value="-1895719323" label="VrBrowsingTabsView:enabled"/>
   <int value="-1894699049" label="AudioFocusEnforcement:disabled"/>
   <int value="-1893668420"
@@ -32669,6 +32671,7 @@
   <int value="-1488744539" label="QuickUnlockFingerprint:enabled"/>
   <int value="-1487243228" label="NewUsbBackend:disabled"/>
   <int value="-1486198877" label="VrIconInDaydreamHome:disabled"/>
+  <int value="-1485461805" label="EnterpriseReportingInBrowser:enabled"/>
   <int value="-1482730792" label="stop-in-background:enabled"/>
   <int value="-1482685863" label="enable-request-tablet-site"/>
   <int value="-1481990501" label="Windows10CustomTitlebar:disabled"/>
@@ -33463,6 +33466,7 @@
   <int value="-286603268" label="hide-android-files-in-files-app"/>
   <int value="-284547865" label="UnifiedConsent:enabled"/>
   <int value="-283388027" label="ManualFallbacksFilling:disabled"/>
+  <int value="-283024110" label="WebXRPlaneDetection:disabled"/>
   <int value="-281844827" label="AutofillCreditCardAblationExperiment:enabled"/>
   <int value="-279920685" label="affiliation-based-matching:enabled"/>
   <int value="-279493876" label="WebVRExperimentalRendering:enabled"/>
@@ -33583,6 +33587,7 @@
   <int value="-88273414" label="ContentSuggestionsShowSummary:enabled"/>
   <int value="-86788587" label="allow-autofill-sync-credential"/>
   <int value="-86243376" label="LayoutNG:enabled"/>
+  <int value="-82530769" label="WebXRPlaneDetection:enabled"/>
   <int value="-80501013" label="AutofillOffNoServerData:enabled"/>
   <int value="-80353187" label="disable-display-color-calibration"/>
   <int value="-79327236" label="ModeSpecificPowerButton:enabled"/>
@@ -33664,6 +33669,7 @@
   <int value="27507364" label="apps-keep-chrome-alive"/>
   <int value="29212695" label="OfflineIndicator:enabled"/>
   <int value="31848187" label="ViewsTaskManager:disabled"/>
+  <int value="32057053" label="EnterpriseReportingInBrowser:disabled"/>
   <int value="32488630" label="EphemeralTab:enabled"/>
   <int value="33778663" label="OriginTrials:enabled"/>
   <int value="36422284"
@@ -34999,6 +35005,8 @@
   <int value="2129929643" label="enable-use-zoom-for-dsf"/>
   <int value="2134480727" label="MediaSessionAccelerators:disabled"/>
   <int value="2135408204" label="OverscrollHistoryNavigation:disabled"/>
+  <int value="2137113620"
+      label="ProcessSharingWithStrictSiteInstances:enabled"/>
   <int value="2137347307" label="enable-drive-apps-in-app-list"/>
   <int value="2137599770" label="enable-win32k-renderer-lockdown"/>
   <int value="2138146331" label="OmniboxVoiceSearchAlwaysVisible:enabled"/>
diff --git a/tools/metrics/histograms/extract_histograms.py b/tools/metrics/histograms/extract_histograms.py
index aa0151a..9ae2d0cd4 100644
--- a/tools/metrics/histograms/extract_histograms.py
+++ b/tools/metrics/histograms/extract_histograms.py
@@ -53,6 +53,7 @@
 
 """
 
+import HTMLParser
 import bisect
 import copy
 import datetime
@@ -90,9 +91,9 @@
 
 
 def _NormalizeString(s):
-  """Replaces all whitespace sequences with a single space.
+  r"""Replaces all whitespace sequences with a single space.
 
-  The function properly handles multi-line strings.
+  The function properly handles multi-line strings and XML escaped characters.
 
   Args:
     s: The string to normalize, ('  \\n a  b c\\n d  ').
@@ -100,7 +101,11 @@
   Returns:
     The normalized string (a b c d).
   """
-  return ' '.join(s.split())
+  singleline_value = ' '.join(s.split())
+
+  # Unescape using default ASCII encoding. Unescapes any HTML escaped character
+  # like &quot; etc.
+  return HTMLParser.HTMLParser().unescape(singleline_value)
 
 
 def _NormalizeAllAttributeValues(node):
diff --git a/tools/metrics/histograms/extract_histograms_test.py b/tools/metrics/histograms/extract_histograms_test.py
index eb688c1..178dfa8a 100644
--- a/tools/metrics/histograms/extract_histograms_test.py
+++ b/tools/metrics/histograms/extract_histograms_test.py
@@ -55,6 +55,25 @@
         histogram_with_owner_placeholder, {})
     self.assertFalse(have_errors)
 
+  def testHistogramWithEscapeCharacters(self):
+    histogram_with_owner_placeholder = xml.dom.minidom.parseString("""
+<histogram-configuration>
+<histograms>
+ <histogram name="Test.Histogram" units="things">
+  <owner> Please list the metric's owners. Add more owner tags as needed.
+  </owner>
+  <summary>This is a summary with &amp; and &quot; and &apos;</summary>
+ </histogram>
+</histograms>
+</histogram-configuration>
+""")
+    (hists, have_errors) = extract_histograms._ExtractHistogramsFromXmlTree(
+        histogram_with_owner_placeholder, {})
+    self.assertFalse(have_errors)
+    self.assertIn('Test.Histogram', hists)
+    self.assertIn('summary', hists['Test.Histogram'])
+    self.assertEquals('This is a summary with & and " and \'',
+                      hists['Test.Histogram']['summary'])
 
 if __name__ == "__main__":
   logging.basicConfig(level=logging.ERROR + 1)
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 7f58ed6..d7d1ac6 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -4096,8 +4096,11 @@
 </histogram>
 
 <histogram name="Apps.AppListSearchBoxActivated"
-    enum="SearchBoxActivationSource">
+    enum="SearchBoxActivationSource" expires_after="2020-04-26">
+<!-- Name completed by histogram_suffixes name="TabletOrClamshellMode" -->
+
   <owner>newcomer@chromium.org</owner>
+  <owner>mmourgos@chromium.org</owner>
   <summary>
     The number of times the applist searchbox has been activated. This is split
     by keystroke, mouse press, and gesture tap activations. This is gathered
@@ -16571,6 +16574,19 @@
   </summary>
 </histogram>
 
+<histogram name="ChromeOS.SystemTray.FeaturePodCountOnOpen" units="count"
+    expires_after="M80">
+  <owner>tengs@chromium.org</owner>
+  <owner>amehfooz@chromium.org</owner>
+  <summary>
+    The number of feature pods (e.g. WiFi, Bluetooth, IME, Accessibility, etc.)
+    in the system tray quick settings when it is opened, including pods that
+    overflow to other pages. See
+    ChromeOS.SystemTray.Tablet.FeaturePodCountOnOpen for the corresponding
+    histogram logged in tablet mode.
+  </summary>
+</histogram>
+
 <histogram name="ChromeOS.SystemTray.Interaction"
     enum="CrosSystemTrayInteraction">
   <owner>tetsui@chromium.org</owner>
@@ -16599,6 +16615,18 @@
   </summary>
 </histogram>
 
+<histogram name="ChromeOS.SystemTray.Tablet.FeaturePodCountOnOpen"
+    units="count" expires_after="M80">
+  <owner>tengs@chromium.org</owner>
+  <owner>amehfooz@chromium.org</owner>
+  <summary>
+    The number of feature pods (e.g. WiFi, Bluetooth, IME, Accessibility, etc.)
+    in the system tray quick settings when it is opened, including pods that
+    overflow to other pages. This histogram is only logged when the device is in
+    tablet mode, otherwise ChromeOS.SystemTray.FeaturePodCountOnOpen is logged.
+  </summary>
+</histogram>
+
 <histogram name="ChromeOS.SystemTray.TimeToClick" units="ms"
     expires_after="M77">
   <owner>tetsui@chromium.org</owner>
@@ -24909,6 +24937,17 @@
   </summary>
 </histogram>
 
+<histogram name="DirectWrite.Fonts.Gfx.InitializeLoopCount" expires_after="M77">
+  <owner>drott@chromium.org</owner>
+  <owner>etienneb@chromium.org</owner>
+  <summary>
+    The number of iterations that was required to initialize Direct Write. This
+    metric is taken by the browser process at startup. The value -1 is reported
+    when the initialization failed. The fallback path using GDI is used instead
+    of DWrite.
+  </summary>
+</histogram>
+
 <histogram name="DirectWrite.Fonts.Ignored">
   <owner>drott@chromium.org</owner>
   <summary>
@@ -28704,6 +28743,10 @@
 
 <histogram base="true" name="Download.Service.Request.StartResult"
     enum="Download.Service.StartResult">
+  <obsolete>
+    Download client api no longer expects a repsponse from the client when a
+    download is started.
+  </obsolete>
 <!-- Name completed by histogram_suffixes
      name="Download.Service.Client" -->
 
@@ -156017,6 +156060,7 @@
   <suffix name="ClamshellMode" label="Clamshell Mode Enabled"/>
   <suffix name="TabletMode" label="Tablet Mode Enabled"/>
   <affected-histogram name="Apps.AppListFolderNameLength"/>
+  <affected-histogram name="Apps.AppListSearchBoxActivated"/>
   <affected-histogram name="Apps.AppListSearchQueryLength"/>
   <affected-histogram name="Apps.AppListSearchResultOpenTypeV2"/>
   <affected-histogram
diff --git a/tools/win/DebugVisualizers/webkit.natvis b/tools/win/DebugVisualizers/webkit.natvis
index 535b2ab..1c331b1 100644
--- a/tools/win/DebugVisualizers/webkit.natvis
+++ b/tools/win/DebugVisualizers/webkit.natvis
@@ -152,11 +152,11 @@
   </Type>
   <!-- Component build version -->
   <Type Name="blink::WebString">
-    <DisplayString>{(blink_platform.dll!WTF::StringImpl*)(private_.storage_)}</DisplayString>
+    <DisplayString>{(wtf.dll!WTF::StringImpl*)(impl_.ptr_)}</DisplayString>
   </Type>
   <!-- Non-component build version -->
   <Type Name="blink::WebString" Priority="Low">
-    <DisplayString>{(WTF::StringImpl*)(private_.storage_)}</DisplayString>
+    <DisplayString>{(WTF::StringImpl*)(impl_.ptr_)}</DisplayString>
   </Type>
   <!-- DOM -->
   <Type Name="blink::QualifiedName">
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
index 179d3ae..2a14b4a 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -314,7 +314,7 @@
 <translation id="485316830061041779">जर्मन</translation>
 <translation id="4873265419374180291"><ph name="NUMBER_OF_BYTES" /> बाइट</translation>
 <translation id="4880214202172289027">वॉल्‍यूम स्‍लाइडर</translation>
-<translation id="4880520557730313061">स्‍वत:एडजस्ट करें</translation>
+<translation id="4880520557730313061">अपने-आप एडजस्ट करें</translation>
 <translation id="4881695831933465202">खोलें</translation>
 <translation id="4886021172213954916">तमिल कीबोर्ड (टाइपराइटर)</translation>
 <translation id="4892969127351273348"><ph name="APP_NAME" /> के साथ नहीं खोला जा सकता</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
index 47c9bf5..bbeac93 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -519,7 +519,7 @@
 <translation id="719009910964971313">US புரோகிராமர் டிவோரக் விசைப்பலகை</translation>
 <translation id="7191454237977785534">கோப்பை இவ்வாறு சேமி </translation>
 <translation id="7222624196722476520">பல்கேரியன் ஒலிப்புமுறை விசைப்பலகை</translation>
-<translation id="7248671827512403053">பயன்பாடு</translation>
+<translation id="7248671827512403053">ஆப்ஸ்</translation>
 <translation id="7268659760406822741">கிடைக்கும் சேவைகள்</translation>
 <translation id="7283041136720745563">உங்கள் Google இயக்கக ஒதுக்கீடு போதுமானதாக இல்லை.</translation>
 <translation id="7295662345261934369">பிறருடன் பகிர்</translation>
diff --git a/ui/compositor/BUILD.gn b/ui/compositor/BUILD.gn
index 4804d129d..d1d3a8a 100644
--- a/ui/compositor/BUILD.gn
+++ b/ui/compositor/BUILD.gn
@@ -25,8 +25,6 @@
     "compositor_observer.h",
     "compositor_switches.cc",
     "compositor_switches.h",
-    "compositor_vsync_manager.cc",
-    "compositor_vsync_manager.h",
     "debug_utils.cc",
     "debug_utils.h",
     "dip_util.cc",
diff --git a/ui/compositor/DEPS b/ui/compositor/DEPS
index 909669b..a03ced13 100644
--- a/ui/compositor/DEPS
+++ b/ui/compositor/DEPS
@@ -4,6 +4,7 @@
   "+components/viz/host",
   "+components/viz/service",
   "+gpu/command_buffer/client/gles2_interface.h",
+  "+services/viz/privileged/interfaces/compositing",
   "+services/ws/public/cpp",
   "+skia/ext/refptr.h",
   "+third_party/khronos/GLES2/gl2.h",
diff --git a/ui/compositor/compositor.cc b/ui/compositor/compositor.cc
index 460ad03..d101328 100644
--- a/ui/compositor/compositor.cc
+++ b/ui/compositor/compositor.cc
@@ -39,12 +39,12 @@
 #include "components/viz/host/host_frame_sink_manager.h"
 #include "components/viz/host/renderer_settings_creation.h"
 #include "components/viz/service/frame_sinks/frame_sink_manager_impl.h"
+#include "services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom.h"
 #include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/base/ui_base_switches.h"
 #include "ui/compositor/compositor_observer.h"
 #include "ui/compositor/compositor_switches.h"
-#include "ui/compositor/compositor_vsync_manager.h"
 #include "ui/compositor/dip_util.h"
 #include "ui/compositor/external_begin_frame_client.h"
 #include "ui/compositor/layer.h"
@@ -76,7 +76,6 @@
       context_factory_private_(context_factory_private),
       frame_sink_id_(frame_sink_id),
       task_runner_(task_runner),
-      vsync_manager_(new CompositorVSyncManager()),
       external_begin_frame_client_(external_begin_frame_client),
       force_software_compositor_(force_software_compositor),
       layer_animator_collection_(this),
@@ -546,7 +545,14 @@
     context_factory_private_->SetDisplayVSyncParameters(this, timebase,
                                                         interval);
   }
-  vsync_manager_->UpdateVSyncParameters(timebase, interval);
+}
+
+void Compositor::AddVSyncParameterObserver(
+    viz::mojom::VSyncParameterObserverPtr observer) {
+  if (context_factory_private_) {
+    context_factory_private_->AddVSyncParameterObserver(this,
+                                                        std::move(observer));
+  }
 }
 
 void Compositor::SetAcceleratedWidget(gfx::AcceleratedWidget widget) {
@@ -576,10 +582,6 @@
   return widget_;
 }
 
-scoped_refptr<CompositorVSyncManager> Compositor::vsync_manager() const {
-  return vsync_manager_;
-}
-
 void Compositor::AddObserver(CompositorObserver* observer) {
   observer_list_.AddObserver(observer);
 }
diff --git a/ui/compositor/compositor.h b/ui/compositor/compositor.h
index f7c3da2..d1352c0 100644
--- a/ui/compositor/compositor.h
+++ b/ui/compositor/compositor.h
@@ -25,6 +25,7 @@
 #include "components/viz/common/surfaces/frame_sink_id.h"
 #include "components/viz/common/surfaces/local_surface_id_allocation.h"
 #include "components/viz/host/host_frame_sink_client.h"
+#include "services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom-forward.h"
 #include "third_party/skia/include/core/SkColor.h"
 #include "third_party/skia/include/core/SkMatrix44.h"
 #include "ui/compositor/compositor_animation_observer.h"
@@ -73,7 +74,6 @@
 namespace ui {
 
 class Compositor;
-class CompositorVSyncManager;
 class ExternalBeginFrameClient;
 class LatencyInfo;
 class Layer;
@@ -154,6 +154,11 @@
                                        const viz::BeginFrameArgs& args) = 0;
 
   virtual void SetOutputIsSecure(Compositor* compositor, bool secure) = 0;
+
+  // Adds an observer for vsync parameter changes.
+  virtual void AddVSyncParameterObserver(
+      Compositor* compositor,
+      viz::mojom::VSyncParameterObserverPtr observer) = 0;
 };
 
 // This class abstracts the creation of the 3D context for the compositor. It is
@@ -318,11 +323,12 @@
                                gfx::ScrollOffset* offset) const;
   bool ScrollLayerTo(cc::ElementId element_id, const gfx::ScrollOffset& offset);
 
-  // Most platforms set their vsync info via
-  // BrowerCompositorLayerTreeFrameSink::OnUpdateVSyncParametersFromGpu(), but
-  // Mac routes vsync info via the browser compositor instead through this path.
+  // Mac sets vsync parameters through the browser compositor rather than from
+  // the GPU.
   void SetDisplayVSyncParameters(base::TimeTicks timebase,
                                  base::TimeDelta interval);
+  void AddVSyncParameterObserver(
+      viz::mojom::VSyncParameterObserverPtr observer);
 
   // Sets the widget for the compositor to render into.
   void SetAcceleratedWidget(gfx::AcceleratedWidget widget);
@@ -332,9 +338,6 @@
   gfx::AcceleratedWidget ReleaseAcceleratedWidget();
   gfx::AcceleratedWidget widget() const;
 
-  // Returns the vsync manager for this compositor.
-  scoped_refptr<CompositorVSyncManager> vsync_manager() const;
-
   // This flag is used to force a compositor into software compositing even tho
   // in general chrome is using gpu compositing. This allows the compositor to
   // be created without a gpu context, and does not go through the gpu path at
@@ -485,9 +488,6 @@
   std::unique_ptr<cc::LayerTreeHost> host_;
   scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
 
-  // The manager of vsync parameters for this compositor.
-  scoped_refptr<CompositorVSyncManager> vsync_manager_;
-
   // Snapshot of last set vsync parameters, to avoid redundant IPCs.
   base::TimeTicks vsync_timebase_;
   base::TimeDelta vsync_interval_;
diff --git a/ui/compositor/compositor_vsync_manager.cc b/ui/compositor/compositor_vsync_manager.cc
deleted file mode 100644
index 6c53788..0000000
--- a/ui/compositor/compositor_vsync_manager.cc
+++ /dev/null
@@ -1,35 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/compositor/compositor_vsync_manager.h"
-
-namespace ui {
-
-CompositorVSyncManager::CompositorVSyncManager() = default;
-
-CompositorVSyncManager::~CompositorVSyncManager() {}
-
-void CompositorVSyncManager::UpdateVSyncParameters(base::TimeTicks timebase,
-                                                   base::TimeDelta interval) {
-  last_timebase_ = timebase;
-  last_interval_ = interval;
-  NotifyObservers(timebase, interval);
-}
-
-void CompositorVSyncManager::AddObserver(Observer* observer) {
-  observer_list_.AddObserver(observer);
-  observer->OnUpdateVSyncParameters(last_timebase_, last_interval_);
-}
-
-void CompositorVSyncManager::RemoveObserver(Observer* observer) {
-  observer_list_.RemoveObserver(observer);
-}
-
-void CompositorVSyncManager::NotifyObservers(base::TimeTicks timebase,
-                                             base::TimeDelta interval) {
-  for (auto& observer : observer_list_)
-    observer.OnUpdateVSyncParameters(timebase, interval);
-}
-
-}  // namespace ui
diff --git a/ui/compositor/compositor_vsync_manager.h b/ui/compositor/compositor_vsync_manager.h
deleted file mode 100644
index 3c4989b..0000000
--- a/ui/compositor/compositor_vsync_manager.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_COMPOSITOR_COMPOSITOR_VSYNC_MANAGER_H_
-#define UI_COMPOSITOR_COMPOSITOR_VSYNC_MANAGER_H_
-
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/observer_list.h"
-#include "base/synchronization/lock.h"
-#include "base/time/time.h"
-#include "ui/compositor/compositor_export.h"
-
-namespace ui {
-
-// This class manages vsync parameters for a compositor. It merges updates of
-// the parameters from different sources and sends the merged updates to
-// observers which register to it.
-class COMPOSITOR_EXPORT CompositorVSyncManager
-    : public base::RefCounted<CompositorVSyncManager> {
- public:
-  class Observer {
-   public:
-    virtual ~Observer() = default;
-    virtual void OnUpdateVSyncParameters(base::TimeTicks timebase,
-                                         base::TimeDelta interval) = 0;
-  };
-
-  CompositorVSyncManager();
-
-  // The vsync parameters consist of |timebase|, which is the platform timestamp
-  // of the last vsync, and |interval|, which is the interval between vsyncs.
-  void UpdateVSyncParameters(base::TimeTicks timebase,
-                             base::TimeDelta interval);
-
-  void AddObserver(Observer* observer);
-  void RemoveObserver(Observer* observer);
-
- private:
-  friend class base::RefCounted<CompositorVSyncManager>;
-
-  ~CompositorVSyncManager();
-
-  void NotifyObservers(base::TimeTicks timebase, base::TimeDelta interval);
-
-  base::ObserverList<Observer>::Unchecked observer_list_;
-
-  base::TimeTicks last_timebase_;
-  base::TimeDelta last_interval_;
-
-  DISALLOW_COPY_AND_ASSIGN(CompositorVSyncManager);
-};
-
-}  // namespace ui
-
-#endif  // UI_COMPOSITOR_COMPOSITOR_VSYNC_MANAGER_H_
diff --git a/ui/compositor/host/host_context_factory_private.cc b/ui/compositor/host/host_context_factory_private.cc
index 2b23ed4..f8b1e4b 100644
--- a/ui/compositor/host/host_context_factory_private.cc
+++ b/ui/compositor/host/host_context_factory_private.cc
@@ -16,6 +16,7 @@
 #include "components/viz/host/host_frame_sink_manager.h"
 #include "components/viz/host/renderer_settings_creation.h"
 #include "services/viz/privileged/interfaces/compositing/frame_sink_manager.mojom.h"
+#include "services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom.h"
 #include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h"
 #include "ui/compositor/host/external_begin_frame_controller_client_impl.h"
 #include "ui/compositor/reflector.h"
@@ -254,6 +255,19 @@
     iter->second.display_private->SetOutputIsSecure(secure);
 }
 
+void HostContextFactoryPrivate::AddVSyncParameterObserver(
+    Compositor* compositor,
+    viz::mojom::VSyncParameterObserverPtr observer) {
+  auto iter = compositor_data_map_.find(compositor);
+  if (iter == compositor_data_map_.end())
+    return;
+
+  if (iter->second.display_private) {
+    iter->second.display_private->AddVSyncParameterObserver(
+        std::move(observer));
+  }
+}
+
 viz::FrameSinkManagerImpl* HostContextFactoryPrivate::GetFrameSinkManager() {
   // When running with viz there is no FrameSinkManagerImpl in the browser
   // process. FrameSinkManagerImpl runs in the GPU process instead. Anything in
diff --git a/ui/compositor/host/host_context_factory_private.h b/ui/compositor/host/host_context_factory_private.h
index 18cd0964..dc31ab80 100644
--- a/ui/compositor/host/host_context_factory_private.h
+++ b/ui/compositor/host/host_context_factory_private.h
@@ -84,6 +84,9 @@
                                const viz::BeginFrameArgs& args) override;
   void SetOutputIsSecure(Compositor* compositor, bool secure) override;
   viz::FrameSinkManagerImpl* GetFrameSinkManager() override;
+  void AddVSyncParameterObserver(
+      Compositor* compositor,
+      viz::mojom::VSyncParameterObserverPtr observer) override;
 
  private:
   struct CompositorData {
diff --git a/ui/compositor/test/in_process_context_factory.h b/ui/compositor/test/in_process_context_factory.h
index 58dfb4f..505ce01 100644
--- a/ui/compositor/test/in_process_context_factory.h
+++ b/ui/compositor/test/in_process_context_factory.h
@@ -18,6 +18,7 @@
 #include "components/viz/test/test_gpu_memory_buffer_manager.h"
 #include "components/viz/test/test_shared_bitmap_manager.h"
 #include "gpu/ipc/common/surface_handle.h"
+#include "services/viz/privileged/interfaces/compositing/vsync_parameter_observer.mojom.h"
 #include "ui/compositor/compositor.h"
 
 namespace cc {
@@ -89,6 +90,9 @@
   void IssueExternalBeginFrame(ui::Compositor* compositor,
                                const viz::BeginFrameArgs& args) override {}
   void SetOutputIsSecure(ui::Compositor* compositor, bool secure) override {}
+  void AddVSyncParameterObserver(
+      ui::Compositor* compositor,
+      viz::mojom::VSyncParameterObserverPtr observer) override {}
   void AddObserver(ContextFactoryObserver* observer) override;
   void RemoveObserver(ContextFactoryObserver* observer) override;
   bool SyncTokensRequiredForDisplayCompositor() override;
diff --git a/ui/gfx/win/direct_write.cc b/ui/gfx/win/direct_write.cc
index d500b703..495c94b 100644
--- a/ui/gfx/win/direct_write.cc
+++ b/ui/gfx/win/direct_write.cc
@@ -7,12 +7,12 @@
 #include <wrl/client.h>
 
 #include "base/debug/alias.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/trace_event/trace_event.h"
 #include "base/win/windows_version.h"
 #include "skia/ext/fontmgr_default.h"
 #include "third_party/skia/include/core/SkFontMgr.h"
 #include "third_party/skia/include/ports/SkTypeface_win.h"
-#include "ui/gfx/platform_font_win.h"
 
 namespace gfx {
 namespace win {
@@ -64,7 +64,29 @@
   // (6.1.7600.*).
   sk_sp<SkFontMgr> direct_write_font_mgr =
       SkFontMgr_New_DirectWrite(factory.Get());
-  CHECK(!!direct_write_font_mgr);
+  int iteration = 0;
+  if (!direct_write_font_mgr &&
+      base::win::GetVersion() == base::win::Version::WIN7) {
+    // Windows (win7_rtm) may fail to map the service sections
+    // (crbug.com/956064).
+    constexpr int kMaxRetries = 5;
+    constexpr base::TimeDelta kRetrySleepTime =
+        base::TimeDelta::FromMicroseconds(500);
+    while (iteration < kMaxRetries) {
+      base::PlatformThread::Sleep(kRetrySleepTime);
+      direct_write_font_mgr = SkFontMgr_New_DirectWrite(factory.Get());
+      if (direct_write_font_mgr)
+        break;
+      ++iteration;
+    }
+  }
+  if (!direct_write_font_mgr)
+    iteration = -1;
+  base::UmaHistogramSparse("DirectWrite.Fonts.Gfx.InitializeLoopCount",
+                           iteration);
+  // TODO(crbug.com/956064): Move to a CHECK when the cause of the crash is
+  // fixed.
+  DCHECK(!!direct_write_font_mgr);
 
   // Override the default skia font manager. This must be called before any
   // use of the skia font manager is done (e.g. before any call to
diff --git a/ui/message_center/views/message_view.cc b/ui/message_center/views/message_view.cc
index 4817b5a..08e0146b 100644
--- a/ui/message_center/views/message_view.cc
+++ b/ui/message_center/views/message_view.cc
@@ -320,6 +320,9 @@
 }
 
 void MessageView::OnSlideOut() {
+  for (auto* observer : slide_observers_)
+    observer->OnSlideOut(notification_id_);
+
   MessageCenter::Get()->RemoveNotification(notification_id_,
                                            true /* by_user */);
 }
diff --git a/ui/message_center/views/message_view.h b/ui/message_center/views/message_view.h
index 8b59c16..68d7872 100644
--- a/ui/message_center/views/message_view.h
+++ b/ui/message_center/views/message_view.h
@@ -54,6 +54,7 @@
 
     virtual void OnSlideStarted(const std::string& notification_id) {}
     virtual void OnSlideChanged(const std::string& notification_id) {}
+    virtual void OnSlideOut(const std::string& notification_id) {}
   };
 
   enum class Mode {
diff --git a/ui/message_center/views/slide_out_controller.cc b/ui/message_center/views/slide_out_controller.cc
index d9d975b1..374a9af 100644
--- a/ui/message_center/views/slide_out_controller.cc
+++ b/ui/message_center/views/slide_out_controller.cc
@@ -132,9 +132,11 @@
       gesture_amount_ = 0.f;
       break;
     case SwipeControlOpenState::OPEN_ON_RIGHT:
+      gesture_amount_ = -swipe_control_width_;
       transform.Translate(-swipe_control_width_, 0);
       break;
     case SwipeControlOpenState::OPEN_ON_LEFT:
+      gesture_amount_ = swipe_control_width_;
       transform.Translate(swipe_control_width_, 0);
       break;
   }
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn
index f3314fc82..9ccfe71 100644
--- a/ui/views/BUILD.gn
+++ b/ui/views/BUILD.gn
@@ -918,6 +918,7 @@
       "//services/service_manager",
       "//services/service_manager/public/cpp",
       "//services/service_manager/public/mojom",
+      "//services/viz/public/cpp:manifest",
       "//services/ws/common",
       "//services/ws/ime/test_ime_driver/public/cpp:manifest",
       "//services/ws/public/mojom",
@@ -930,6 +931,7 @@
     ]
 
     data_deps = [
+      "//services/viz",
       "//services/ws/ime/test_ime_driver",
       "//ui/resources:ui_test_pak_data",
     ]
diff --git a/ui/views/test/DEPS b/ui/views/test/DEPS
index 9ce34d1..c5efd4c7 100644
--- a/ui/views/test/DEPS
+++ b/ui/views/test/DEPS
@@ -6,6 +6,7 @@
   "platform_test_helper_mus.cc": [
     "+services/service_manager/background_service_manager.h",
     "+services/service_manager/public",
+    "+services/viz/public/cpp",
     "+services/ws/ime/test_ime_driver/public/cpp/manifest.h",
     "+services/ws/test_ws/test_manifest.h",
   ]
diff --git a/ui/views/test/platform_test_helper_mus.cc b/ui/views/test/platform_test_helper_mus.cc
index 5d3b9d8..5ce4676 100644
--- a/ui/views/test/platform_test_helper_mus.cc
+++ b/ui/views/test/platform_test_helper_mus.cc
@@ -14,6 +14,7 @@
 #include "services/service_manager/public/cpp/manifest_builder.h"
 #include "services/service_manager/public/cpp/service.h"
 #include "services/service_manager/public/cpp/service_binding.h"
+#include "services/viz/public/cpp/manifest.h"
 #include "services/ws/ime/test_ime_driver/public/cpp/manifest.h"
 #include "services/ws/public/mojom/constants.mojom.h"
 #include "services/ws/test_ws/test_manifest.h"
@@ -139,6 +140,7 @@
         std::make_unique<service_manager::BackgroundServiceManager>(
             std::vector<service_manager::Manifest>{
                 test_ws::GetManifest(), test_ime_driver::GetManifest(),
+                viz::GetManifest(),
                 service_manager::ManifestBuilder()
                     .WithServiceName(kServiceName)
                     .RequireCapability("*", "app")
diff --git a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
index 606b5c0..4dda760 100644
--- a/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
+++ b/ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc
@@ -1186,7 +1186,7 @@
   if (window_mapped_in_client_) {
     XWithdrawWindow(xdisplay_, xwindow_, 0);
     window_mapped_in_client_ = false;
-    native_widget_delegate_->OnNativeWidgetVisibilityChanged(false);
+    SetVisible(false);
   }
 }