diff --git a/DEPS b/DEPS
index e3f78b84..85d11de 100644
--- a/DEPS
+++ b/DEPS
@@ -171,7 +171,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:b022173f8069cf8001d4cf2a87ce7c5f0eae220f',
+  'luci_go': 'git_revision:18502e6a01811b0c2dd2a0250e81bd82e47d2c2d',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -207,7 +207,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '183a454b9d5474abb097da2c527805a9c7379a6c',
+  'angle_revision': '75d257686e00d26633d0ae4648b1c9939fffda22',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -266,7 +266,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '01a6665d9a382f0c77c4d922c9211615e002e021',
+  'devtools_frontend_revision': '02fad13e19503b82c73778c2cf54bc25cb2dd652',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -947,7 +947,7 @@
     Var('chromium_git') + '/codecs/libgav1.git' + '@' + 'a9449e612bc251b4271bbe1e3a0d12e9809bf74c',
 
   'src/third_party/glslang/src':
-    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + '759ae5aec02bd6fe5f58a9c7cd6c98cc1968c7b5',
+    Var('chromium_git') + '/external/github.com/KhronosGroup/glslang.git' + '@' + 'f8a5602c55606f8e97f5576c85cbc2a58026a999',
 
   'src/third_party/google_toolbox_for_mac/src': {
       'url': Var('chromium_git') + '/external/github.com/google/google-toolbox-for-mac.git' + '@' + Var('google_toolbox_for_mac_revision'),
@@ -1249,7 +1249,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '9edd1a906f57a995531db1050629b608424ee202',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'bef393a5a340a4d6303b263cba7adee98372ab7f',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1471,7 +1471,7 @@
   },
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '71d7c8e3cdd61b69d09fc392b93cc8c461168f0d',
+    Var('webrtc_git') + '/src.git' + '@' + '8452ea86c5cbc8f3626c00ddd38ac43db57f1c4d',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1543,7 +1543,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@7214110d995df5f856022330b0fe9fd34c79cf31',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@44c9ca6a2c0e352909ae9cf9206b6155380446f3',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java
index 9ca82e6..9eb47932 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContents.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java
@@ -2089,10 +2089,16 @@
         return mSettings.supportsMultiTouchZoom();
     }
 
-    public View getZoomControlsForTest() {
+    @VisibleForTesting
+    public View getZoomControlsViewForTest() {
         return mZoomControls.getZoomControlsViewForTest();
     }
 
+    @VisibleForTesting
+    public AwZoomControls getZoomControlsForTest() {
+        return mZoomControls;
+    }
+
     /**
      * @see View#setOverScrollMode(int)
      */
@@ -3551,6 +3557,7 @@
             mContentsClient.getCallbackHelper().postOnScaleChangedScaled(
                     oldPageScaleFactor * dipScale, mPageScaleFactor * dipScale);
         }
+        mZoomControls.updateZoomControls();
     }
 
     private void saveWebArchiveInternal(String path, final Callback<String> callback) {
diff --git a/android_webview/java/src/org/chromium/android_webview/AwZoomControls.java b/android_webview/java/src/org/chromium/android_webview/AwZoomControls.java
index 27cabfc..44da099 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwZoomControls.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwZoomControls.java
@@ -10,17 +10,31 @@
 import android.view.ViewGroup;
 import android.widget.FrameLayout;
 
-class AwZoomControls {
+import androidx.annotation.VisibleForTesting;
 
+// This class is visible purely for tests.
+public class AwZoomControls {
     private AwContents mAwContents;
     // It is advised to use getZoomController() where possible.
     @SuppressWarnings("deprecation")
     private android.widget.ZoomButtonsController mZoomButtonsController;
+    private boolean mCanZoomIn;
+    private boolean mCanZoomOut;
 
     AwZoomControls(AwContents awContents) {
         mAwContents = awContents;
     }
 
+    @VisibleForTesting
+    public boolean canZoomIn() {
+        return mCanZoomIn;
+    }
+
+    @VisibleForTesting
+    public boolean canZoomOut() {
+        return mCanZoomOut;
+    }
+
     @SuppressWarnings("deprecation")
     public void invokeZoomPicker() {
         android.widget.ZoomButtonsController zoomController = getZoomController();
@@ -43,15 +57,15 @@
         if (zoomController == null) {
             return;
         }
-        boolean canZoomIn = mAwContents.canZoomIn();
-        boolean canZoomOut = mAwContents.canZoomOut();
-        if (!canZoomIn && !canZoomOut) {
+        mCanZoomIn = mAwContents.canZoomIn();
+        mCanZoomOut = mAwContents.canZoomOut();
+        if (!mCanZoomIn && !mCanZoomOut) {
             // Hide the zoom in and out buttons if the page cannot zoom
             zoomController.getZoomControls().setVisibility(View.GONE);
         } else {
             // Set each one individually, as a page may be able to zoom in or out
-            zoomController.setZoomInEnabled(canZoomIn);
-            zoomController.setZoomOutEnabled(canZoomOut);
+            zoomController.setZoomInEnabled(mCanZoomIn);
+            zoomController.setZoomOutEnabled(mCanZoomOut);
         }
     }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
index 3c7b40b..6679fd6 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
@@ -74,7 +74,6 @@
 @RunWith(AwJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ContentSwitches.HOST_RESOLVER_RULES + "=MAP * 127.0.0.1"})
 @Batch(Batch.PER_CLASS)
-@DisabledTest(message = "http://crbug.com/1126917")
 public class AwSettingsTest {
     @Rule
     public AwActivityTestRule mActivityTestRule =
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java
index 4308ba0f..a7dc882 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwZoomTest.java
@@ -73,8 +73,18 @@
         return ThreadUtils.runOnUiThreadBlocking(() -> view.getVisibility());
     }
 
-    private View getZoomControlsOnUiThread() throws Throwable {
-        return ThreadUtils.runOnUiThreadBlocking(() -> mAwContents.getZoomControlsForTest());
+    private View getZoomControlsViewOnUiThread() throws Throwable {
+        return ThreadUtils.runOnUiThreadBlocking(() -> mAwContents.getZoomControlsViewForTest());
+    }
+
+    private boolean canZoomInUsingZoomControls() throws Throwable {
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> mAwContents.getZoomControlsForTest().canZoomIn());
+    }
+
+    private boolean canZoomOutUsingZoomControls() throws Throwable {
+        return ThreadUtils.runOnUiThreadBlocking(
+                () -> mAwContents.getZoomControlsForTest().canZoomOut());
     }
 
     private void invokeZoomPickerOnUiThread() {
@@ -214,20 +224,46 @@
 
         // With DisplayZoomControls set to false, attempts to display zoom
         // controls must be ignored.
-        Assert.assertNull(getZoomControlsOnUiThread());
+        Assert.assertNull(getZoomControlsViewOnUiThread());
         invokeZoomPickerOnUiThread();
-        Assert.assertNull(getZoomControlsOnUiThread());
+        Assert.assertNull(getZoomControlsViewOnUiThread());
 
         webSettings.setDisplayZoomControls(true);
-        Assert.assertNull(getZoomControlsOnUiThread());
+        Assert.assertNull(getZoomControlsViewOnUiThread());
         invokeZoomPickerOnUiThread();
-        View zoomControls = getZoomControlsOnUiThread();
+        View zoomControls = getZoomControlsViewOnUiThread();
         Assert.assertEquals(View.VISIBLE, getVisibilityOnUiThread(zoomControls));
     }
 
     @Test
     @SmallTest
     @Feature({"AndroidWebView"})
+    public void testZoomControlsUiIsUpdatedOnChanges() throws Throwable {
+        AwSettings webSettings = mActivityTestRule.getAwSettingsOnUiThread(mAwContents);
+        webSettings.setDisplayZoomControls(true);
+        webSettings.setBuiltInZoomControls(true);
+        webSettings.setUseWideViewPort(true);
+        Assert.assertFalse(canZoomInUsingZoomControls());
+        Assert.assertFalse(canZoomOutUsingZoomControls());
+        final float pageMinimumScale = 0.5f;
+        mActivityTestRule.loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
+                getZoomableHtml(pageMinimumScale), "text/html", false);
+        waitForScaleToBecome(pageMinimumScale);
+        Assert.assertTrue(canZoomInUsingZoomControls());
+        Assert.assertFalse(canZoomOutUsingZoomControls());
+
+        zoomInOnUiThreadAndWait();
+        Assert.assertTrue(canZoomInUsingZoomControls());
+        Assert.assertTrue(canZoomOutUsingZoomControls());
+
+        zoomOutOnUiThreadAndWait();
+        Assert.assertTrue(canZoomInUsingZoomControls());
+        Assert.assertFalse(canZoomOutUsingZoomControls());
+    }
+
+    @Test
+    @SmallTest
+    @Feature({"AndroidWebView"})
     public void testZoomControlsOnNonZoomableContent() throws Throwable {
         AwSettings webSettings = mActivityTestRule.getAwSettingsOnUiThread(mAwContents);
         mActivityTestRule.loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
@@ -239,9 +275,9 @@
         Assert.assertTrue(webSettings.supportZoom());
         webSettings.setBuiltInZoomControls(true);
         webSettings.setDisplayZoomControls(true);
-        Assert.assertNull(getZoomControlsOnUiThread());
+        Assert.assertNull(getZoomControlsViewOnUiThread());
         invokeZoomPickerOnUiThread();
-        View zoomControls = getZoomControlsOnUiThread();
+        View zoomControls = getZoomControlsViewOnUiThread();
         Assert.assertEquals(View.GONE, getVisibilityOnUiThread(zoomControls));
     }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java
index 3f8d5e5..0b9e4cc2 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/devui/CrashesListFragmentTest.java
@@ -301,6 +301,10 @@
                 .check(matches(withText(CRASH_REPORT_BUTTON_TEXT)));
         bodyDataInteraction.onChildView(withId(R.id.crash_upload_button))
                 .check(matches(not(isDisplayed())));
+        bodyDataInteraction.onChildView(withId(R.id.crash_hide_button))
+                .check(matches(isDisplayed()))
+                .check(matches(isEnabled()))
+                .check(matches(withDrawable(R.drawable.ic_delete)));
     }
 
     @Test
@@ -336,6 +340,10 @@
                 .check(matches(isDisplayed()))
                 .check(matches(withText(CRASH_UPLOAD_BUTTON_TEXT)))
                 .check(matches(isEnabled()));
+        bodyDataInteraction.onChildView(withId(R.id.crash_hide_button))
+                .check(matches(isDisplayed()))
+                .check(matches(isEnabled()))
+                .check(matches(withDrawable(R.drawable.ic_delete)));
     }
 
     @Test
@@ -370,6 +378,10 @@
                 .perform(click());
         bodyDataInteraction.onChildView(withId(R.id.crash_upload_button))
                 .check(matches(not(isDisplayed())));
+        bodyDataInteraction.onChildView(withId(R.id.crash_hide_button))
+                .check(matches(isDisplayed()))
+                .check(matches(isEnabled()))
+                .check(matches(withDrawable(R.drawable.ic_delete)));
     }
 
     @Test
@@ -405,6 +417,10 @@
                 .check(matches(isDisplayed()))
                 .check(matches(withText(CRASH_UPLOAD_BUTTON_TEXT)))
                 .check(matches(isEnabled()));
+        bodyDataInteraction.onChildView(withId(R.id.crash_hide_button))
+                .check(matches(isDisplayed()))
+                .check(matches(isEnabled()))
+                .check(matches(withDrawable(R.drawable.ic_delete)));
     }
 
     @Test
@@ -503,4 +519,78 @@
                     onData(anything()).atPosition(i), crashInfo[crashReportsNum - i - 1]);
         }
     }
+
+    @Test
+    @Feature({"AndroidWebView"})
+    public void testHideCrashButton_uploaded() throws Throwable {
+        final long systemTime = System.currentTimeMillis();
+        CrashInfo crashInfo = createCrashInfo("123456", systemTime, "0abcde123456",
+                systemTime + 1000, FAKE_APP_PACKAGE_NAME, UploadState.UPLOADED);
+
+        assertThat("temp json log file should exist", writeJsonLogFile(crashInfo).exists());
+        assertThat("upload log file should exist", appendUploadedEntryToLog(crashInfo).exists());
+
+        CallbackHelper helper = getCrashListLoadedListener();
+        int crashListLoadInitCount = helper.getCallCount();
+        launchCrashesFragment();
+        helper.waitForCallback(crashListLoadInitCount, 1);
+
+        onView(withId(R.id.crashes_list)).check(matches(withCount(1)));
+
+        // Check crash item header
+        checkUnknownPackageCrashItemHeader(onData(anything()).atPosition(0), crashInfo)
+                .perform(click()); // click to expand it
+        // The body is considered item#2 in the list view after expansion
+        onView(withId(R.id.crashes_list)).check(matches(withCount(2)));
+        DataInteraction bodyDataInteraction = onData(anything()).atPosition(1);
+
+        crashListLoadInitCount = helper.getCallCount();
+
+        bodyDataInteraction.onChildView(withId(R.id.crash_hide_button))
+                .check(matches(isDisplayed()))
+                .check(matches(isEnabled()))
+                .check(matches(withDrawable(R.drawable.ic_delete)))
+                .perform(click());
+
+        helper.waitForCallback(crashListLoadInitCount, 1);
+
+        onView(withId(R.id.crashes_list)).check(matches(withCount(0)));
+    }
+
+    @Test
+    @Feature({"AndroidWebView"})
+    public void testHideCrashButton_pending() throws Throwable {
+        final long systemTime = System.currentTimeMillis();
+        CrashInfo crashInfo = createCrashInfo(
+                "123456", systemTime, null, -1, FAKE_APP_PACKAGE_NAME, UploadState.PENDING);
+
+        assertThat("temp minidump file should exist", createMinidumpFile(crashInfo).exists());
+        assertThat("temp json log file should exist", writeJsonLogFile(crashInfo).exists());
+
+        CallbackHelper helper = getCrashListLoadedListener();
+        int crashListLoadInitCount = helper.getCallCount();
+        launchCrashesFragment();
+        helper.waitForCallback(crashListLoadInitCount, 1);
+
+        onView(withId(R.id.crashes_list)).check(matches(withCount(1)));
+
+        // Check crash item header
+        checkUnknownPackageCrashItemHeader(onData(anything()).atPosition(0), crashInfo)
+                .perform(click()); // click to expand it
+        // The body is considered item#2 in the list view after expansion
+        onView(withId(R.id.crashes_list)).check(matches(withCount(2)));
+        DataInteraction bodyDataInteraction = onData(anything()).atPosition(1);
+
+        crashListLoadInitCount = helper.getCallCount();
+
+        bodyDataInteraction.onChildView(withId(R.id.crash_hide_button))
+                .check(matches(isDisplayed()))
+                .check(matches(isEnabled()))
+                .check(matches(withDrawable(R.drawable.ic_delete)))
+                .perform(click());
+
+        helper.waitForCallback(crashListLoadInitCount, 1);
+
+        onView(withId(R.id.crashes_list)).check(matches(withCount(0)));
+    }
 }
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb
index acde153..42d8205 100644
--- a/ash/strings/ash_strings_ar.xtb
+++ b/ash/strings/ash_strings_ar.xtb
@@ -74,7 +74,7 @@
 <translation id="1708345662127501511">سطح المكتب: <ph name="DESK_NAME" /></translation>
 <translation id="1709762881904163296">إعدادات الشبكة</translation>
 <translation id="1743570585616704562">لم يتم التعرف عليها</translation>
-<translation id="1746730358044914197">تتم تهيئة طرق الإدخال بواسطة المشرف.</translation>
+<translation id="1746730358044914197">يتم إعداد طرق الإدخال بواسطة المشرف.</translation>
 <translation id="1747827819627189109">تم تفعيل لوحة المفاتيح على الشاشة</translation>
 <translation id="1761222317188459878">تبديل الاتصال بالشبكة. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">التمرير لليمين</translation>
@@ -640,7 +640,7 @@
 <translation id="8129620843620772246"><ph name="TEMPERATURE_C" />° مئوية</translation>
 <translation id="8131740175452115882">التأكيد</translation>
 <translation id="8132793192354020517">تم الاتصال بالموقع <ph name="NAME" /></translation>
-<translation id="813913629614996137">جارٍ التهيئة...</translation>
+<translation id="813913629614996137">تجري التهيئة...</translation>
 <translation id="8142441511840089262">النقر مرّتين</translation>
 <translation id="8142699993796781067">الشبكة الخاصة</translation>
 <translation id="8152092012181020186">‏يُرجى الضغط على Ctrl + W للإغلاق.</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb
index fea2c9a..29b9e1e 100644
--- a/ash/strings/ash_strings_as.xtb
+++ b/ash/strings/ash_strings_as.xtb
@@ -48,6 +48,7 @@
 <translation id="1351937230027495976">মেনু সংকোচন কৰক</translation>
 <translation id="1383876407941801731">Search</translation>
 <translation id="1391102559483454063">অন আছে</translation>
+<translation id="1407069428457324124">গাঢ় ৰঙৰ থীম</translation>
 <translation id="1419738280318246476">জাননী সম্পর্কীয় কার্যসমূহ কৰিবলৈ ডিভাইচ আনলক কৰক</translation>
 <translation id="1420408895951708260">ৰাতিৰ লাইট ট’গল কৰক। <ph name="STATE_TEXT" /></translation>
 <translation id="1420527829902822813">স্ক্ৰীনশ্বট লৈ ক্লিপব'ৰ্ডত ছেভ কৰা হ'ল</translation>
@@ -65,6 +66,7 @@
 <translation id="1550523713251050646">অধিক বিকল্পৰ বাবে ক্লিক কৰক</translation>
 <translation id="1570871743947603115">ব্লুটুথ ট’গল কৰক। <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">এই ছেশ্বনত আপোনাৰ সকলো কার্যকলাপ এক্সেছ কৰে</translation>
+<translation id="1611993646327628135">অন আছে</translation>
 <translation id="1632985212731562677">ছুইচৰ দ্বাৰা এক্সেছ ছেটিংসমূহ ইয়াত অক্ষম কৰিব পৰা যায় &gt; সাধ্য সুবিধা।</translation>
 <translation id="1654477262762802994">কণ্ঠধ্বনিৰদ্বাৰা সন্ধান আৰম্ভ কৰক</translation>
 <translation id="1667964833127753507">নিৰপেক্ষ ৰঙৰ ম'ডটোৱে ৱালপেপাৰে আহৰণ কৰা ৰংবোৰ ব্যৱহাৰ নকৰে, তাৰ স্থানত নিৰপেক্ষভাৱে মিলাই সৃষ্টি কৰা পাতল আৰু গাঢ় বৰণৰ এটা ছেট ব্যৱহাৰ কৰে।</translation>
@@ -79,6 +81,7 @@
 <translation id="1761222317188459878">নেটৱৰ্ক সংযোগ ট’গল কৰক। <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">সোঁফাললৈ স্ক্ৰ’ল কৰক</translation>
 <translation id="1782199038061388045">অনুবাদ</translation>
+<translation id="1787955149152357925">অফ আছে</translation>
 <translation id="181103072419391116">ছিগনেলৰ ক্ষমতা <ph name="SIGNAL_STRENGTH" />, আপোনাৰ প্ৰশাসকে পৰিচালনা কৰে</translation>
 <translation id="1812997170047690955">মোৰ স্ক্ৰীণত কি আছে?</translation>
 <translation id="1823873187264960516">ইথাৰনেট: <ph name="ADDRESS" /></translation>
@@ -201,6 +204,7 @@
 <translation id="3077734595579995578">Shift+</translation>
 <translation id="3081696990447829002">মেনু বিস্তাৰ কৰক</translation>
 <translation id="3087734570205094154">একেবাৰে তলি</translation>
+<translation id="3090989381251959936"><ph name="FEATURE_NAME" /> ট’গল কৰক। <ph name="STATE_TEXT" /></translation>
 <translation id="309749186376891736">কাৰ্ছৰ স্থানান্তৰ কৰক</translation>
 <translation id="3098580329624789136">"<ph name="QUERY" />"ৰ বাবে <ph name="INTENT" /> লাভ কৰক</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (ব্লুটুথ)</translation>
@@ -233,6 +237,7 @@
 <translation id="3371140690572404006">USB-C ডিভাইচ। (সোঁফালৰ সন্মুখৰ প’ৰ্ট)</translation>
 <translation id="3386978599540877378">সম্পূর্ণ স্ক্ৰীণৰ বিৱৰ্ধকটো</translation>
 <translation id="3400357268283240774">অতিৰিক্ত ছেটিংসমূহ</translation>
+<translation id="3410336247007142655">গাঢ় ৰঙৰ থীমৰ ছেটিংসমূহ দেখুৱাওক</translation>
 <translation id="3413817803639110246">চাবলৈ এতিয়ালৈ একো নাই</translation>
 <translation id="3428447136709161042"><ph name="NETWORK_NAME" />ৰ পৰা সংযোগ বিচ্ছিন্ন কৰক</translation>
 <translation id="3430396595145920809">উভতি যাবলৈ সোঁফালৰ পৰা ছোৱাইপ কৰক</translation>
@@ -325,6 +330,7 @@
 <translation id="4378551569595875038">সংযোগ হৈছে...</translation>
 <translation id="4379531060876907730">এইয়া আপোনাৰ ষ্টাইলাছৰ সঁজুলি</translation>
 <translation id="4389184120735010762">আপুনি ড'ক কৰা বিৱৰ্ধকৰ বাবে কীব'ৰ্ডৰ শ্বৰ্টকাট টিপিছে। আপুনি এইটো অন কৰিব খোজেনে?</translation>
+<translation id="4412944820643904175"><ph name="FEATURE_NAME" /> অফ কৰা আছে।</translation>
 <translation id="4421231901400348175">আপোনাৰ স্ক্ৰীণৰ নিয়ন্ত্ৰণ ৰিম’ট সহায়কৰ দ্বাৰা <ph name="HELPER_NAME" />ৰ সৈতে শ্বেয়াৰ কৰি থকা হৈছে।</translation>
 <translation id="4430019312045809116">ভলিউম</translation>
 <translation id="4450893287417543264">পুনৰ নেদেখুৱাব</translation>
@@ -344,6 +350,7 @@
 <translation id="4570957409596482333">কথা ক’বলৈ বাছনি কৰক বুটাম</translation>
 <translation id="4577274620589681794">সময় শেষ হ’ল · <ph name="LABEL" /></translation>
 <translation id="4585337515783392668">কোনো অজ্ঞাত প্ৰাপকলৈ কাষ্ট কৰাটো বন্ধ কৰক</translation>
+<translation id="4596144739579517758">গাঢ় ৰঙৰ ম’ড অফ আছে</translation>
 <translation id="4623167406982293031">একাউণ্টটোৰ সত্যাপন কৰক</translation>
 <translation id="4628757576491864469">ডিভাইচ</translation>
 <translation id="4659419629803378708">ChromeVox সক্ষম কৰা হ’ল</translation>
@@ -386,6 +393,7 @@
 <translation id="5168181903108465623">কাষ্ট কৰিব পৰা ডিভাইচ উপলব্ধ</translation>
 <translation id="5170568018924773124">ফ’ল্ডাৰত দেখুৱাওক</translation>
 <translation id="5207949376430453814">পাঠৰ কেৰেট হাইলাইট কৰক</translation>
+<translation id="5208059991603368177">অন আছে</translation>
 <translation id="5222676887888702881">ছাইন আউট কৰক</translation>
 <translation id="523505283826916779">সাধ্য সুবিধাৰ ছেটিংসমূহ</translation>
 <translation id="5260676007519551770">ডেস্ক ৪</translation>
@@ -397,6 +405,7 @@
 <translation id="5313326810920013265">ব্লুটুথ ছেটিংসমূহ</translation>
 <translation id="5314219114274263156">স্ক্ৰীন ৰেকৰ্ডিং লোৱা হ'ল</translation>
 <translation id="5331975486040154427">USB-C ডিভাইচ (বাওঁফালৰ বেকপর্টত)</translation>
+<translation id="5352250171825660495">গাঢ় ৰঙৰ থীম অন হৈ আছে</translation>
 <translation id="5379115545237091094">অতি বেছি প্ৰয়াস</translation>
 <translation id="5397578532367286026">পৰিচালকে(<ph name="MANAGER_EMAIL" />) chrome.comত এই ব্যৱহাৰকাৰীৰ ডিভাইচৰ ব্যৱহাৰ আৰু ইতিহাস পর্যালোচনা কৰিব পাৰে।</translation>
 <translation id="5400461572260843123">দ্ৰুত ছেটিংসমূহ, জাননী কেন্দ্ৰ এক্সেছ কৰিবলৈ search + left টিপক।</translation>
@@ -433,6 +442,7 @@
 <translation id="5769373120130404283">গোপনীয়তাৰ স্ক্ৰীন</translation>
 <translation id="5777841717266010279">স্ক্ৰীণ শ্বেয়াৰ কৰাটো বন্ধ কৰিবনে?</translation>
 <translation id="5790085346892983794">সফল হৈছে</translation>
+<translation id="579415080077680903">নীৰৱতা</translation>
 <translation id="5820394555380036790">Chromium OS</translation>
 <translation id="5837036133683224804"><ph name="RECEIVER_NAME" />ত <ph name="ROUTE_TITLE" /> বন্ধ কৰক</translation>
 <translation id="5860033963881614850">অফ আছে</translation>
@@ -443,6 +453,7 @@
 <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation>
 <translation id="5916664084637901428">অন আছে</translation>
 <translation id="5920710855273935292">মাইক মিউট কৰা আছে।</translation>
+<translation id="5946788582095584774"><ph name="FEATURE_NAME" /> অন কৰা আছে।</translation>
 <translation id="5947494881799873997">পূৰ্বাৱস্থালৈ নিয়ক</translation>
 <translation id="595202126637698455">কার্যদক্ষতা ট্ৰে’চ কৰাটো সক্ষম কৰা হৈছে</translation>
 <translation id="5957083217255311415">ম’বাইল ডেটা অফ কৰা হৈছে।</translation>
@@ -467,6 +478,7 @@
 <translation id="615957422585914272">অন-স্ক্ৰীণ কীব’ৰ্ড দেখুৱাওক</translation>
 <translation id="6164005077879661055">এই নিৰীক্ষণত থকা ব্যৱহাৰকাৰীজনক আঁতৰালে তেওঁৰ সৈতে জড়িত সকলো ফাইল আৰু স্থানীয় ডেটা স্থায়ীভাৱে মচা হ’ব। নিৰীক্ষণত থকা এই ব্যৱহাৰকাৰীকাৰীজনে চোৱা ৱেবছাইট আৰু ছেটিংসমূহ তথাপিও পৰিচালকে <ph name="MANAGEMENT_URL" />ত চাব পাৰিব।</translation>
 <translation id="6165508094623778733">অধিক জানক</translation>
+<translation id="6192859646269780503">ফ’নটো ক’ত আছে জানক</translation>
 <translation id="622484624075952240">Down</translation>
 <translation id="6236290670123303279">ছেটিংসমূহ পৰিচালনা কৰক</translation>
 <translation id="6237231532760393653">1X</translation>
@@ -538,6 +550,7 @@
 <translation id="6981982820502123353">সাধ্য সুবিধাসমূহ</translation>
 <translation id="698231206551913481">ব্যৱহাৰকাৰীজনক আঁতৰোৱাৰ পাছত তেওঁৰ সৈতে জড়িত সকলো ফাইল বা স্থানীয় ডেটা স্থায়ীভাৱে মচা হ’ব।</translation>
 <translation id="7007983414944123363">আপোনাৰ পিন অথবা পাছৱৰ্ডটো সত্যাপন কৰিব পৰা নগ’ল। পুনৰ চেষ্টা কৰক।</translation>
+<translation id="7013005189539051442">হটস্পট সক্ষম কৰক</translation>
 <translation id="7015766095477679451"><ph name="COME_BACK_TIME" />ত পুনৰ ব্যৱহাৰ কৰিব পাৰিব।</translation>
 <translation id="7025533177575372252">আপোনাৰ <ph name="DEVICE_NAME" /> নিজৰ ফ’নৰ সৈতে সংযোগ কৰক</translation>
 <translation id="7026338066939101231">হ্ৰাস</translation>
@@ -607,6 +620,7 @@
 <translation id="7842569679327885685">সাৱধানবাণী: পৰীক্ষামূলক সুবিধা</translation>
 <translation id="7846634333498149051">কীব'ৰ্ড</translation>
 <translation id="7868900307798234037">ফিংগাৰপ্ৰিণ্টেৰে আনল’ক</translation>
+<translation id="7872786842639831132">অফ আছে</translation>
 <translation id="7886169021410746335">গোপনীয়তাৰ ছেটিংসমূহ মিলাওক</translation>
 <translation id="7886277072580235377">আপুনি ছাইন আউট কৰিলে আপোনাৰ ইণ্টাৰনেট ছেশ্বন মচা হ’ব। <ph name="LEARN_MORE" /></translation>
 <translation id="788781083998633524">এটা ইমেইল পঠিয়াওক</translation>
@@ -711,6 +725,7 @@
 <translation id="8853703225951107899">আপোনাৰ পিন অথবা পাছৱৰ্ডটো তথাপি সত্যাপন কৰিব পৰা নগ’ল। টোকা: আপুনি যদি শেহতীয়াকৈ আপোনাৰ পাছৱৰ্ড সলনি কৰিছে, আপোনাৰ পুৰণি পাছৱৰ্ডটো ব্যৱহাৰ কৰক। আপুনি ছাইন আউট কৰিলে আপোনাৰ নতুন পাছৱৰ্ডটো প্ৰযোজ্য হ'ব।</translation>
 <translation id="885387440427703469">স্ক্ৰীন কেপচাৰ অক্ষম কৰা হৈছে</translation>
 <translation id="8870509716567206129">এপটোৱে বিভাজিত স্ক্ৰীণ সমৰ্থন নকৰে।</translation>
+<translation id="8871580645200179206">গাঢ় ৰঙৰ ম’ড ট’গল কৰক। <ph name="STATE_TEXT" /></translation>
 <translation id="8874184842967597500">সংযোগ হোৱা নাই</translation>
 <translation id="8877788021141246043">ৰিমাইণ্ডাৰ ছেট কৰক</translation>
 <translation id="8878886163241303700">বিস্তাৰিত স্ক্ৰীণ</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb
index 4e87467..2de4798 100644
--- a/ash/strings/ash_strings_en-GB.xtb
+++ b/ash/strings/ash_strings_en-GB.xtb
@@ -48,6 +48,7 @@
 <translation id="1351937230027495976">Collapse menu</translation>
 <translation id="1383876407941801731">Search</translation>
 <translation id="1391102559483454063">On</translation>
+<translation id="1407069428457324124">Dark theme</translation>
 <translation id="1419738280318246476">Unlock device to perform the notification action</translation>
 <translation id="1420408895951708260">Toggle Night Light. <ph name="STATE_TEXT" /></translation>
 <translation id="1420527829902822813">Screenshot taken and saved to clipboard</translation>
@@ -65,6 +66,7 @@
 <translation id="1550523713251050646">Click for more options</translation>
 <translation id="1570871743947603115">Toggle Bluetooth. <ph name="STATE_TEXT" /></translation>
 <translation id="1589090746204042747">Access all your activity in this session</translation>
+<translation id="1611993646327628135">On</translation>
 <translation id="1632985212731562677">Switch access can be disabled in Settings &gt; Accessibility.</translation>
 <translation id="1654477262762802994">Start a voice query</translation>
 <translation id="1667964833127753507">The neutral colour mode does not use wallpaper extracted colours, replacing them by a set of neutrally toned light or dark hues.</translation>
@@ -79,6 +81,7 @@
 <translation id="1761222317188459878">Toggle network connection. <ph name="STATE_TEXT" /></translation>
 <translation id="1771761307086386028">Scroll right</translation>
 <translation id="1782199038061388045">translation</translation>
+<translation id="1787955149152357925">Off</translation>
 <translation id="181103072419391116">Signal strength <ph name="SIGNAL_STRENGTH" />, managed by your administrator</translation>
 <translation id="1812997170047690955">What's on my screen?</translation>
 <translation id="1823873187264960516">Ethernet: <ph name="ADDRESS" /></translation>
@@ -201,6 +204,7 @@
 <translation id="3077734595579995578">shift</translation>
 <translation id="3081696990447829002">Expand menu</translation>
 <translation id="3087734570205094154">Bottom</translation>
+<translation id="3090989381251959936">Toggle <ph name="FEATURE_NAME" />. <ph name="STATE_TEXT" /></translation>
 <translation id="309749186376891736">Move cursor</translation>
 <translation id="3098580329624789136">Get the <ph name="INTENT" /> for '<ph name="QUERY" />'</translation>
 <translation id="3105990244222795498"><ph name="DEVICE_NAME" /> (Bluetooth)</translation>
@@ -233,6 +237,7 @@
 <translation id="3371140690572404006">USB-C device (right-hand-side front port)</translation>
 <translation id="3386978599540877378">the full-screen magnifier</translation>
 <translation id="3400357268283240774">Additional settings</translation>
+<translation id="3410336247007142655">Show Dark theme settings</translation>
 <translation id="3413817803639110246">Nothing to see just yet</translation>
 <translation id="3428447136709161042">Disconnect from <ph name="NETWORK_NAME" /></translation>
 <translation id="3430396595145920809">Swipe from the right to go back</translation>
@@ -326,6 +331,7 @@
 <translation id="4378551569595875038">Connecting...</translation>
 <translation id="4379531060876907730">These are your stylus tools</translation>
 <translation id="4389184120735010762">You pressed the keyboard shortcut for the docked magnifier. Do you want to turn it on?</translation>
+<translation id="4412944820643904175"><ph name="FEATURE_NAME" /> is off.</translation>
 <translation id="4421231901400348175">Sharing control of your screen with <ph name="HELPER_NAME" /> via Remote Assistance.</translation>
 <translation id="4430019312045809116">volume</translation>
 <translation id="4450893287417543264">Don't show again</translation>
@@ -345,6 +351,7 @@
 <translation id="4570957409596482333">Select-to-Speak button</translation>
 <translation id="4577274620589681794">Time's up · <ph name="LABEL" /></translation>
 <translation id="4585337515783392668">Stop casting on an unknown receiver</translation>
+<translation id="4596144739579517758">Dark theme is off</translation>
 <translation id="4623167406982293031">Verify account</translation>
 <translation id="4628757576491864469">Devices</translation>
 <translation id="4659419629803378708">ChromeVox enabled</translation>
@@ -387,6 +394,7 @@
 <translation id="5168181903108465623">Cast devices available</translation>
 <translation id="5170568018924773124">Show in folder</translation>
 <translation id="5207949376430453814">Highlight text caret</translation>
+<translation id="5208059991603368177">On</translation>
 <translation id="5222676887888702881">Sign out</translation>
 <translation id="523505283826916779">Accessibility settings</translation>
 <translation id="5260676007519551770">Desk 4</translation>
@@ -398,6 +406,7 @@
 <translation id="5313326810920013265">Bluetooth settings</translation>
 <translation id="5314219114274263156">Screen recording taken</translation>
 <translation id="5331975486040154427">USB-C device (left side back port)</translation>
+<translation id="5352250171825660495">Dark theme is on</translation>
 <translation id="5379115545237091094">Too many attempts</translation>
 <translation id="5397578532367286026">Usage and history of this user can be reviewed by the manager (<ph name="MANAGER_EMAIL" />) on chrome.com.</translation>
 <translation id="5400461572260843123">Quick Settings: press search + left to access the notification centre.</translation>
@@ -434,6 +443,7 @@
 <translation id="5769373120130404283">Privacy screen</translation>
 <translation id="5777841717266010279">Stop screen sharing?</translation>
 <translation id="5790085346892983794">Success</translation>
+<translation id="579415080077680903">Silence</translation>
 <translation id="5820394555380036790">Chromium OS</translation>
 <translation id="5837036133683224804">Stop <ph name="ROUTE_TITLE" /> on <ph name="RECEIVER_NAME" /></translation>
 <translation id="5860033963881614850">Off</translation>
@@ -444,6 +454,7 @@
 <translation id="5911909173233110115"><ph name="USERNAME" /> (<ph name="MAIL" />)</translation>
 <translation id="5916664084637901428">On</translation>
 <translation id="5920710855273935292">Mic is muted.</translation>
+<translation id="5946788582095584774"><ph name="FEATURE_NAME" /> is on.</translation>
 <translation id="5947494881799873997">Revert</translation>
 <translation id="595202126637698455">Performance tracing enabled</translation>
 <translation id="5957083217255311415">Mobile data is turned off.</translation>
@@ -468,6 +479,7 @@
 <translation id="615957422585914272">Show on-screen keyboard</translation>
 <translation id="6164005077879661055">All files and local data associated with the supervised user will be permanently deleted once this supervised user is removed. Visited websites and settings for this supervised user may still be visible by the manager at <ph name="MANAGEMENT_URL" />.</translation>
 <translation id="6165508094623778733">Learn more</translation>
+<translation id="6192859646269780503">Locate phone</translation>
 <translation id="622484624075952240">Down</translation>
 <translation id="6236290670123303279">Manage settings</translation>
 <translation id="6237231532760393653">1X</translation>
@@ -539,6 +551,7 @@
 <translation id="6981982820502123353">Accessibility</translation>
 <translation id="698231206551913481">All files and local data associated with this user will be permanently deleted once this user is removed.</translation>
 <translation id="7007983414944123363">Your PIN or password couldn't be verified. Try again.</translation>
+<translation id="7013005189539051442">Enable hotspot</translation>
 <translation id="7015766095477679451">Come back at <ph name="COME_BACK_TIME" />.</translation>
 <translation id="7025533177575372252">Connect your <ph name="DEVICE_NAME" /> with your phone</translation>
 <translation id="7026338066939101231">Decrement</translation>
@@ -611,6 +624,7 @@
 <translation id="7842569679327885685">Warning: Experimental feature</translation>
 <translation id="7846634333498149051">Keyboard</translation>
 <translation id="7868900307798234037">Unlocking with fingerprint</translation>
+<translation id="7872786842639831132">Off</translation>
 <translation id="7886169021410746335">Adjust privacy settings</translation>
 <translation id="7886277072580235377">Your Internet session will be cleared when you sign out. <ph name="LEARN_MORE" /></translation>
 <translation id="788781083998633524">Send an email</translation>
@@ -715,6 +729,7 @@
 <translation id="8853703225951107899">Your PIN or password still couldn't be verified. Note: If you recently changed your password, use your old password. Your new password will be applied once you've signed out.</translation>
 <translation id="885387440427703469">Screen capture disabled</translation>
 <translation id="8870509716567206129">App does not support split-screen.</translation>
+<translation id="8871580645200179206">Toggle Dark theme. <ph name="STATE_TEXT" /></translation>
 <translation id="8874184842967597500">Not connected</translation>
 <translation id="8877788021141246043">Set a reminder</translation>
 <translation id="8878886163241303700">Extending screen</translation>
diff --git a/base/BUILD.gn b/base/BUILD.gn
index 370a19e..dbd7ab6 100644
--- a/base/BUILD.gn
+++ b/base/BUILD.gn
@@ -884,7 +884,7 @@
       "timer/hi_res_timer_manager_posix.cc",
     ]
 
-    if (!is_nacl && !is_mac && !is_ios) {
+    if (!is_nacl && !is_apple) {
       sources += [
         "cpu_affinity_posix.cc",
         "cpu_affinity_posix.h",
@@ -2053,7 +2053,7 @@
     sources += [ "memory/platform_shared_memory_region_posix.cc" ]
   }
 
-  if (is_posix && !is_mac && !is_ios) {
+  if (is_posix && !is_apple) {
     sources += [
       "time/time_conversion_posix.cc",
       "time/time_exploded_icu.cc",  # See note below.
@@ -2070,15 +2070,14 @@
     deps += [ "//third_party/icu:icui18n" ]
   }
 
-  if (is_posix && !is_mac && !is_ios && !is_nacl) {
+  if (is_posix && !is_apple && !is_nacl) {
     sources += [
       "posix/can_lower_nice_to.cc",
       "posix/can_lower_nice_to.h",
     ]
   }
 
-  if ((is_posix && !is_mac && !is_ios && !is_android && !is_chromeos) ||
-      is_fuchsia) {
+  if ((is_posix && !is_apple && !is_android && !is_chromeos) || is_fuchsia) {
     sources += [ "power_monitor/power_monitor_device_source_stub.cc" ]
   }
 
@@ -3082,7 +3081,7 @@
       "posix/unix_domain_socket_unittest.cc",
       "task/thread_pool/task_tracker_posix_unittest.cc",
     ]
-    if (!is_nacl && !is_mac && !is_ios) {
+    if (!is_nacl && !is_apple) {
       sources += [
         "cpu_affinity_posix_unittest.cc",
         "profiler/stack_copier_signal_unittest.cc",
diff --git a/base/strings/string_piece.h b/base/strings/string_piece.h
index b10707d9..841fc38 100644
--- a/base/strings/string_piece.h
+++ b/base/strings/string_piece.h
@@ -30,6 +30,7 @@
 #include <type_traits>
 
 #include "base/base_export.h"
+#include "base/check.h"
 #include "base/check_op.h"
 #include "base/strings/char_traits.h"
 #include "base/strings/string16.h"
@@ -158,25 +159,13 @@
   // in a "const char*" or a "string" wherever a "StringPiece" is
   // expected (likewise for char16, string16, StringPiece16).
   constexpr BasicStringPiece() : ptr_(nullptr), length_(0) {}
-  // TODO(crbug.com/1049498): Construction from nullptr is not allowed for
-  // std::basic_string_view, so remove the special handling for it.
   // Note: This doesn't just use STRING_TYPE::traits_type::length(), since that
-  // isn't constexpr until C++17.
+  // isn't constexpr until C++17. Furthermore, this CHECKs `str`, since passing
+  // a nullptr to std::basic_string_view is undefined behavior. In order to
+  // ensure we don't pass nullptr to CharTraits::length we perform the CHECK
+  // during the initialization of `length_`.
   constexpr BasicStringPiece(const value_type* str)
-      : ptr_(str), length_(!str ? 0 : CharTraits<value_type>::length(str)) {}
-  // Explicitly disallow construction from nullptr. Note that this does not
-  // catch construction from runtime strings that might be null.
-  // Note: The following is just a more elaborate way of spelling
-  // `BasicStringPiece(nullptr_t) = delete`, but unfortunately the terse form is
-  // not supported by the PNaCl toolchain.
-  // TODO(crbug.com/1049498): Remove once we CHECK(str) in the constructor
-  // above.
-  template <class T, class = std::enable_if_t<std::is_null_pointer<T>::value>>
-  BasicStringPiece(T) {
-    static_assert(sizeof(T) == 0,  // Always false.
-                  "StringPiece does not support construction from nullptr, use "
-                  "the default constructor instead.");
-  }
+      : ptr_(str), length_((CHECK(str), CharTraits<value_type>::length(str))) {}
   BasicStringPiece(const STRING_TYPE& str)
       : ptr_(str.data()), length_(str.size()) {}
   constexpr BasicStringPiece(const value_type* offset, size_type len)
diff --git a/base/strings/string_piece_unittest.cc b/base/strings/string_piece_unittest.cc
index ee4e0cf0..506cff2 100644
--- a/base/strings/string_piece_unittest.cc
+++ b/base/strings/string_piece_unittest.cc
@@ -650,6 +650,7 @@
 }
 
 TEST(StringPieceTest, OutOfBoundsDeath) {
+  { ASSERT_DEATH_IF_SUPPORTED(StringPiece(nullptr), ""); }
   {
     constexpr StringPiece piece;
     ASSERT_DEATH_IF_SUPPORTED(piece[0], "");
diff --git a/build/config/BUILDCONFIG.gn b/build/config/BUILDCONFIG.gn
index e011502..8c43af5 100644
--- a/build/config/BUILDCONFIG.gn
+++ b/build/config/BUILDCONFIG.gn
@@ -353,7 +353,7 @@
     "*\bios/*",
   ]
 }
-if (!is_mac && !is_ios) {
+if (!is_apple) {
   sources_assignment_filter += [ "*.mm" ]
 }
 if (!is_linux && !is_chromeos) {
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 16ee9ba..8b6412e 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -175,9 +175,8 @@
 }
 
 if (use_debug_fission == "default") {
-  use_debug_fission =
-      is_debug && !is_android && !is_fuchsia && !is_ios && !is_mac && !is_win &&
-      (use_gold || use_lld) && cc_wrapper == ""
+  use_debug_fission = is_debug && !is_android && !is_fuchsia && !is_apple &&
+                      !is_win && (use_gold || use_lld) && cc_wrapper == ""
 }
 
 if (is_win || is_android || (is_chromeos && is_chromeos_device)) {
@@ -295,7 +294,7 @@
     }
 
     # Linker warnings.
-    if (fatal_linker_warnings && !is_mac && !is_ios && current_os != "aix") {
+    if (fatal_linker_warnings && !is_apple && current_os != "aix") {
       ldflags += [ "-Wl,--fatal-warnings" ]
     }
     if (fatal_linker_warnings && is_apple &&
@@ -501,6 +500,12 @@
       "-mllvm",
       "-instcombine-lower-dbg-declare=0",
     ]
+
+    cflags += [
+      # TODO(https://crbug.com/1127713): Investigate, remove.
+      "-mllvm",
+      "-enable-dse-memoryssa=false",
+    ]
   }
 
   # C11/C++11 compiler flags setup.
@@ -1766,7 +1771,7 @@
   # Mac and iOS use the mac-specific "libtool" command, not ar, which doesn't
   # have a "thin archive" mode (it does accept -T, but it means truncating
   # archive names to 16 characters, which is not what we want).
-  if ((is_posix && !is_nacl && !is_mac && !is_ios) || is_fuchsia) {
+  if ((is_posix && !is_nacl && !is_apple) || is_fuchsia) {
     arflags = [ "-T" ]
   } else if (is_win && use_lld) {
     arflags = [ "/llvmlibthin" ]
@@ -1981,7 +1986,7 @@
       # Omit frame pointers for leaf functions on x86, otherwise building libyuv
       # gives clang's register allocator issues, see llvm.org/PR15798 /
       # crbug.com/233709
-      if (is_clang && current_cpu == "x86" && !is_mac && !is_ios) {
+      if (is_clang && current_cpu == "x86" && !is_apple) {
         cflags += [ "-momit-leaf-frame-pointer" ]
       }
     } else {
@@ -2236,8 +2241,8 @@
 # include as sub-config.
 config("win_pdbaltpath") {
   visibility = [
-    ":symbols",
     ":minimal_symbols",
+    ":symbols",
   ]
 
   # /DEBUG causes the linker to generate a pdb file, and to write the absolute
@@ -2303,7 +2308,7 @@
     }
 
     # TODO(https://crbug.com/1050118): Investigate missing debug info on mac.
-    if (is_clang && !is_nacl && !use_xcode_clang && !is_mac && !is_ios) {
+    if (is_clang && !is_nacl && !use_xcode_clang && !is_apple) {
       cflags += [
         "-Xclang",
         "-debug-info-kind=constructor",
@@ -2343,7 +2348,7 @@
     # obj/native_client/src/trusted/service_runtime/sel_asm/nacl_switch_32.o:
     # DWARF info may be corrupt; offsets in a range list entry are in different
     # sections" there.  Maybe just a bug in nacl_switch_32.S.
-    if (!is_mac && !is_ios && !is_nacl && current_cpu != "x86" &&
+    if (!is_apple && !is_nacl && current_cpu != "x86" &&
         (use_gold || use_lld)) {
       if (is_clang) {
         # This flag enables the GNU-format pubnames and pubtypes sections,
diff --git a/build/config/compiler/compiler.gni b/build/config/compiler/compiler.gni
index 918712d6..c2ed490 100644
--- a/build/config/compiler/compiler.gni
+++ b/build/config/compiler/compiler.gni
@@ -185,7 +185,7 @@
 
 declare_args() {
   # Set to true to use lld, the LLVM linker.
-  use_lld = is_clang && (!is_ios && !is_mac)
+  use_lld = is_clang && !is_apple
 }
 
 declare_args() {
diff --git a/build/config/posix/BUILD.gn b/build/config/posix/BUILD.gn
index 3bef12c29..e61554c5 100644
--- a/build/config/posix/BUILD.gn
+++ b/build/config/posix/BUILD.gn
@@ -25,7 +25,7 @@
   defines = []
   ldflags = []
 
-  if (!is_mac && !is_ios && sysroot != "") {
+  if (!is_apple && sysroot != "") {
     # Pass the sysroot to all C compiler variants, the assembler, and linker.
     sysroot_flags = [ "--sysroot=" + rebase_path(sysroot, root_build_dir) ]
     if (is_linux || is_chromeos) {
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index ca7de55..cfc02703 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-0.20200914.0.1
+0.20200914.1.1
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index ca7de55..cfc02703 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-0.20200914.0.1
+0.20200914.1.1
diff --git a/buildtools/third_party/libc++/BUILD.gn b/buildtools/third_party/libc++/BUILD.gn
index f6ae247..88ad27d 100644
--- a/buildtools/third_party/libc++/BUILD.gn
+++ b/buildtools/third_party/libc++/BUILD.gn
@@ -165,7 +165,7 @@
       ]
     }
   }
-  if (!is_mac && !is_ios && (is_asan || is_tsan || is_msan)) {
+  if (!is_apple && (is_asan || is_tsan || is_msan)) {
     # In {a,t,m}san configurations, operator new and operator delete will be
     # provided by the sanitizer runtime library.  Since libc++ defines these
     # symbols with weak linkage, and the *san runtime uses strong linkage, it
diff --git a/buildtools/third_party/libc++abi/BUILD.gn b/buildtools/third_party/libc++abi/BUILD.gn
index 22517c2..a8b7b93c 100644
--- a/buildtools/third_party/libc++abi/BUILD.gn
+++ b/buildtools/third_party/libc++abi/BUILD.gn
@@ -52,7 +52,7 @@
     sources += [ "trunk/src/cxa_demangle.cpp" ]
   }
 
-  if (is_fuchsia || (is_posix && !is_mac && !is_ios)) {
+  if (is_fuchsia || (is_posix && !is_apple)) {
     sources += [ "trunk/src/cxa_thread_atexit.cpp" ]
   }
 
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 3c161be..eb78104 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -873,7 +873,8 @@
     return LCDTextDisallowedReason::kTransformAnimation;
 
   EffectNode* effect_node = GetEffectTree().Node(effect_tree_index());
-  if (effect_node->node_or_ancestor_has_filters)
+  if (effect_node->node_or_ancestor_has_filters ||
+      effect_node->affected_by_backdrop_filter)
     return LCDTextDisallowedReason::kPixelOrColorEffect;
 
   return LCDTextDisallowedReason::kNone;
diff --git a/cc/layers/picture_layer_impl_unittest.cc b/cc/layers/picture_layer_impl_unittest.cc
index 160eec5..3c10b66 100644
--- a/cc/layers/picture_layer_impl_unittest.cc
+++ b/cc/layers/picture_layer_impl_unittest.cc
@@ -6412,6 +6412,22 @@
   CheckCanUseLCDText(LCDTextDisallowedReason::kNone, "no filter");
 }
 
+TEST_P(LCDTextTest, BackdropFilter) {
+  FilterOperations backdrop_filter;
+  backdrop_filter.Append(FilterOperation::CreateBlurFilter(4.0f));
+  SetBackdropFilter(descendant_, backdrop_filter);
+  UpdateDrawProperties(host_impl()->active_tree());
+  CheckCanUseLCDText(LCDTextDisallowedReason::kPixelOrColorEffect,
+                     "backdrop-filter", layer_);
+  CheckCanUseLCDText(LCDTextDisallowedReason::kNone, "backdrop-filter",
+                     descendant_);
+
+  SetBackdropFilter(descendant_, FilterOperations());
+  UpdateDrawProperties(host_impl()->active_tree());
+  CheckCanUseLCDText(LCDTextDisallowedReason::kNone, "no backdrop-filter",
+                     layer_);
+}
+
 TEST_P(LCDTextTest, ContentsOpaqueForText) {
   layer_->SetContentsOpaque(false);
   layer_->SetBackgroundColor(SK_ColorGREEN);
diff --git a/cc/metrics/compositor_frame_reporter.cc b/cc/metrics/compositor_frame_reporter.cc
index b9a85ad..8335921e 100644
--- a/cc/metrics/compositor_frame_reporter.cc
+++ b/cc/metrics/compositor_frame_reporter.cc
@@ -322,7 +322,8 @@
   new_reporter->SetDroppedFrameCounter(dropped_frame_counter_);
   new_reporter->cloned_from_ = weak_factory_.GetWeakPtr();
 
-  DCHECK(!cloned_to_);
+  // TODO(https://crbug.com/1127872) Check |cloned_to_| is null before replacing
+  // it.
   cloned_to_ = new_reporter->GetWeakPtr();
   return new_reporter;
 }
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
index ea6e7bd..a2e21b1 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -765,6 +765,7 @@
 }
 
 void UpdateRenderTarget(EffectTree* effect_tree) {
+  int last_backdrop_filter = kInvalidNodeId;
   for (int i = EffectTree::kContentsRootNodeId;
        i < static_cast<int>(effect_tree->size()); ++i) {
     EffectNode* node = effect_tree->Node(i);
@@ -776,6 +777,27 @@
     } else {
       node->target_id = effect_tree->parent(node)->target_id;
     }
+    if (!node->backdrop_filters.IsEmpty())
+      last_backdrop_filter = node->id;
+    node->affected_by_backdrop_filter = false;
+  }
+
+  if (last_backdrop_filter == kInvalidNodeId)
+    return;
+
+  // Update effect nodes for the backdrop filter due to the target id change.
+  int current_target_id = effect_tree->Node(last_backdrop_filter)->target_id;
+  for (int i = last_backdrop_filter - 1; EffectTree::kContentsRootNodeId <= i;
+       --i) {
+    EffectNode* node = effect_tree->Node(i);
+    node->affected_by_backdrop_filter = current_target_id <= i ? true : false;
+    if (node->id == current_target_id)
+      current_target_id = kInvalidNodeId;
+    // While down to kContentsRootNodeId, move |current_target_id| forward if
+    // |node| has backdrop filter.
+    if (!node->backdrop_filters.IsEmpty() &&
+        current_target_id == kInvalidNodeId)
+      current_target_id = node->target_id;
   }
 }
 
diff --git a/cc/trees/effect_node.cc b/cc/trees/effect_node.cc
index 104f261..de8b74ca 100644
--- a/cc/trees/effect_node.cc
+++ b/cc/trees/effect_node.cc
@@ -36,6 +36,7 @@
       subtree_has_copy_request(false),
       is_fast_rounded_corner(false),
       node_or_ancestor_has_filters(false),
+      affected_by_backdrop_filter(false),
       render_surface_reason(RenderSurfaceReason::kNone),
       transform_id(0),
       clip_id(0),
@@ -62,6 +63,7 @@
          rounded_corner_bounds == other.rounded_corner_bounds &&
          is_fast_rounded_corner == other.is_fast_rounded_corner &&
          node_or_ancestor_has_filters == other.node_or_ancestor_has_filters &&
+         affected_by_backdrop_filter == other.affected_by_backdrop_filter &&
          // The specific reason is just for tracing/testing/debugging, so just
          // check whether a render surface is needed.
          HasRenderSurface() == other.HasRenderSurface() &&
@@ -190,6 +192,7 @@
                     closest_ancestor_with_cached_render_surface_id);
   value->SetInteger("closest_ancestor_with_copy_request_id",
                     closest_ancestor_with_copy_request_id);
+  value->SetBoolean("affected_by_backdrop_filter", affected_by_backdrop_filter);
 }
 
 }  // namespace cc
diff --git a/cc/trees/effect_node.h b/cc/trees/effect_node.h
index e42720b..4834773c 100644
--- a/cc/trees/effect_node.h
+++ b/cc/trees/effect_node.h
@@ -132,6 +132,10 @@
   bool is_fast_rounded_corner : 1;
   // If the node or it's parent has the filters, it sets to true.
   bool node_or_ancestor_has_filters : 1;
+  // All node in the subtree starting from the containing render surface, and
+  // before the backdrop filter node in pre tree order.
+  // This is set and used for the impl-side effect tree only.
+  bool affected_by_backdrop_filter: 1;
   // RenderSurfaceReason::kNone if this effect node should not create a render
   // surface, or the reason that this effect node should create one.
   RenderSurfaceReason render_surface_reason;
@@ -144,6 +148,7 @@
 
   // This is the id of the ancestor effect node that induces a
   // RenderSurfaceImpl.
+  // This is set and used for the impl-side effect tree only.
   int target_id;
   int closest_ancestor_with_cached_render_surface_id;
   int closest_ancestor_with_copy_request_id;
diff --git a/chrome/android/chrome_junit_test_java_sources.gni b/chrome/android/chrome_junit_test_java_sources.gni
index 888efbd..2fd2ca1c 100644
--- a/chrome/android/chrome_junit_test_java_sources.gni
+++ b/chrome/android/chrome_junit_test_java_sources.gni
@@ -184,6 +184,7 @@
   "junit/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinderUnitTest.java",
   "junit/src/org/chromium/chrome/browser/omnibox/suggestions/tail/AlignmentManagerUnitTest.java",
   "junit/src/org/chromium/chrome/browser/omnibox/voice/AssistantVoiceSearchServiceUnitTest.java",
+  "junit/src/org/chromium/chrome/browser/page_info/PageInfoPermissionsControllerUnitTest.java",
   "junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java",
   "junit/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksFaviconThrottleTest.java",
   "junit/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReaderTest.java",
diff --git a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
index c834be7..1bbe8d8 100644
--- a/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
+++ b/chrome/android/expectations/monochrome_public_bundle.AndroidManifest.expected
@@ -813,7 +813,7 @@
     <meta-data android:name="android.allow_multiple_resumed_activities" android:value="true"/>
     <meta-data android:name="android.content.APP_RESTRICTIONS" android:resource="@xml/app_restrictions"/>
     <meta-data android:name="com.android.webview.WebViewLibrary" android:value="libmonochrome.so"/>
-    <meta-data android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" android:value="org.chromium.chrome.browser.media.router.caf.CastOptionsProvider"/>
+    <meta-data android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" android:value="org.chromium.components.media_router.caf.CastOptionsProvider"/>
     <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
     <meta-data android:name="com.google.ar.core" android:value="optional"/>
     <meta-data android:name="com.google.ar.core.min_apk_version" android:value="200501000"/>
diff --git a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
index cb780e3..5e6cca8 100644
--- a/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
+++ b/chrome/android/expectations/trichrome_chrome_bundle.AndroidManifest.expected
@@ -767,7 +767,7 @@
     </activity-alias>  # DIFF-ANCHOR: 7c349c4f
     <meta-data android:name="android.allow_multiple_resumed_activities" android:value="true"/>
     <meta-data android:name="android.content.APP_RESTRICTIONS" android:resource="@xml/app_restrictions"/>
-    <meta-data android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" android:value="org.chromium.chrome.browser.media.router.caf.CastOptionsProvider"/>
+    <meta-data android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME" android:value="org.chromium.components.media_router.caf.CastOptionsProvider"/>
     <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/>
     <meta-data android:name="com.google.ar.core" android:value="optional"/>
     <meta-data android:name="com.google.ar.core.min_apk_version" android:value="200501000"/>
diff --git a/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_option_toggle.xml b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_option_toggle.xml
index 5521218b..6e3d304 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_option_toggle.xml
+++ b/chrome/android/features/keyboard_accessory/internal/java/res/layout/keyboard_accessory_sheet_tab_option_toggle.xml
@@ -11,7 +11,8 @@
     android:layout_height="wrap_content"
     android:paddingStart="@dimen/keyboard_accessory_suggestion_padding"
     android:paddingEnd="6dp"
-    android:layout_marginTop="8dp"
+    android:paddingTop="8dp"
+    android:paddingBottom="8dp"
     android:fillViewport="true"
     android:minHeight="@dimen/keyboard_accessory_suggestion_height"
     android:background="?attr/selectableItemBackground">
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/all_passwords_bottom_sheet/AllPasswordsBottomSheetViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/all_passwords_bottom_sheet/AllPasswordsBottomSheetViewTest.java
index 851d315d..9bb6282 100644
--- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/all_passwords_bottom_sheet/AllPasswordsBottomSheetViewTest.java
+++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/all_passwords_bottom_sheet/AllPasswordsBottomSheetViewTest.java
@@ -28,7 +28,6 @@
 
 import org.chromium.base.Callback;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.app.ChromeActivity;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
@@ -102,7 +101,6 @@
 
     @Test
     @MediumTest
-    @DisabledTest(message = "https://crbug.com/1127433")
     public void testCredentialsChangedByModel() {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mAllPasswordsBottomSheetView.setVisible(true);
diff --git a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
index 565d62bf..76135f0 100644
--- a/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
+++ b/chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceLayout.java
@@ -200,7 +200,7 @@
             return;
         }
 
-        shrinkTab(() -> mTabListDelegate.getThumbnailLocationOfCurrentTab(false));
+        shrinkTab(animate, () -> mTabListDelegate.getThumbnailLocationOfCurrentTab(false));
     }
 
     @Override
@@ -290,11 +290,16 @@
 
     /**
      * Animate shrinking a tab to a target {@link Rect} area.
+     * @param animate Whether to play an entry animation.
      * @param target The target {@link Rect} area.
      */
-    private void shrinkTab(Supplier<Rect> target) {
-        forceAnimationToFinish();
+    private void shrinkTab(boolean animate, Supplier<Rect> target) {
+        if (target.get() == null) {
+            mController.showOverview(animate);
+            return;
+        }
 
+        forceAnimationToFinish();
         LayoutTab sourceLayoutTab = mLayoutTabs[0];
         CompositorAnimationHandler handler = getAnimationHandler();
         Collection<Animator> animationList = new ArrayList<>(5);
diff --git a/chrome/android/java/AndroidManifest.xml b/chrome/android/java/AndroidManifest.xml
index 3b1a51fe..9cf8cb2 100644
--- a/chrome/android/java/AndroidManifest.xml
+++ b/chrome/android/java/AndroidManifest.xml
@@ -204,7 +204,7 @@
         <meta-data
             android:name=
             "com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
-            android:value="org.chromium.chrome.browser.media.router.caf.CastOptionsProvider"/>
+            android:value="org.chromium.components.media_router.caf.CastOptionsProvider"/>
 
         <!-- Note: All activities directly or indirectly derived from ChromeActivity
              must specify android:hardwareAccelerated="false".
diff --git a/chrome/android/java/res/layout/account_picker_bottom_sheet_view.xml b/chrome/android/java/res/layout/account_picker_bottom_sheet_view.xml
index 3749ba6..15a028a3 100644
--- a/chrome/android/java/res/layout/account_picker_bottom_sheet_view.xml
+++ b/chrome/android/java/res/layout/account_picker_bottom_sheet_view.xml
@@ -41,6 +41,8 @@
         android:id="@+id/account_picker_bottom_sheet_subtitle"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:layout_marginStart="44dp"
+        android:layout_marginEnd="44dp"
         android:layout_marginBottom="16dp"
         android:gravity="center_horizontal"
         android:textAppearance="@style/TextAppearance.TextMedium.Secondary"
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
index 0bd819f..f39cfb6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabActivity.java
@@ -194,15 +194,21 @@
             handleFinishAndClose();
         });
         component.resolveSessionHandler();
-        component.resolveCustomTabIncognitoManager();
 
         BrowserServicesIntentDataProvider intentDataProvider = getIntentDataProvider();
+
+        if (intentDataProvider.isIncognito()) {
+            component.resolveCustomTabIncognitoManager();
+        }
+
         if (intentDataProvider.isWebappOrWebApkActivity()) {
             mWebappActivityCoordinator = component.resolveWebappActivityCoordinator();
         }
+
         if (intentDataProvider.isWebApkActivity()) {
             component.resolveWebApkActivityCoordinator();
         }
+
         if (mIntentDataProvider.isTrustedWebActivity()) {
             mTwaCoordinator = component.resolveTrustedWebActivityCoordinator();
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
index 7458355..e526122 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -301,9 +301,10 @@
     // TODO(https://crbug.com/1060940): Remove this function and update all use cases so that
     // the profile would be available instead of isOffTheRecord boolean.
     private static ProfileKey getProfileKey(boolean isOffTheRecord) {
-        Profile profile = Profile.getLastUsedRegularProfile();
-        if (isOffTheRecord) profile = profile.getPrimaryOTRProfile();
-        return profile.getProfileKey();
+        // If off-the-record is not requested, the request might be before native initialization.
+        if (!isOffTheRecord) return ProfileKey.getLastUsedRegularProfileKey();
+
+        return Profile.getLastUsedRegularProfile().getPrimaryOTRProfile().getProfileKey();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
index c38348b..b259d18 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java
@@ -510,8 +510,8 @@
 
             if (isMinimalUiApplicable()) {
                 if (mPaymentUIsManager.triggerMinimalUI(chromeActivity, mSpec.getRawTotal(),
-                        this::onMinimalUIReady, this::onMinimalUiConfirmed,
-                        this::onMinimalUiDismissed)) {
+                            this::onMinimalUIReady, this::onMinimalUiConfirmed,
+                            /*dismissObserver=*/this::onDismiss)) {
                     mDidRecordShowEvent = true;
                     mJourneyLogger.setEventOccurred(Event.SHOWN);
                 } else {
@@ -566,30 +566,24 @@
         onPayClicked(null /* selectedShippingAddress */, null /* selectedShippingOption */, app);
     }
 
-    private void onMinimalUiDismissed() {
-        onDismiss();
-    }
-
-    private void onMinimalUiErroredAndClosed() {
-        if (mComponentPaymentRequestImpl == null) return;
-        close();
-        closeUIAndDestroyNativeObjects();
-    }
-
     private void onMinimalUiCompletedAndClosed() {
-        if (mComponentPaymentRequestImpl != null) {
-            mComponentPaymentRequestImpl.onComplete();
-        }
+        if (mComponentPaymentRequestImpl == null) return;
+        mComponentPaymentRequestImpl.onComplete();
         close();
-        closeUIAndDestroyNativeObjects();
     }
 
-    private void onPaymentRequestCompleteForNonMinimalUI() {
+    /** Called after the non-minimal UI has handled {@link #complete}. */
+    private void onNonMinimalUiHandledComplete() {
         if (ComponentPaymentRequestImpl.getNativeObserverForTest() != null) {
             ComponentPaymentRequestImpl.getNativeObserverForTest().onCompleteCalled();
         }
-
-        closeUIAndDestroyNativeObjects();
+        if (ComponentPaymentRequestImpl.getObserverForTest() != null) {
+            ComponentPaymentRequestImpl.getObserverForTest().onCompleteReplied();
+        }
+        if (mComponentPaymentRequestImpl != null) {
+            mComponentPaymentRequestImpl.onComplete();
+            close();
+        }
     }
 
     private static Map<String, PaymentMethodData> getValidatedMethodData(
@@ -967,21 +961,8 @@
      */
     @Override
     public void getDefaultPaymentInformation(Callback<PaymentInformation> callback) {
-        mPaymentUIsManager.setPaymentInformationCallback(callback);
-
-        // mPaymentUIsManager.getPaymentRequestUI().show() is called only after request.show() is
-        // called and all payment apps are ready.
-        assert mIsCurrentPaymentRequestShowing;
-        assert mIsFinishedQueryingPaymentApps;
-
-        if (mWaitForUpdatedDetails) return;
-
-        mHandler.post(() -> {
-            if (mPaymentUIsManager.getPaymentRequestUI() != null) {
-                mPaymentUIsManager.providePaymentInformationToPaymentRequestUI();
-                recordShowEventAndTransactionAmount();
-            }
-        });
+        mPaymentUIsManager.getDefaultPaymentInformation(callback, mIsCurrentPaymentRequestShowing,
+                mIsFinishedQueryingPaymentApps, mWaitForUpdatedDetails);
     }
 
     // Implement PaymentUIsManager.Delegate:
@@ -1162,7 +1143,6 @@
             mComponentPaymentRequestImpl.onError(reason, debugMessage);
         }
         close();
-        closeUIAndDestroyNativeObjects();
         if (ComponentPaymentRequestImpl.getNativeObserverForTest() != null) {
             ComponentPaymentRequestImpl.getNativeObserverForTest().onConnectionTerminated();
         }
@@ -1220,8 +1200,9 @@
                     mSpec.getRawTotal().amount.value, true /*completed*/);
         }
 
-        mPaymentUIsManager.onPaymentRequestComplete(result, this::onMinimalUiErroredAndClosed,
-                this::onMinimalUiCompletedAndClosed, this::onPaymentRequestCompleteForNonMinimalUI);
+        mPaymentUIsManager.onPaymentRequestComplete(result,
+                /*onMinimalUiErroredAndClosed=*/this::close, this::onMinimalUiCompletedAndClosed,
+                this::onNonMinimalUiHandledComplete);
     }
 
     // Implement BrowserPaymentRequest:
@@ -1768,7 +1749,7 @@
         if (mPaymentUIsManager.getMinimalUI() != null) {
             mJourneyLogger.setAborted(AbortReason.ABORTED_BY_USER);
             mPaymentUIsManager.getMinimalUI().showErrorAndClose(
-                    this::onMinimalUiErroredAndClosed, R.string.payments_error_message);
+                    /*observer=*/this::close, R.string.payments_error_message);
             return;
         }
 
@@ -1800,13 +1781,6 @@
 
         if (mPaymentUIsManager.getPaymentRequestUI() != null) {
             mPaymentUIsManager.getPaymentRequestUI().close();
-            if (mComponentPaymentRequestImpl != null) {
-                if (ComponentPaymentRequestImpl.getObserverForTest() != null) {
-                    ComponentPaymentRequestImpl.getObserverForTest().onCompleteReplied();
-                }
-                mComponentPaymentRequestImpl.onComplete();
-                close();
-            }
             ChromeActivity activity = ChromeActivity.fromWebContents(mWebContents);
             if (activity != null) {
                 activity.getLifecycleDispatcher().unregister(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/minimal/MinimalUICoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/minimal/MinimalUICoordinator.java
index 076d0e3f..3359a5b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/minimal/MinimalUICoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/minimal/MinimalUICoordinator.java
@@ -155,16 +155,15 @@
     /**
      * Runs when the payment request is closed.
      * @param result The status of PaymentComplete.
-     * @param onMinimalUiErroredAndClosed The function called when MinimalUI errors and closes.
-     * @param onMinimalUiCompletedAndClosed The function called when MinimalUI completes and closes.
+     * @param onErroredAndClosed The function called when the UI errors and closes.
+     * @param onCompletedAndClosed The function called when the UI completes and closes.
      */
-    public void onPaymentRequestComplete(int result,
-                                         ErrorAndCloseObserver onMinimalUiErroredAndClosed,
-                                         CompleteAndCloseObserver onMinimalUiCompletedAndClosed) {
+    public void onPaymentRequestComplete(int result, ErrorAndCloseObserver onErroredAndClosed,
+            CompleteAndCloseObserver onCompletedAndClosed) {
         if (result == PaymentComplete.FAIL) {
-            showErrorAndClose(onMinimalUiErroredAndClosed, R.string.payments_error_message);
+            showErrorAndClose(onErroredAndClosed, R.string.payments_error_message);
         } else {
-            showCompleteAndClose(onMinimalUiCompletedAndClosed);
+            showCompleteAndClose(onCompletedAndClosed);
         }
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUIsManager.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUIsManager.java
index d0bf642..303d230f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUIsManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUIsManager.java
@@ -1496,6 +1496,33 @@
     }
 
     /**
+     * The implementation of {@link PaymentRequestUI.Client#getDefaultPaymentInformation}.
+     * @param callback Retrieves the data to show in the initial PaymentRequest UI.
+     * @param isCurrentPaymentRequestShowing Whether the current payment request is showing.
+     * @param isFinishedQueryingPaymentApps Whether payment apps have finished being queried.
+     * @param waitForUpdatedDetails Whether to wait for updated payment details.
+     */
+    public void getDefaultPaymentInformation(Callback<PaymentInformation> callback,
+            boolean isCurrentPaymentRequestShowing, boolean isFinishedQueryingPaymentApps,
+            boolean waitForUpdatedDetails) {
+        mPaymentInformationCallback = callback;
+
+        // mPaymentRequestUI.show() is called only after request.show() is
+        // called and all payment apps are ready.
+        assert isCurrentPaymentRequestShowing;
+        assert isFinishedQueryingPaymentApps;
+
+        if (waitForUpdatedDetails) return;
+
+        mHandler.post(() -> {
+            if (mPaymentRequestUI != null) {
+                providePaymentInformationToPaymentRequestUI();
+                mDelegate.recordShowEventAndTransactionAmount();
+            }
+        });
+    }
+
+    /**
      * The implementation of {@link PaymentRequestUI.Client#onSectionOptionSelected}.
      * @param optionType Data being updated.
      * @param option Value of the data being updated.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
index 49bcf7e..6286b1d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/settings/MainSettings.java
@@ -125,7 +125,6 @@
                 Profile.getLastUsedRegularProfile());
         if (signinManager.isSigninSupported()) {
             signinManager.addSignInStateObserver(this);
-            mSyncPromoPreference.registerForUpdates();
             mSignInPreference.registerForUpdates();
         }
         ProfileSyncService syncService = ProfileSyncService.get();
@@ -141,7 +140,6 @@
                 Profile.getLastUsedRegularProfile());
         if (signinManager.isSigninSupported()) {
             signinManager.removeSignInStateObserver(this);
-            mSyncPromoPreference.unregisterForUpdates();
             mSignInPreference.unregisterForUpdates();
         }
         ProfileSyncService syncService = ProfileSyncService.get();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java
index fca3961..272bf43 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SignInPreference.java
@@ -16,6 +16,7 @@
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.firstrun.FirstRunSignInProcessor;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.preferences.SharedPreferencesManager;
 import org.chromium.chrome.browser.profiles.Profile;
@@ -173,10 +174,15 @@
             return;
         }
 
+        @ConsentLevel
+        int consentLevel =
+                ChromeFeatureList.isEnabled(ChromeFeatureList.MOBILE_IDENTITY_CONSISTENCY)
+                ? ConsentLevel.NOT_REQUIRED
+                : ConsentLevel.SYNC;
         CoreAccountInfo accountInfo =
                 IdentityServicesProvider.get()
                         .getIdentityManager(Profile.getLastUsedRegularProfile())
-                        .getPrimaryAccountInfo(ConsentLevel.SYNC);
+                        .getPrimaryAccountInfo(consentLevel);
         if (accountInfo != null) {
             setupSignedIn(accountInfo.getEmail());
             return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java
index 9f87ca1..56e4a4a6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/SyncPromoPreference.java
@@ -69,11 +69,9 @@
         setVisible(false);
     }
 
-    /**
-     * Starts listening for updates to the sign-in and sync state.
-     * TODO(https://crbug.com/1109713): Remove this method and use onAttached() instead
-     */
-    public void registerForUpdates() {
+    @Override
+    public void onAttached() {
+        super.onAttached();
         mAccountManagerFacade.addObserver(this);
         mProfileDataCache.addObserver(this);
         FirstRunSignInProcessor.updateSigninManagerFirstRunCheckDone();
@@ -86,12 +84,9 @@
         update();
     }
 
-    /**
-     * Stops listening for updates to the sign-in and sync state. Every call to registerForUpdates()
-     * must be matched with a call to this method.
-     * TODO(https://crbug.com/1109713): Remove this method and use onAttached() instead
-     */
-    public void unregisterForUpdates() {
+    @Override
+    public void onDetached() {
+        super.onDetached();
         mAccountManagerFacade.removeObserver(this);
         mProfileDataCache.removeObserver(this);
         AndroidSyncSettings.get().unregisterObserver(this);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
index c0e65301..e6d7af1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
@@ -40,6 +40,7 @@
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.components.security_state.SecurityStateModel;
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.util.ColorUtils;
 import org.chromium.url.URI;
 
@@ -278,10 +279,10 @@
     public Profile getProfile() {
         Profile lastUsedRegularProfile = Profile.getLastUsedRegularProfile();
         if (mIsIncognito) {
+            WindowAndroid windowAndroid = (mTab != null) ? mTab.getWindowAndroid() : null;
             // If the mTab belongs to a CustomTabActivity then we return the non-primary OTR profile
             // which is associated with it. For all other cases we return the primary OTR profile.
-            Profile nonPrimaryOTRProfile =
-                    getNonPrimaryOTRProfileFromWindowAndroid(mTab.getWindowAndroid());
+            Profile nonPrimaryOTRProfile = getNonPrimaryOTRProfileFromWindowAndroid(windowAndroid);
             if (nonPrimaryOTRProfile != null) return nonPrimaryOTRProfile;
 
             // When in overview mode with no open tabs, there has not been created an
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
index ac4fdce6..7db5c5c 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -3234,6 +3234,7 @@
     @Feature({"ContextualSearch"})
     @ParameterAnnotations.UseMethodParameter(FeatureParamProvider.class)
     @DisableIf.Build(sdk_is_greater_than = Build.VERSION_CODES.O, message = "crbug.com/1075895")
+    @DisabledTest(message = "Flaky https://crbug.com/1127796")
     public void testQuickActionUrl_Longpress_DLD(@EnabledFeature int enabledFeature)
             throws Exception {
         // TODO(donnd): figure out why this fails to select on Longpress, but works fine on the
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
index beaeb48..8254da2 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
@@ -6,6 +6,9 @@
 
 import static androidx.test.espresso.Espresso.onView;
 import static androidx.test.espresso.action.ViewActions.click;
+import static androidx.test.espresso.assertion.ViewAssertions.matches;
+import static androidx.test.espresso.matcher.ViewMatchers.Visibility.GONE;
+import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
 import static androidx.test.espresso.matcher.ViewMatchers.withId;
 
 import static org.junit.Assert.assertNotNull;
@@ -270,13 +273,28 @@
     }
 
     /**
-     * Tests the permissions page of the new PageInfo UI.
+     * Tests that the permissions page of the new PageInfo UI is gone when there are no permissions
+     * set.
+     */
+    @Test
+    @MediumTest
+    @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
+    public void testNoPermissionsSubpage() throws IOException {
+        loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
+        View dialog = (View) getPageInfoView().getParent();
+        onView(withId(R.id.page_info_permissions_row))
+                .check(matches(withEffectiveVisibility(GONE)));
+    }
+
+    /**
+     * Tests the permissions page of the new PageInfo UI with permissions.
      */
     @Test
     @MediumTest
     @Feature({"RenderTest"})
     @Features.EnableFeatures(PageInfoFeatureList.PAGE_INFO_V2)
     public void testShowPermissionsSubpage() throws IOException {
+        addSomePermissions(mTestServerRule.getServer().getURL("/"));
         loadUrlAndOpenPageInfo(mTestServerRule.getServer().getURL(mPath));
         onView(withId(R.id.page_info_permissions_row)).perform(click());
         mRenderTestRule.render(getPageInfoView(), "PageInfo_PermissionsSubpage");
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java
index 4595b54d..4c346c8 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java
@@ -4,13 +4,15 @@
 
 package org.chromium.chrome.browser.toolbar;
 
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Intent;
 import android.support.test.InstrumentationRegistry;
 
 import androidx.test.filters.MediumTest;
-import androidx.test.filters.SmallTest;
 
 import org.junit.Assert;
-import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -20,17 +22,26 @@
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeTabbedActivity;
+import org.chromium.chrome.browser.IntentHandler;
+import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
+import org.chromium.chrome.browser.customtabs.CustomTabsTestUtils;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.incognito.IncognitoDataTestUtils;
 import org.chromium.chrome.browser.omnibox.UrlBarData;
+import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.MockTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.toolbar.top.ToolbarLayout;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.chrome.test.util.ChromeTabUtils;
+import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.components.embedder_support.util.UrlConstants;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
+import java.util.concurrent.TimeoutException;
+
 /**
  * Tests for LocationBarModel.
  */
@@ -40,10 +51,8 @@
     @Rule
     public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
 
-    @Before
-    public void setUp() throws InterruptedException {
-        mActivityTestRule.startMainActivityOnBlankPage();
-    }
+    @Rule
+    public CustomTabActivityTestRule mCustomTabActivityTestRule = new CustomTabActivityTestRule();
 
     /**
      * After closing all {@link Tab}s, the {@link LocationBarModel} should know that it is not
@@ -53,6 +62,7 @@
     @Feature({"Android-Toolbar"})
     @MediumTest
     public void testClosingLastTabReflectedInModel() {
+        mActivityTestRule.startMainActivityOnBlankPage();
         Assert.assertNotSame("No current tab", Tab.INVALID_TAB_ID,
                 getCurrentTabId(mActivityTestRule.getActivity()));
         ChromeTabUtils.closeCurrentTab(
@@ -64,10 +74,12 @@
     }
 
     @Test
-    @SmallTest
+    @MediumTest
     public void testDisplayAndEditText() {
+        mActivityTestRule.startMainActivityOnBlankPage();
         TestThreadUtils.runOnUiThreadBlocking(() -> {
-            TestLocationBarModel model = new TestLocationBarModel();
+            boolean incognito = false;
+            TestLocationBarModel model = new TestLocationBarModel(getMockTab(incognito), incognito);
             model.mUrl = UrlConstants.NTP_URL;
             assertDisplayAndEditText(model, "", null);
 
@@ -88,6 +100,72 @@
         });
     }
 
+    @Test
+    @MediumTest
+    public void testGetProfileOnNullTabInIncognito() {
+        mActivityTestRule.startMainActivityOnBlankPage();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            boolean incognito = true;
+            TestLocationBarModel model = new TestLocationBarModel(null, incognito);
+            Profile profile = model.getProfile();
+            assertTrue(profile.isPrimaryOTRProfile());
+        });
+    }
+
+    @Test
+    @MediumTest
+    public void testGetProfileOnMockTabInIncognito() {
+        mActivityTestRule.startMainActivityOnBlankPage();
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            boolean incognito = true;
+            TestLocationBarModel model = new TestLocationBarModel(getMockTab(incognito), incognito);
+            Profile profile = model.getProfile();
+            assertTrue(profile.isPrimaryOTRProfile());
+        });
+    }
+
+    @Test
+    @MediumTest
+    @Features.EnableFeatures({ChromeFeatureList.CCT_INCOGNITO})
+    public void testGetProfileOnMockTabInIncognitoCCT() throws TimeoutException {
+        IncognitoDataTestUtils.fireAndWaitForCctWarmup();
+
+        // Create an launch an incognito CCT.
+        Intent intent = CustomTabsTestUtils.createMinimalCustomTabIntent(
+                InstrumentationRegistry.getContext(), "about:blank");
+        intent.putExtra(IntentHandler.EXTRA_OPEN_NEW_INCOGNITO_TAB, true);
+        mCustomTabActivityTestRule.startCustomTabActivityWithIntent(intent);
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            boolean incognito = true;
+            // Setup LocationBarModel
+            Tab tab = mCustomTabActivityTestRule.getActivity().getActivityTab();
+            TestLocationBarModel model = new TestLocationBarModel(tab, incognito);
+
+            Profile profile = model.getProfile();
+            assertFalse(profile.isPrimaryOTRProfile());
+        });
+    }
+
+    @Test
+    @MediumTest
+    public void testGetProfileOnMockTabInRegularCCT() {
+        // Create an launch a regular CCT.
+        Intent intent = CustomTabsTestUtils.createMinimalCustomTabIntent(
+                InstrumentationRegistry.getContext(), "about:blank");
+        mCustomTabActivityTestRule.startCustomTabActivityWithIntent(intent);
+
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            boolean incognito = true;
+            // Setup LocationBarModel
+            Tab tab = mCustomTabActivityTestRule.getActivity().getActivityTab();
+            TestLocationBarModel model = new TestLocationBarModel(tab, incognito);
+
+            Profile profile = model.getProfile();
+            assertTrue(profile.isPrimaryOTRProfile());
+        });
+    }
+
     private void assertDisplayAndEditText(
             ToolbarDataProvider dataProvider, String displayText, String editText) {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
@@ -112,27 +190,30 @@
         return tab != null ? tab.getId() : Tab.INVALID_TAB_ID;
     }
 
+    public static Tab getMockTab(boolean incognito) {
+        Tab tab = new MockTab(0, incognito) {
+            @Override
+            public boolean isInitialized() {
+                return true;
+            }
+
+            @Override
+            public boolean isFrozen() {
+                return false;
+            }
+        };
+        return tab;
+    }
+
     private class TestLocationBarModel extends LocationBarModel {
         private String mDisplayUrl;
         private String mFullUrl;
         private String mUrl;
 
-        public TestLocationBarModel() {
+        public TestLocationBarModel(Tab tab, boolean incognito) {
             super(ContextUtils.getApplicationContext());
             initializeWithNative();
-
-            Tab tab = new MockTab(0, false) {
-                @Override
-                public boolean isInitialized() {
-                    return true;
-                }
-
-                @Override
-                public boolean isFrozen() {
-                    return false;
-                }
-            };
-            setTab(tab, false);
+            setTab(tab, incognito);
         }
 
         @Override
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateCompactInfoBarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateCompactInfoBarTest.java
index d2d882a90..33c2805 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateCompactInfoBarTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/translate/TranslateCompactInfoBarTest.java
@@ -177,7 +177,11 @@
     @MediumTest
     @Feature({"Browser", "Main"})
     @Restriction(ChromeRestriction.RESTRICTION_TYPE_GOOGLE_PLAY_SERVICES)
-    public void testStartTranslateOnManualInitiation() throws TimeoutException {
+    @DisableIf.
+    Build(sdk_is_greater_than = VERSION_CODES.LOLLIPOP_MR1, sdk_is_less_than = VERSION_CODES.N,
+            message = "Consistently failing on Marshmallow https://crbug.com/1127786")
+    public void
+    testStartTranslateOnManualInitiation() throws TimeoutException {
         // Load a page that won't trigger the translate recommendation.
         mActivityTestRule.loadUrl(mTestServer.getURL(NON_TRANSLATE_PAGE));
 
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PageInfoPermissionsControllerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PageInfoPermissionsControllerUnitTest.java
new file mode 100644
index 0000000..433d55d
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PageInfoPermissionsControllerUnitTest.java
@@ -0,0 +1,97 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.page_info;
+
+import static org.junit.Assert.assertEquals;
+
+import android.content.Context;
+
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.ParameterizedRobolectricTestRunner;
+
+import org.chromium.chrome.R;
+import org.chromium.components.page_info.PageInfoPermissionsController;
+import org.chromium.components.page_info.PageInfoView.PermissionRowParams;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Tests the functionality of the SingleWebsiteSettings.java page.
+ */
+@RunWith(ParameterizedRobolectricTestRunner.class)
+public class PageInfoPermissionsControllerUnitTest {
+    private static PermissionRowParams createPermission(
+            String name, boolean allowed, int warningResId) {
+        PermissionRowParams permission = new PermissionRowParams();
+        permission.name = name;
+        permission.allowed = allowed;
+        permission.warningTextResource = warningResId;
+        return permission;
+    }
+    private static final PermissionRowParams LOCATION_OS_WARNING =
+            createPermission("Location", true, R.string.page_info_android_location_blocked);
+    private static final PermissionRowParams LOCATION_ALLOWED =
+            createPermission("Location", true, 0);
+    private static final PermissionRowParams LOCATION_BLOCKED =
+            createPermission("Location", false, 0);
+    private static final PermissionRowParams SOUND_ALLOWED = createPermission("Sound", true, 0);
+    private static final PermissionRowParams SOUND_BLOCKED = createPermission("Sound", false, 0);
+    private static final PermissionRowParams VR_ALLOWED = createPermission("VR", true, 0);
+    private static final PermissionRowParams VR_BLOCKED = createPermission("VR", false, 0);
+
+    private Context mContext;
+    private String mTestName;
+    private List<PermissionRowParams> mPermissions;
+    private String mExpectedString;
+
+    public PageInfoPermissionsControllerUnitTest(
+            String testName, List<PermissionRowParams> permissions, String expectedString) {
+        mContext = ApplicationProvider.getApplicationContext();
+        this.mTestName = testName;
+        this.mPermissions = permissions;
+        this.mExpectedString = expectedString;
+    }
+
+    @ParameterizedRobolectricTestRunner.Parameters
+    public static Collection testCases() {
+        return Arrays.asList(new Object[][] {{"No Permissions", Arrays.asList(), null},
+                {"OS Warning", Arrays.asList(LOCATION_OS_WARNING, SOUND_ALLOWED, VR_ALLOWED),
+                        "Location - Turned off for this device"},
+                {"One Permission Allowed", Arrays.asList(LOCATION_ALLOWED), "Location allowed"},
+                {"One Permission Blocked", Arrays.asList(LOCATION_BLOCKED), "Location blocked"},
+                {"Two Permissions Allowed", Arrays.asList(LOCATION_ALLOWED, SOUND_ALLOWED),
+                        "Location and Sound allowed"},
+                {"Two Permissions Blocked", Arrays.asList(LOCATION_BLOCKED, SOUND_BLOCKED),
+                        "Location and Sound blocked"},
+                {"Two Permissions Mixed", Arrays.asList(LOCATION_ALLOWED, SOUND_BLOCKED),
+                        "Location allowed, Sound blocked"},
+                {"Two Permissions Mixed 2", Arrays.asList(LOCATION_BLOCKED, SOUND_ALLOWED),
+                        "Sound allowed, Location blocked"},
+                {"Multiple Permissions Allowed",
+                        Arrays.asList(LOCATION_ALLOWED, SOUND_ALLOWED, VR_ALLOWED),
+                        "Location, Sound and 1 more allowed"},
+                {"Multiple Permissions Blocked",
+                        Arrays.asList(LOCATION_BLOCKED, SOUND_BLOCKED, VR_BLOCKED),
+                        "Location, Sound and 1 more blocked"},
+                {"Multiple Permissions Mixed",
+                        Arrays.asList(LOCATION_ALLOWED, SOUND_BLOCKED, VR_BLOCKED),
+                        "Location, Sound and 1 more"}});
+    }
+
+    @Test
+    @SmallTest
+    public void testSummaryStringIsCorrectForPermissions() {
+        assertEquals(mTestName,
+                PageInfoPermissionsController.getPermissionSummaryString(
+                        this.mPermissions, mContext.getResources()),
+                mExpectedString);
+    }
+}
\ No newline at end of file
diff --git a/chrome/app/nearby_share_strings.grdp b/chrome/app/nearby_share_strings.grdp
index 45245aa..fa6eb49 100644
--- a/chrome/app/nearby_share_strings.grdp
+++ b/chrome/app/nearby_share_strings.grdp
@@ -16,8 +16,11 @@
   <message name="IDS_NEARBY_CONTACT_VISIBILITY_CONTACTS_TITLE" desc="Section title of the contacts list when setting up the device visibility for the Nearby Share feature.">
     Contacts
   </message>
-  <message name="IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN" desc="Describes that nearby devices are visible while the Nearby Share feature is open on screen.">
-    Devices near you when Nearby Share is open
+  <message name="IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN_OTHERS" desc="Describes that nearby devices are visible while the Nearby Share feature is open on their screen.">
+    Devices near you when Nearby Share is open on their device
+  </message>
+  <message name="IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN_OWN" desc="Describes that the local device is visible to nearby devices while the Nearby Share feature is open on screen on the local device.">
+    Devices near you when Nearby Share is open on your device
   </message>
   <message name="IDS_NEARBY_CONTACT_VISIBILITY_NO_CONTACTS_SUBTITLE" desc="Help text shown when there are no available contacts with a Google Account to select from. Nearby Share is the feature name.">
     No contacts are available. To use Nearby Share with your contacts, add the email address linked with their Google Account to your contacts.
@@ -35,7 +38,7 @@
     All contacts near you when your screen is unlocked
   </message>
   <message name="IDS_NEARBY_CONTACT_VISIBILITY_OWN_NONE" desc="Describes who can see the local device when the Nearby Share visibility setting is set to 'Hidden'.">
-    No one unless you open Nearby Share
+    No one unless you open Nearby Share on your device
   </message>
   <message name="IDS_NEARBY_CONTACT_VISIBILITY_OWN_SOME" desc="Describes who can see the local device when the Nearby Share visibility setting is set to 'Some contacts'.">
     Selected contacts near you when your screen is unlocked
diff --git a/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN.png.sha1 b/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN.png.sha1
deleted file mode 100644
index 301510d..0000000
--- a/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN.png.sha1
+++ /dev/null
@@ -1 +0,0 @@
-ea503bebcdfff256a1bd55a237f6b3895e5fca54
\ No newline at end of file
diff --git a/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN_OTHERS.png.sha1 b/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN_OTHERS.png.sha1
new file mode 100644
index 0000000..d3df26e
--- /dev/null
+++ b/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN_OTHERS.png.sha1
@@ -0,0 +1 @@
+3ac199f7e641f8ca94e14e0862696eb6b906ff01
\ No newline at end of file
diff --git a/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN_OWN.png.sha1 b/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN_OWN.png.sha1
new file mode 100644
index 0000000..3607fee5
--- /dev/null
+++ b/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN_OWN.png.sha1
@@ -0,0 +1 @@
+e7c2d3890a48f879296229a8cc9d37b7847ad485
\ No newline at end of file
diff --git a/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_OWN_NONE.png.sha1 b/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_OWN_NONE.png.sha1
index 7d17770..72db5a7 100644
--- a/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_OWN_NONE.png.sha1
+++ b/chrome/app/nearby_share_strings_grdp/IDS_NEARBY_CONTACT_VISIBILITY_OWN_NONE.png.sha1
@@ -1 +1 @@
-15f933772e67e2cb6a87b95cfc562c9a2e3def63
\ No newline at end of file
+f3218f0c0ad070413de224e4fb271b5d922e08f5
\ No newline at end of file
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb
index 7081fe057..b38efb3 100644
--- a/chrome/app/resources/generated_resources_ar.xtb
+++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -510,7 +510,7 @@
 <translation id="1588870296199743671">فتح الرابط باستخدام...</translation>
 <translation id="1589055389569595240">إظهار التدقيق الإملائي والتدقيق النحوي</translation>
 <translation id="1591679663873027990">‏يُرجى منح نظام Parallels Desktop إذن الوصول إلى أجهزة USB. لن يتذكر نظام Parallels Desktop جهاز USB بعد إزالته.</translation>
-<translation id="1593594475886691512">جارٍ التهيئة...</translation>
+<translation id="1593594475886691512">تجري التهيئة...</translation>
 <translation id="159359590073980872">ذاكرة التخزين المؤقت للصور</translation>
 <translation id="1593926297800505364">حفظ طريقة الدفع</translation>
 <translation id="1595492813686795610">‏جارٍ ترقية Linux</translation>
@@ -580,7 +580,7 @@
 <translation id="1661867754829461514">رقم التعريف الشخصي غير موجود</translation>
 <translation id="16620462294541761">عذرًا، ولكن تعذر التحقق من كلمة المرور. يُرجى المحاولة مرة أخرى.</translation>
 <translation id="166278006618318542">خوارزمية المفتاح العام لصاحب الشهادة</translation>
-<translation id="166439687370499867">لا يُسمح بتغيير عمليات تهيئة الشبكة المشتركة.</translation>
+<translation id="166439687370499867">لا يُسمح بتغيير عمليات ضبط الشبكة المشتركة.</translation>
 <translation id="1668435968811469751">تسجيل يدوي</translation>
 <translation id="1668979692599483141">معرفة المزيد حول الاقتراحات</translation>
 <translation id="1670399744444387456">الإعدادات الأساسية</translation>
@@ -1089,7 +1089,7 @@
 <translation id="2278562042389100163">فتح نافذة المتصفح</translation>
 <translation id="2280486287150724112">الهامش الأيمن</translation>
 <translation id="2282146716419988068">‏معالجة وحدة معالجة الرسومات (GPU)</translation>
-<translation id="2282155092769082568">‏عنوان URL للتهيئة التلقائية:</translation>
+<translation id="2282155092769082568">‏عنوان URL للإعداد التلقائي:</translation>
 <translation id="2285942871162473373">لم يتم التعرّف على بصمة الإصبع. يُرجى إعادة المحاولة.</translation>
 <translation id="2287944065963043964">شاشة تسجيل الدخول</translation>
 <translation id="2288181517385084064">التبديل إلى مسجل الفيديو</translation>
@@ -1106,7 +1106,7 @@
 <translation id="2301382460326681002">دليل الجذر للإضافة غير صالح.</translation>
 <translation id="23030561267973084">تتطلب الإضافة "<ph name="EXTENSION_NAME" />" أذونات إضافية.</translation>
 <translation id="23055578400314116">اختيار اسم مستخدم</translation>
-<translation id="2307462900900812319">تهيئة الشبكة</translation>
+<translation id="2307462900900812319">إعداد الشبكة</translation>
 <translation id="230927227160767054">تريد هذه الصفحة تثبيت معالج الخدمة.</translation>
 <translation id="2309620859903500144">تم حظر هذا الموقع من الوصول إلى أجهزة استشعار الإضاءة أو الحركة.</translation>
 <translation id="2314165183524574721">الإعداد الحالي لمستوى ظهور الجهاز هو "مخفي".</translation>
@@ -1148,7 +1148,7 @@
 <translation id="2349610121459545414">مواصلة السماح لهذا الموقع الإلكتروني بالوصول إلى موقعك الجغرافي</translation>
 <translation id="2349896577940037438">‏في حال تفعيل إعداد "النشاط الإضافي على الويب وفي التطبيقات"، قد يتم حفظ هذه البيانات في حسابك على Google. يمكنك الاطّلاع على البيانات وحذفها، وتغيير إعدادات الحساب من خلال account.google.com.</translation>
 <translation id="2350133097354918058">إعادة التحميل</translation>
-<translation id="2350182423316644347">جارٍ تهيئة التطبيق...</translation>
+<translation id="2350182423316644347">جارٍ إعداد التطبيق...</translation>
 <translation id="2350796302381711542">هل تريد السماح لـ <ph name="HANDLER_HOSTNAME" /> بفتح كل روابط <ph name="PROTOCOL" /> بدلاً من <ph name="REPLACED_HANDLER_TITLE" />؟</translation>
 <translation id="2351266942280602854">اللغة والإدخال</translation>
 <translation id="2352495879228166246">{NUM_ITEMS,plural, =1{عنصر واحد}zero{{NUM_ITEMS} عنصر}two{عنصران ({NUM_ITEMS})}few{{NUM_ITEMS} عناصر}many{{NUM_ITEMS} عنصرًا}other{{NUM_ITEMS} عنصر}}</translation>
@@ -2230,7 +2230,7 @@
 <translation id="3650952250015018111">السماح لتطبيق "<ph name="APP_NAME" />" بالوصول:</translation>
 <translation id="3651488188562686558">‏قطع الاتصال بشبكة Wi-Fi</translation>
 <translation id="3651952061994655768">تغيير الاسم</translation>
-<translation id="3652817283076144888">جارٍ التهيئة</translation>
+<translation id="3652817283076144888">تجري التهيئة</translation>
 <translation id="3653160965917900914">مشاركات ملفات الشبكة</translation>
 <translation id="3653842108912548333">‏الوصول إلى "مساعد Google" باستخدام ميزة Voice Match</translation>
 <translation id="3653999333232393305">مواصلة السماح لـ <ph name="HOST" /> بالدخول إلى الميكروفون</translation>
@@ -3279,7 +3279,7 @@
 <translation id="4940845626435830013">حجز حجم القرص</translation>
 <translation id="4941246025622441835">استخدام طلب الجهاز عند تسجيل الجهاز في إدارة المؤسسات:</translation>
 <translation id="4941627891654116707">حجم الخط</translation>
-<translation id="494286511941020793">مساعدة تهيئة الخادم الوكيل</translation>
+<translation id="494286511941020793">مساعدة إعداد الخادم الوكيل</translation>
 <translation id="4943368462779413526">كرة القدم</translation>
 <translation id="4943691134276646401">يجب ربط "<ph name="CHROME_EXTENSION_NAME" />" بمنفذ تسلسلي</translation>
 <translation id="4944310289250773232">تتم استضافة خدمة المصادقة هذه من قِبل <ph name="SAML_DOMAIN" />.</translation>
@@ -3546,7 +3546,7 @@
 <translation id="5288678174502918605">إ&amp;عادة فتح علامة التبويب المغلقة</translation>
 <translation id="52895863590846877">الصفحة ليست باللغة <ph name="LANGUAGE" />.</translation>
 <translation id="52912272896845572">ملف المفتاح الخاص غير صالح.</translation>
-<translation id="529175790091471945">لتهيئة هذا الجهاز</translation>
+<translation id="529175790091471945">لإعداد هذا الجهاز</translation>
 <translation id="5293170712604732402">استعادة الإعدادات إلى الوضع التلقائي الأصلي</translation>
 <translation id="5294097441441645251">يجب البدء بحرف صغير أو شرطة سفلية.</translation>
 <translation id="5297082477358294722">تم حفظ كلمة المرور. يمكنك عرض كلمات المرور المحفوظة وإدارتها في <ph name="SAVED_PASSWORDS_STORE" />.</translation>
@@ -4673,7 +4673,7 @@
 <translation id="6657585470893396449">كلمة المرور</translation>
 <translation id="6659213950629089752">تم تكبير/تصغير هذه الصفحة عبر إضافة "<ph name="NAME" />"</translation>
 <translation id="6659594942844771486">علامة تبويب</translation>
-<translation id="6664237456442406323">‏للأسف، تمت تهيئة جهاز الكمبيوتر باستخدام معرف جهاز غير صحيح. وهذا يمنع تحديث نظام التشغيل Chrome بأحدث إصلاحات الأمان، وقد يكون جهاز الكمبيوتر <ph name="BEGIN_BOLD" />عرضة للهجمات الضارة<ph name="END_BOLD" />.</translation>
+<translation id="6664237456442406323">‏للأسف، تم إعداد جهاز الكمبيوتر باستخدام معرف جهاز غير صحيح. وهذا يمنع تحديث نظام التشغيل Chrome بأحدث إصلاحات الأمان، وقد يكون جهاز الكمبيوتر <ph name="BEGIN_BOLD" />عرضة للهجمات الضارة<ph name="END_BOLD" />.</translation>
 <translation id="6664774537677393800">حدث خطأ ما أثناء فتح ملفك الشخصي. يُرجى الخروج ثم إعادة تسجيل الدخول.</translation>
 <translation id="6670142487971298264">أصبح تطبيق <ph name="APP_NAME" /> متوفّرًا الآن.</translation>
 <translation id="6673391612973410118"><ph name="PRINTER_MAKE_OR_MODEL" /> (USB)</translation>
@@ -4849,7 +4849,7 @@
 <translation id="6878422606530379992">استخدام أجهزة الاستشعار مسموح به</translation>
 <translation id="6880587130513028875">تم منع عرض الصور في هذه الصفحة.</translation>
 <translation id="6882836635272038266">يوفّر لك حماية عادية من الإضافات وعمليات التنزيل والمواقع الإلكترونية الضارة.</translation>
-<translation id="6883319974225028188">عفوًا! تعذّر النظام في حفظ تهيئة الجهاز.</translation>
+<translation id="6883319974225028188">عفوًا! تعذّر النظام في حفظ إعداد الجهاز.</translation>
 <translation id="6885771755599377173">معاينة معلومات النظام</translation>
 <translation id="6886476658664859389">‏مفتاح أمان NFC</translation>
 <translation id="6886871292305414135">فتح الرابط في &amp;علامة تبويب جديدة</translation>
@@ -4857,7 +4857,7 @@
 <translation id="6895032998810961280">‏إبلاغ Google بالتفاصيل حول البرامج الضارّة وإعدادات النظام والعمليات التي تم العثور عليها على جهاز الكمبيوتر أثناء إزالة البرامج غير المرغوب فيها.</translation>
 <translation id="6896758677409633944">نسخ</translation>
 <translation id="6897363604023044284">اختيار المواقع الإلكترونية لمحوها</translation>
-<translation id="6898440773573063262">الآن، يمكن تهيئة تطبيقات الكشك للبدء التلقائي على هذا الجهاز.</translation>
+<translation id="6898440773573063262">الآن، يمكن إعداد تطبيقات الكشك للبدء التلقائي على هذا الجهاز.</translation>
 <translation id="6900284862687837908">تطبيق الخلفية: <ph name="BACKGROUND_APP_URL" /></translation>
 <translation id="6900532703269623216">حماية مُحسّنة</translation>
 <translation id="6900651018461749106">تسجيل الدخول مرة أخرى لتحديث <ph name="USER_EMAIL" /></translation>
@@ -4918,7 +4918,7 @@
 <translation id="6965648386495488594">المنفذ</translation>
 <translation id="6965978654500191972">جهاز</translation>
 <translation id="696780070563539690">لن يسمح هذا الإجراء للمواقع الإلكترونية باستخدام ملفات تعريف الارتباط للاطّلاع على نشاط التصفُّح على المواقع الإلكترونية المختلفة، وذلك لتقديم إعلانات مخصَّصة لك مثلاً.</translation>
-<translation id="6968288415730398122">أدخل كلمة المرور لتهيئة قفل الشاشة</translation>
+<translation id="6968288415730398122">أدخل كلمة المرور لإعداد قفل الشاشة</translation>
 <translation id="6969047215179982698">إيقاف ميزة "المشاركة عن قرب"</translation>
 <translation id="6970480684834282392">نوع التشغيل</translation>
 <translation id="6970856801391541997">طباعة صفحات محددة</translation>
@@ -5078,7 +5078,7 @@
 <translation id="7152478047064750137">لا تتطلب هذه الإضافة أذونات خاصة</translation>
 <translation id="7154130902455071009">تغيير الصفحة الرئيسية إلى: <ph name="START_PAGE" /></translation>
 <translation id="7155171745945906037">صورة حالية من الكاميرا أو الملف</translation>
-<translation id="7165320105431587207">تعذّرت تهيئة الشبكة</translation>
+<translation id="7165320105431587207">تعذّر إعداد الشبكة</translation>
 <translation id="716640248772308851">"<ph name="EXTENSION" />" يمكنها قراءة ملفات الصور والفيديو والصوت في المواقع المحددة.</translation>
 <translation id="7167486101654761064">فت&amp;ح هذا النوع من الملفّات دائمًا</translation>
 <translation id="716810439572026343">جارٍ تنزيل <ph name="FILE_NAME" /></translation>
@@ -5090,7 +5090,7 @@
 <translation id="7172470549472604877">{NUM_TABS,plural, =1{إضافة علامة التبويب إلى مجموعة جديدة}zero{إضافة علامات التبويب إلى مجموعة جديدة}two{إضافة علامتَي التبويب إلى مجموعة جديدة}few{إضافة علامات التبويب إلى مجموعة جديدة}many{إضافة علامات التبويب إلى مجموعة جديدة}other{إضافة علامات التبويب إلى مجموعة جديدة}}</translation>
 <translation id="7173852404388239669">تخصيص جهاز <ph name="DEVICE_TYPE" /></translation>
 <translation id="7174199383876220879">إليك إعداد جديد. يمكنك التحكم في الموسيقى والفيديوهات وغير ذلك.</translation>
-<translation id="7175037578838465313">تهيئة <ph name="NAME" /></translation>
+<translation id="7175037578838465313">إعداد <ph name="NAME" /></translation>
 <translation id="7175353351958621980">تم التحميل من:</translation>
 <translation id="7180611975245234373">إعادة التحميل</translation>
 <translation id="7180865173735832675">تخصيص</translation>
@@ -5472,7 +5472,7 @@
 <translation id="7659584679870740384">لا يصرح لك باستخدام هذا الجهاز. يُرجى الاتصال بالمسؤول، للحصول على إذن تسجيل الدخول.</translation>
 <translation id="7661259717474717992">السماح للمواقع الإلكترونية بحفظ بيانات ملفات تعريف الارتباط وقراءتها</translation>
 <translation id="7661451191293163002">تعذّر الحصول على شهادة التسجيل.</translation>
-<translation id="7662283695561029522">النقر للتهيئة</translation>
+<translation id="7662283695561029522">النقر للإعداد</translation>
 <translation id="7663719505383602579">المتلقي: <ph name="ARC_PROCESS_NAME" /></translation>
 <translation id="7664620655576155379">جهاز بلوتوث غير متوافق: "<ph name="DEVICE_NAME" />".</translation>
 <translation id="7665082356120621510">حجز الحجم</translation>
@@ -5636,7 +5636,7 @@
     <ph name="BEGIN_BOLD" />ملاحظة:<ph name="END_BOLD" />  ستتم إعادة تشغيل النظام أثناء العملية.</translation>
 <translation id="7828731929332799387">سيؤدي هذا إلى حذف جميع ملفات تعريف الارتباط وبيانات الموقع الإلكتروني المتوفرة في سياقات تابعة لجهات خارجية. هل تريد المواصلة؟</translation>
 <translation id="7829877209233347340">اطلب من أحد الوالدَين تسجيل الدخول لمنح إذن إضافة حساب المدرسة.</translation>
-<translation id="7831491651892296503">حدث خطأ أثناء تهيئة الشبكة</translation>
+<translation id="7831491651892296503">حدث خطأ أثناء إعداد الشبكة</translation>
 <translation id="7831754656372780761"><ph name="TAB_TITLE" /> <ph name="EMOJI_MUTING" /></translation>
 <translation id="7832084384634357321">وقت الانتهاء</translation>
 <translation id="783214144752121388">‏حظر المواقع الإلكترونية من تشغيل Flash (مُستحسَن)</translation>
@@ -5902,7 +5902,7 @@
 <translation id="8137559199583651773">إدارة الإضافات</translation>
 <translation id="8138082791834443598">اختياري - إدخال معلومات جديدة أو تحديث المعلومات الحالية لتكون مرتبطة بهذا الجهاز.</translation>
 <translation id="8138217203226449454">هل كنت تقصد تغيير مُوفِّر خدمة البحث؟</translation>
-<translation id="813913629614996137">جارٍ التهيئة...</translation>
+<translation id="813913629614996137">تجري التهيئة...</translation>
 <translation id="8140778357236808512">استيراد مستخدم حالي يخضع للإشراف</translation>
 <translation id="8141584439523427891">جارٍ الفتح في متصفِّح بديل الآن</translation>
 <translation id="8141725884565838206">إدارة كلمات المرور</translation>
@@ -5912,10 +5912,10 @@
 <translation id="8146793085009540321">تعذّر تسجيل الدخول، يُرجى الاتصال بالمشرف أو إعادة المحاولة.</translation>
 <translation id="8148760431881541277">قصر تسجيل الدخول على مستخدمين محددين</translation>
 <translation id="8151579390896831136">تخصيص ملفك الشخصي بما في ذلك الاسم</translation>
-<translation id="8151638057146502721">تهيئة</translation>
+<translation id="8151638057146502721">إعداد</translation>
 <translation id="8152091997436726702">انتهت مهلة تسجيل الطابعة. لتسجيل طابعة، يجب عليك تأكيد التسجيل على الطابعة.</translation>
 <translation id="8154790740888707867">لم يتم العثور على الملف</translation>
-<translation id="815491593104042026">‏عفوا! فشلت المصادقة لأنه تم تهيئتها لاستخدام عنوان URL غير آمن ( <ph name="BLOCKED_URL" /> ). يرجى الاتصال بالمسؤول.</translation>
+<translation id="815491593104042026">‏عفوا! فشلت المصادقة لأنه تم إعدادها لاستخدام عنوان URL غير آمن ( <ph name="BLOCKED_URL" /> ). يرجى الاتصال بالمسؤول.</translation>
 <translation id="8155676038687609779">{COUNT,plural, =0{لم يتم العثور على أي كلمات مرور محتمَل تعرّضها للاختراق.}=1{كلمة مرور واحدة {COUNT} محتمَل تعرّضها للاختراق}two{كلمتا مرورٍ ({COUNT}) محتمَل تعرّضهما للاختراق}few{{COUNT} كلمات مرور محتمَل تعرّضها للاختراق}many{{COUNT} كلمة مرور محتمَل تعرّضها للاختراق}other{{COUNT} كلمة مرور محتمَل تعرّضها للاختراق}}</translation>
 <translation id="8157704005178149728">جارٍ إعداد الإشراف</translation>
 <translation id="8158117992543756526">لقد توقف هذا الجهاز عن تلقّي تحديثات تلقائية للبرنامج والأمان في <ph name="MONTH_AND_YEAR" />. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
@@ -6150,7 +6150,7 @@
 <translation id="845702320058262034">يتعذَّر الاتصال. يُرجى التأكّد من تفعيل البلوتوث في هاتفك.</translation>
 <translation id="8457451314607652708">استيراد الإشارات المرجعية</translation>
 <translation id="8461329675984532579">اسم مقدم الخدمة الرئيسي</translation>
-<translation id="84613761564611563">تم طلب واجهة المستخدم لتهيئة الشبكة، يُرجى الانتظار...</translation>
+<translation id="84613761564611563">تم طلب واجهة المستخدم لإعداد الشبكة، يُرجى الانتظار...</translation>
 <translation id="8461914792118322307">الخادم الوكيل</translation>
 <translation id="8463215747450521436">ربما يكون قد تم حذف هذا المستخدم الخاضع للإدارة أو تم إيقافه بواسطة المدير. يُرجى الاتصال بالمدير إذا كنت تريد متابعة تسجيل دخولك باسم هذا المستخدم.</translation>
 <translation id="846374874681391779">شريط عمليات التنزيل</translation>
@@ -6273,7 +6273,7 @@
 <translation id="8619892228487928601"><ph name="CERTIFICATE_NAME" />: <ph name="ERROR" /></translation>
 <translation id="8620436878122366504">لم يوافق عليه والداك حتى الآن</translation>
 <translation id="8620617069779373398">حالة التجوال</translation>
-<translation id="8620765578342452535">تهيئة اتصالات الشبكة</translation>
+<translation id="8620765578342452535">إعداد اتصالات الشبكة</translation>
 <translation id="8621866727807194849">‏هناك برنامج ضار على جهاز الكمبيوتر. يعمل متصفِّح Chrome على إزالته وعلى استعادة إعداداتك وإيقاف الإضافات. سيؤدي هذا الإجراء إلى عمل متصفِّحك بشكلٍ طبيعي من جديد.</translation>
 <translation id="8621979332865976405">مشاركة الشاشة بالكامل</translation>
 <translation id="862542460444371744">&amp;الإضافات</translation>
@@ -6393,9 +6393,9 @@
 <translation id="8750133148106010815">‏لبدء تشغيل Google Play، تتطلّب مؤسسة <ph name="ORGANIZATION_NAME" /> منك الاحتفاظ بنسخة احتياطية من بياناتك وإعادة ضبط جهاز Chromebook هذا على الإعدادات الأصلية.</translation>
 <translation id="8750155211039279868">يجب ربط <ph name="ORIGIN" /> بمنفذ تسلسلي</translation>
 <translation id="8750346984209549530">‏نقطة وصول APN لشبكة الجوّال</translation>
-<translation id="8754200782896249056">‏&lt;p&gt;عند تشغيل <ph name="PRODUCT_NAME" /> من خلال بيئة معتمدة لسطح المكتب، سيتم استخدام إعدادات الخادم الوكيل للنظام. ومع ذلك، يحتمل إما أن يكون نظامك غير مدعم أو أنه ربما حدثت مشكلة أثناء تشغيل تهيئة نظامك.&lt;/p&gt;
+<translation id="8754200782896249056">‏&lt;p&gt;عند تشغيل <ph name="PRODUCT_NAME" /> من خلال بيئة معتمدة لسطح المكتب، سيتم استخدام إعدادات الخادم الوكيل للنظام. ومع ذلك، يحتمل إما أن يكون نظامك غير مدعم أو أنه ربما حدثت مشكلة أثناء تشغيل إعداد نظامك.&lt;/p&gt;
 
-          &lt;p&gt;لكن لا يزال بإمكانك التهيئة من خلال سطر الأوامر. يُرجى الاطّلاع على &lt;code&gt;man <ph name="PRODUCT_BINARY_NAME" />&lt;/code&gt; للمزيد من المعلومات عن المتغيرات لكل من العلامات والبيئة.&lt;/p&gt;</translation>
+          &lt;p&gt;لكن لا يزال بإمكانك الإعداد من خلال سطر الأوامر. يُرجى الاطّلاع على &lt;code&gt;man <ph name="PRODUCT_BINARY_NAME" />&lt;/code&gt; للمزيد من المعلومات عن المتغيرات لكل من العلامات والبيئة.&lt;/p&gt;</translation>
 <translation id="8755175579224030324">تنفيذ المهام المتعلّقة بالأمان في مؤسستك، مثل إدارة الشهادات والمفاتيح المُخزَّنة على الجهاز</translation>
 <translation id="8755376271068075440">أ&amp;كبر</translation>
 <translation id="8756969031206844760">هل تريد تحديث كلمة المرور؟</translation>
@@ -6476,7 +6476,7 @@
 <translation id="8830779999439981481">جارٍ إعادة التشغيل لتطبيق التعديلات</translation>
 <translation id="8830796635868321089">تعذّر البحث عن التحديثات باستخدام إعدادات الخادم الوكيل الحالية. يُرجى ضبط <ph name="PROXY_SETTINGS_LINK_START" />إعدادات الخادم الوكيل<ph name="PROXY_SETTINGS_LINK_END" />.</translation>
 <translation id="8831140208248705279">‏يعمل جهاز <ph name="DEVICE_TYPE" /> وهاتف Android بشكلٍ أفضل معًا. ويمكنك ربطهما حتى تتمكَّن من إرسال رسائل نصية من جهاز الكمبيوتر ومشاركة اتصالك بالإنترنت وفتح قفل جهاز Chromebook باستخدام هاتفك.<ph name="DEVICE_TYPE" /><ph name="FOOTNOTE_POINTER" /><ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation>
-<translation id="8834039744648160717">يتم التحكم في تهيئة الشبكة بواسطة <ph name="USER_EMAIL" />.</translation>
+<translation id="8834039744648160717">يتم التحكم في إعداد الشبكة بواسطة <ph name="USER_EMAIL" />.</translation>
 <translation id="8838601485495657486">معتم</translation>
 <translation id="8838770651474809439">هامبورجر</translation>
 <translation id="883911313571074303">إضافة تعليق توضيحي على الصورة</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb
index bb7664a..074acf2 100644
--- a/chrome/app/resources/generated_resources_as.xtb
+++ b/chrome/app/resources/generated_resources_as.xtb
@@ -1473,6 +1473,7 @@
 <translation id="2731700343119398978">অনুগ্রহ কৰি অপেক্ষা কৰক...</translation>
 <translation id="2731710757838467317">আপোনাৰ তদাৰক কৰা ব্যৱহাৰকাৰী সৃষ্টি কৰি থকা হৈছে। এই কাৰ্যৰ বাবে কেইমুহূৰ্তমান লাগিব পাৰে।</translation>
 <translation id="2731971182069536520">পৰৱর্তী সময়ত আপুনি নিজৰ ডিভাইচ ৰিষ্টার্ট কৰিলে, আপোনাৰ প্ৰশাসকে এবাৰেই কৰিবলগীয়া আপডে'টটো কৰিব যিয়ে আপোনাৰ স্থানীয় ডেটা মচিব।</translation>
+<translation id="2732134891301408122">অতিৰিক্ত <ph name="TOTAL_ELEMENTS" /> টা সমলৰ ভিতৰত <ph name="CURRENT_ELEMENT" /> নম্বৰটো</translation>
 <translation id="2734760316755174687"><ph name="SITE_GROUP_NAME" />ত অন্তর্ভুক্ত ছাইটসমূহো ৰিছেট কৰা হ’ব।</translation>
 <translation id="2735712963799620190">সময়সূচী</translation>
 <translation id="2737363922397526254">সংকোচন কৰক...</translation>
@@ -3116,6 +3117,7 @@
 <translation id="4735803855089279419">এই ডিভাইচৰ বাবে ছিষ্টেমে ডিভাইচ চিনাক্তকাৰীক নির্ধাৰণ কৰিব নোৱাৰিলে।</translation>
 <translation id="4736292055110123391">আপোনাৰ সকলো ডিভাইচত নিজৰ বুকমার্ক, পাছৱর্ড, ইতিহাস আৰু অধিক সমল ছিংক কৰক</translation>
 <translation id="473775607612524610">আপডে'ট কৰক</translation>
+<translation id="473936925429402449">অতিৰিক্ত <ph name="TOTAL_ELEMENTS" /> টা সমলৰ <ph name="CURRENT_ELEMENT" /> নম্বৰটো বাছনি কৰা হৈছে</translation>
 <translation id="4739639199548674512">টিকেটবোৰ</translation>
 <translation id="4743260470722568160"><ph name="BEGIN_LINK" />এপ্লিকেশ্বনসমূহ কেনেদৰে আপডে’ট কৰে সেয়া জানক<ph name="END_LINK" /></translation>
 <translation id="4744981231093950366">{NUM_TABS,plural, =1{ছাইট আনমিউট কৰক}one{ছাইটসমূহ আনমিউট কৰক}other{ছাইটসমূহ আনমিউট কৰক}}</translation>
@@ -4135,6 +4137,7 @@
 <translation id="6011449291337289699">ছাইটৰ ডেটা মচক</translation>
 <translation id="6015266928248016057">অমান্য PUK। বাকী থকা পুনৰাবৃত্তিৰ সংখ্যা: <ph name="RETRIES" />।</translation>
 <translation id="6015796118275082299">বছৰ</translation>
+<translation id="6016178549409952427">অতিৰিক্ত <ph name="TOTAL_ELEMENTS" /> টা সমলৰ <ph name="CURRENT_ELEMENT" /> নম্বৰটোলৈ নেভিগে’ট কৰক</translation>
 <translation id="6016551720757758985">পূৰ্বৰ সংস্কৰণলৈ উভতি যোৱাকৈ পাৱাৰৱাশ্ব নিশ্চিত কৰক</translation>
 <translation id="6016972670657536680">ভাষা আৰু কীব’ৰ্ড বুটাম সলনি কৰক। বৰ্তমান বাছনি কৰা ভাষা হৈছে <ph name="LANGUAGE" />।</translation>
 <translation id="6017514345406065928">সেউজীয়া ৰং</translation>
@@ -6434,6 +6437,7 @@
 <translation id="8811862054141704416">Crostiniৰ মাইক্র’ফ’নৰ এক্সেছ</translation>
 <translation id="8812552797690463522">এই নেটৱর্কটো আপোনাৰ সৈতে শ্বেয়াৰ কৰা হৈছে।</translation>
 <translation id="8812593354822910461">লগতে ব্ৰাউজিঙৰ ডেটাও (<ph name="URL" />) মচক যিয়ে আপোনাক <ph name="DOMAIN" />ৰ পৰা ছাইন আউট কৰাব। <ph name="LEARN_MORE" /></translation>
+<translation id="8813277370772331957">মোক পাছত মনত পেলাই দিব</translation>
 <translation id="8813698869395535039"><ph name="USERNAME" />ত ছাইন ইন কৰিব নোৱাৰি</translation>
 <translation id="8813872945700551674">"<ph name="EXTENSION_NAME" />" অনুমোদন জনাবলৈ এগৰাকী অভিভাৱক বিচাৰক</translation>
 <translation id="8813969267212093033">ছিষ্টেমৰ পাঠ এইটো ভাষাত দেখুওৱা হয়</translation>
@@ -6464,6 +6468,7 @@
 <translation id="8838601485495657486">অস্বচ্ছ</translation>
 <translation id="8838770651474809439">হেমবাৰ্গাৰ</translation>
 <translation id="883911313571074303">এন'টেট প্ৰতিচ্ছবি</translation>
+<translation id="8841843049738266382">অনুমতিৰ তালিকাত ৰখা ব্যৱহাৰকাৰীসকল পঢ়ক আৰু সলনি কৰক</translation>
 <translation id="8842594465773264717">এই ফিংগাৰপ্ৰিণ্টটো মচক</translation>
 <translation id="8845001906332463065">সহায় পাওক</translation>
 <translation id="8846132060409673887">এই কম্পিউটাৰটোৰ নিৰ্মাণকাৰী আৰু ম'ডেলৰ তথ্য পঢ়ক</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb
index 7009b52..09eedf1 100644
--- a/chrome/app/resources/generated_resources_be.xtb
+++ b/chrome/app/resources/generated_resources_be.xtb
@@ -3530,7 +3530,7 @@
 <translation id="5265797726250773323">Памылка падчас усталявання</translation>
 <translation id="5266113311903163739">Памылка імпарту файла цэнтра сертыфікацыі</translation>
 <translation id="5269977353971873915">Збой друку</translation>
-<translation id="5274738462757057090">Аўтаматычна стварае субцітры для мультымедыйных файлаў у браўзеры Chrome (пакуль што падтрымліваецца толькі англійская мова)</translation>
+<translation id="5274738462757057090">Аўтаматычнае стварэнне субцітраў для мультымедыйных файлаў у браўзеры Chrome (пакуль што падтрымліваецца толькі англійская мова)</translation>
 <translation id="5275352920323889391">Сабака</translation>
 <translation id="527605982717517565">Заўсёды дазваляць сайту <ph name="HOST" /> выкарыстоўваць JavaScript</translation>
 <translation id="5278823018825269962">Ідэнтыфікатар стану</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb
index 55d8e68..62cae35 100644
--- a/chrome/app/resources/generated_resources_en-GB.xtb
+++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1476,6 +1476,7 @@
 <translation id="2731700343119398978">Please wait…</translation>
 <translation id="2731710757838467317">Creating your supervised user. This may take a few moments.</translation>
 <translation id="2731971182069536520">The next time that you restart your device, your administrator will perform a one-off update that will delete your local data.</translation>
+<translation id="2732134891301408122">Extra content <ph name="CURRENT_ELEMENT" /> out of <ph name="TOTAL_ELEMENTS" /></translation>
 <translation id="2734760316755174687">Sites under <ph name="SITE_GROUP_NAME" /> will also be reset.</translation>
 <translation id="2735712963799620190">Schedule</translation>
 <translation id="2737363922397526254">Collapse...</translation>
@@ -3123,6 +3124,7 @@
 <translation id="4735803855089279419">The system failed to determine device identifiers for this device.</translation>
 <translation id="4736292055110123391">Sync your bookmarks, passwords, history and more on all your devices</translation>
 <translation id="473775607612524610">Update</translation>
+<translation id="473936925429402449">Selected; extra content <ph name="CURRENT_ELEMENT" /> out of <ph name="TOTAL_ELEMENTS" /></translation>
 <translation id="4739639199548674512">Tickets</translation>
 <translation id="4743260470722568160"><ph name="BEGIN_LINK" />Find out how to update applications<ph name="END_LINK" /></translation>
 <translation id="4744981231093950366">{NUM_TABS,plural, =1{Unmute site}other{Unmute sites}}</translation>
@@ -4144,6 +4146,7 @@
 <translation id="6011449291337289699">Clear site data</translation>
 <translation id="6015266928248016057">Invalid PUK. Retries left: <ph name="RETRIES" />.</translation>
 <translation id="6015796118275082299">Year</translation>
+<translation id="6016178549409952427">Navigate to extra content <ph name="CURRENT_ELEMENT" /> out of <ph name="TOTAL_ELEMENTS" /></translation>
 <translation id="6016551720757758985">Confirm Powerwash with return to previous version</translation>
 <translation id="6016972670657536680">Select language and keyboard button. Currently selected language is <ph name="LANGUAGE" />.</translation>
 <translation id="6017514345406065928">Green</translation>
@@ -6451,6 +6454,7 @@
 <translation id="8811862054141704416">Crostini microphone access</translation>
 <translation id="8812552797690463522">This network is shared with you.</translation>
 <translation id="8812593354822910461">Also clear browsing data (<ph name="URL" />) which will sign you out of <ph name="DOMAIN" />. <ph name="LEARN_MORE" /></translation>
+<translation id="8813277370772331957">Remind me later</translation>
 <translation id="8813698869395535039">Can't sign in to <ph name="USERNAME" /></translation>
 <translation id="8813872945700551674">Go and get a parent to approve '<ph name="EXTENSION_NAME" />'</translation>
 <translation id="8813969267212093033">System text is shown in this language</translation>
@@ -6481,6 +6485,7 @@
 <translation id="8838601485495657486">Opaque</translation>
 <translation id="8838770651474809439">Hamburger</translation>
 <translation id="883911313571074303">Annotate image</translation>
+<translation id="8841843049738266382">Read and change the allowlist users</translation>
 <translation id="8842594465773264717">Delete this fingerprint</translation>
 <translation id="8845001906332463065">Get help</translation>
 <translation id="8846132060409673887">Read the manufacturer and model of this computer</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb
index c2bfb2d..4c1625b 100644
--- a/chrome/app/resources/generated_resources_eu.xtb
+++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -1905,7 +1905,7 @@
 <translation id="3275778913554317645">Ireki leiho gisa</translation>
 <translation id="3277691515294482687">Linux-en bertsioa berritu aurretik, gorde nire aplikazioak eta fitxategiak Nire fitxategiak karpetan.</translation>
 <translation id="3278001907972365362">Google-ko kontuak zure arreta behar du</translation>
-<translation id="3279230909244266691">Prozesuak zenbait minutu iraun ditzake. Makina birtuala abiarazten.</translation>
+<translation id="3279230909244266691">Baliteke prozesuak minutu batzuk behar izatea. Makina birtuala abiarazten.</translation>
 <translation id="3280237271814976245">Gorde &amp;honela…</translation>
 <translation id="3280243678470289153">Gelditu Chrome-n</translation>
 <translation id="3281892622610078515">Berrogeialdian sartu beharreko fitxategiak eta programak:</translation>
@@ -2141,7 +2141,7 @@
 <translation id="3559262020195162408">Ezin izan da instalatu gidalerroa gailuan.</translation>
 <translation id="3559533181353831840"><ph name="TIME_LEFT" /> inguru falta dira</translation>
 <translation id="3560034655160545939">&amp;Ortografia-zuzentzailea</translation>
-<translation id="3562423906127931518">Prozesuak zenbait minutu iraun ditzake. Linux edukiontzia konfiguratzen.</translation>
+<translation id="3562423906127931518">Baliteke prozesuak minutu batzuk behar izatea. Linux edukiontzia konfiguratzen.</translation>
 <translation id="3563432852173030730">Ezin izan da deskargatu aplikazio espezializatua.</translation>
 <translation id="3564334271939054422">Baliteke darabilzun sarearen (<ph name="NETWORK_ID" />) saio-hasierako orrira joan behar izatea.</translation>
 <translation id="3564848315152754834">USB bidezko segurtasun-giltza</translation>
@@ -2628,7 +2628,7 @@
 <translation id="4095507791297118304">Pantaila nagusia</translation>
 <translation id="409579654357498729">Gehitu Cloud Print zerbitzuan</translation>
 <translation id="4096508467498758490">Desgaitu Garatzaile moduaren luzapenak</translation>
-<translation id="4096824249111507322">Segurtasun-modulua prestatzen ari da. Itxaron pixka bat; minutu batzuk behar izan ditzake…</translation>
+<translation id="4096824249111507322">Segurtasun-modulua prestatzen ari da. Itxaron pixka bat; agian minutu batzuk beharko dira…</translation>
 <translation id="4097406557126260163">Aplikazioak eta luzapenak</translation>
 <translation id="4097560579602855702">Bilatu Google-n</translation>
 <translation id="4098667039111970300">Tresna-barrako arkatzaren tresnak</translation>
@@ -4979,7 +4979,7 @@
 <translation id="7029307918966275733">Crostini ez dago instalatuta. Zerrendak ikusi nahi badituzu, instalatu Crostini.</translation>
 <translation id="7029809446516969842">Pasahitzak</translation>
 <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Serie-ataka konektatuta</translation>
-<translation id="7031962166228839643">TPMa prestatzen ari da. Itxaron pixka bat; minutu batzuk luza daiteke…</translation>
+<translation id="7031962166228839643">TPMa prestatzen ari da. Itxaron pixka bat; agian minutu batzuk beharko dira…</translation>
 <translation id="7036706669646341689">Linux instalatzeko, gutxienez <ph name="DISK_SIZE" /> eduki behar dira libre. Tokia egiteko, ezabatu gailuan dauden fitxategiak.</translation>
 <translation id="7037509989619051237">Aurreikusteko testua</translation>
 <translation id="7038632520572155338">Erabilerraztasun-osagarria</translation>
@@ -6639,7 +6639,7 @@
 <translation id="9024127637873500333">&amp;Ireki fitxa berri batean</translation>
 <translation id="9024158959543687197">Errore bat gertatu da partekatzea muntatzean. Egiaztatu fitxategiak partekatzeko biltegiaren URLa eta saiatu berriro.</translation>
 <translation id="9026731007018893674">deskargatu</translation>
-<translation id="9026852570893462412">Prozesuak zenbait minutu iraun ditzake. Makina birtuala deskargatzen.</translation>
+<translation id="9026852570893462412">Baliteke prozesuak minutu batzuk behar izatea. Makina birtuala deskargatzen.</translation>
 <translation id="9027459031423301635">Ireki esteka &amp;fitxa berri batean</translation>
 <translation id="9030515284705930323">Zure erakundeak ez dizu gaitu kontuan Google Play Store erabiltzeko aukera. Informazio gehiago lortzeko, jarri administratzailearekin harremanetan.</translation>
 <translation id="9030785788945687215">Gmail</translation>
@@ -6763,7 +6763,7 @@
 <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> - Bluetooth bidezko gailu bat konektatu da</translation>
 <translation id="9179524979050048593">Saioa hasteko pantailako erabiltzaile-izena</translation>
 <translation id="9179734824669616955">Konfiguratu Linux (Beta) <ph name="DEVICE_TYPE" /> gailuan</translation>
-<translation id="9180281769944411366">Prozesuak zenbait minutu iraun ditzake. Linux edukiontzia abiarazten.</translation>
+<translation id="9180281769944411366">Baliteke prozesuak minutu batzuk behar izatea. Linux edukiontzia abiarazten.</translation>
 <translation id="9180380851667544951">Webguneak pantaila parteka dezake</translation>
 <translation id="9188732951356337132">Bidali erabilera- eta diagnostiko-datuak. Gailu honek automatikoki bidaltzen dizkio Google-ri diagnostikoak eta gailu zein aplikazioen erabilerari buruzko datuak. Informazio hori ez da erabiliko haurra identifikatzeko eta, hari esker, sistemaren eta aplikazioen egonkortasuna hobetuko da, besteak beste. Gainera, multzokatutako datu batzuk oso baliagarriak izango dira Google-ren aplikazioak hobetzeko eta bazkideei laguntzeko (adibidez, Android-en garatzaileei). Haurraren kontuko Sareko eta aplikazioetako jarduera gehigarriak ezarpena aktibatuta badago, baliteke datu horiek haren Google-ko kontuan gordetzea. <ph name="BEGIN_LINK2" />Lortu informazio gehiago<ph name="END_LINK2" /></translation>
 <translation id="9190063653747922532">L2TP/IPsec + aurrez partekatutako gakoa</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb
index f5b9995..a4dbeb0 100644
--- a/chrome/app/resources/generated_resources_iw.xtb
+++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -2638,6 +2638,7 @@
 <translation id="4104163789986725820">יי&amp;צא...</translation>
 <translation id="4107048419833779140">לזהות ולהוציא התקני אחסון</translation>
 <translation id="4109135793348361820">העבר חלון אל <ph name="USER_NAME" /> (<ph name="USER_EMAIL" />)</translation>
+<translation id="411031910327788420">התאמה אישית של הגודל והסגנון של הכתוביות לאפליקציות שתומכות בהגדרה זו</translation>
 <translation id="4110490973560452005">‏ההורדה הושלמה: <ph name="FILE_NAME" />. אפשר להקיש על Shift+F6 כדי לעבור לאזור סרגל ההורדות.</translation>
 <translation id="4110686435123617899">בחירת האלבום <ph name="TITLE" /> <ph name="DESC" /></translation>
 <translation id="4110895898888439383">גלישה באינטרנט במצב ניגודיות גבוהה</translation>
@@ -2837,6 +2838,7 @@
 <translation id="4390000551125140321">{0,plural, =1{גלישה בסתר}two{# חלונות פתוחים של גלישה בסתר}many{# חלונות פתוחים של גלישה בסתר}other{# חלונות פתוחים של גלישה בסתר}}</translation>
 <translation id="439266289085815679">‏הגדרת ה-Bluetooth היא בשליטת <ph name="USER_EMAIL" />.</translation>
 <translation id="4392896746540753732">עריכת קובץ התצורה</translation>
+<translation id="4393691030048716353">‏ניפוי באגים באמצעות ADB הושבת על-ידי <ph name="DOMAIN" />. לאחר הפעלה מחדש של <ph name="DEVICE_TYPE" />, לא תהיה יותר אפשרות להתקין אפליקציות ממקור לא ידוע.</translation>
 <translation id="4394049700291259645">השבת</translation>
 <translation id="439817266247065935">‏המכשיר שלך לא כובה כהלכה. כדי להשתמש באפליקציות של Linux, יש להפעיל את Linux מחדש.</translation>
 <translation id="4400367121200150367">כאן יופיעו האתרים שאף פעם אינם שומרים סיסמאות</translation>
@@ -3526,6 +3528,7 @@
 <translation id="5265797726250773323">קרתה שגיאה במהלך ההתקנה</translation>
 <translation id="5266113311903163739">שגיאת ייבוא של רשות אישורים</translation>
 <translation id="5269977353971873915">ההדפסה נכשלה</translation>
+<translation id="5274738462757057090">‏יצירה אוטומטית של כתוביות למדיה בדפדפן Chrome (התכונה זמינה רק באנגלית בשלב זה)</translation>
 <translation id="5275352920323889391">כלב</translation>
 <translation id="527605982717517565">‏אפשר תמיד JavaScript ב-<ph name="HOST" /></translation>
 <translation id="5278823018825269962">מזהה סטטוס</translation>
@@ -3961,6 +3964,7 @@
 <translation id="5794700615121138172">‏תיקיות משותפות של Linux</translation>
 <translation id="5794786537412027208">‏יציאה מכל אפליקציות Chrome</translation>
 <translation id="5797070761912323120">‏Google עשויה להשתמש בהיסטוריית הגלישה שלך לצורך התאמה אישית של החיפוש, מודעות ושירותי Google אחרים</translation>
+<translation id="5798301976526354562">גודל טקסט (רלוונטי גם לכתוביות מיידיות)</translation>
 <translation id="579915268381781820">מפתח האבטחה שלך הוסר.</translation>
 <translation id="5799508265798272974">‏מכונה וירטואלית של Linux: <ph name="LINUX_VM_NAME" /></translation>
 <translation id="5800020978570554460">קובץ היעד נקטע או הוסר מאז ההורדה האחרונה.</translation>
@@ -4869,6 +4873,7 @@
 <translation id="6911324888870229398">‏החיבור לרשת נותק. יש לבדוק את החיבור או לנסות רשת Wi-Fi אחרת.</translation>
 <translation id="6911734910326569517">הזיכרון שבשימוש</translation>
 <translation id="6912007319859991306">‏קוד גישה לכרטיס ה-SIM הסלולרי</translation>
+<translation id="691289340230098384">העדפות לכתוביות</translation>
 <translation id="6914783257214138813">כל מי שיוכל לגשת אל הקובץ המיוצא יוכל לראות את הסיסמאות שלך.</translation>
 <translation id="6915804003454593391">משתמש:</translation>
 <translation id="6916590542764765824">נהל תוספים</translation>
@@ -6158,6 +6163,7 @@
 <translation id="8467326454809944210">בחירת שפה אחרת</translation>
 <translation id="8470214316007448308">אנשים אחרים</translation>
 <translation id="8470513973197838199">סיסמאות שנשמרו בשביל <ph name="ORIGIN" /></translation>
+<translation id="8471256130228705232">‏ניפוי באגים באמצעות ADB מושבת על-ידי <ph name="DOMAIN" />. פעולה זו תאפס את <ph name="DEVICE_TYPE" /> בתוך 24 שעות. כדאי לגבות קבצים שברצונך לשמור.</translation>
 <translation id="8472623782143987204">גיבוי חומרה</translation>
 <translation id="8473863474539038330">כתובות ועוד</translation>
 <translation id="8475313423285172237">‏תוכנה אחרת במחשב שלך הוסיפה תוסף שעשוי לשנות את אופן הפעולה של Chrome.</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 5bc9f901..a1fd5cd 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -3152,6 +3152,8 @@
       "component_updater/soda_ja_jp_component_installer.h",
       "content_settings/generated_cookie_prefs.cc",
       "content_settings/generated_cookie_prefs.h",
+      "content_settings/generated_notification_pref.cc",
+      "content_settings/generated_notification_pref.h",
       "custom_handlers/register_protocol_handler_permission_request.cc",
       "custom_handlers/register_protocol_handler_permission_request.h",
       "device_identity/device_identity_provider.cc",
@@ -5065,6 +5067,8 @@
       "guest_view/web_view/chrome_web_view_permission_helper_delegate.h",
       "guest_view/web_view/context_menu_content_type_web_view.cc",
       "guest_view/web_view/context_menu_content_type_web_view.h",
+      "loader/url_loader_factory_proxy_impl.cc",
+      "loader/url_loader_factory_proxy_impl.h",
       "media/extension_media_access_handler.cc",
       "media/extension_media_access_handler.h",
       "media/webrtc/desktop_capture_access_handler.cc",
diff --git a/chrome/browser/chrome_browser_interface_binders.cc b/chrome/browser/chrome_browser_interface_binders.cc
index 431c3fb..9b4140a 100644
--- a/chrome/browser/chrome_browser_interface_binders.cc
+++ b/chrome/browser/chrome_browser_interface_binders.cc
@@ -201,6 +201,8 @@
 #endif
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
+#include "chrome/browser/loader/url_loader_factory_proxy_impl.h"
+#include "chrome/common/url_loader_factory_proxy.mojom.h"
 #include "extensions/browser/api/mime_handler_private/mime_handler_private.h"
 #include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
 #include "extensions/common/api/mime_handler.mojom.h"  // nogncheck
@@ -375,6 +377,12 @@
     return;
   guest_view->FuseBeforeUnloadControl(std::move(receiver));
 }
+
+void BindUrlLoaderFactoryProxy(
+    content::RenderFrameHost* frame_host,
+    mojo::PendingReceiver<chrome::mojom::UrlLoaderFactoryProxy> receiver) {
+  UrlLoaderFactoryProxyImpl::Create(frame_host, std::move(receiver));
+}
 #endif
 
 void BindNetworkHintsHandler(
@@ -496,6 +504,8 @@
       base::BindRepeating(&BindMimeHandlerService));
   map->Add<extensions::mime_handler::BeforeUnloadControl>(
       base::BindRepeating(&BindBeforeUnloadControl));
+  map->Add<chrome::mojom::UrlLoaderFactoryProxy>(
+      base::BindRepeating(&BindUrlLoaderFactoryProxy));
 #endif
 
   map->Add<network_hints::mojom::NetworkHintsHandler>(
diff --git a/chrome/browser/content_settings/generated_cookie_prefs.cc b/chrome/browser/content_settings/generated_cookie_prefs.cc
index a1e109a..9d33bc35 100644
--- a/chrome/browser/content_settings/generated_cookie_prefs.cc
+++ b/chrome/browser/content_settings/generated_cookie_prefs.cc
@@ -14,38 +14,12 @@
 #include "components/prefs/pref_service.h"
 
 namespace settings_api = extensions::api::settings_private;
+namespace settings_private = extensions::settings_private;
 
 namespace content_settings {
 
 namespace {
 
-settings_api::ControlledBy GetControlledByForContentSettingSource(
-    SettingSource source) {
-  switch (source) {
-    case SETTING_SOURCE_POLICY:
-      return settings_api::ControlledBy::CONTROLLED_BY_DEVICE_POLICY;
-    case SETTING_SOURCE_EXTENSION:
-      return settings_api::ControlledBy::CONTROLLED_BY_EXTENSION;
-    case SETTING_SOURCE_SUPERVISED:
-      return settings_api::ControlledBy::CONTROLLED_BY_CHILD_RESTRICTION;
-    default:
-      NOTREACHED();
-      return settings_api::ControlledBy::CONTROLLED_BY_DEVICE_POLICY;
-  }
-}
-
-// Adds the provided |value| to the user selectable values of |pref_object|,
-// creating the base::Value vector if required.
-void AddUserSelectableValue(settings_api::PrefObject* pref_object,
-                            CookiePrimarySetting value) {
-  if (!pref_object->user_selectable_values) {
-    pref_object->user_selectable_values =
-        std::make_unique<std::vector<std::unique_ptr<base::Value>>>();
-  }
-  pref_object->user_selectable_values->push_back(
-      std::make_unique<base::Value>(static_cast<int>(value)));
-}
-
 bool IsDefaultCookieContentSettingUserControlled(HostContentSettingsMap* map) {
   std::string content_setting_provider;
   map->GetDefaultContentSetting(ContentSettingsType::COOKIES,
@@ -251,15 +225,15 @@
   if (content_setting_enforced && content_setting == CONTENT_SETTING_BLOCK) {
     // Preference is fully managed by the content setting.
     pref_object->enforcement = settings_api::Enforcement::ENFORCEMENT_ENFORCED;
-    pref_object->controlled_by =
-        GetControlledByForContentSettingSource(content_setting_source);
+    settings_private::GeneratedPref::ApplyControlledByFromContentSettingSource(
+        pref_object, content_setting_source);
     return;
   }
 
   if (content_setting_enforced && cookie_controls_mode_enforced) {
     // Preference is considered fully managed by the third party preference.
     pref_object->enforcement = settings_api::Enforcement::ENFORCEMENT_ENFORCED;
-    extensions::settings_private::GeneratedPref::ApplyControlledByFromPref(
+    settings_private::GeneratedPref::ApplyControlledByFromPref(
         pref_object, cookie_controls_mode_pref);
     return;
   }
@@ -286,12 +260,14 @@
   // you can choose between the selected cookie controls setting and "BLOCK"
   if (cookie_controls_mode_enforced) {
     pref_object->enforcement = settings_api::Enforcement::ENFORCEMENT_ENFORCED;
-    extensions::settings_private::GeneratedPref::ApplyControlledByFromPref(
+    settings_private::GeneratedPref::ApplyControlledByFromPref(
         pref_object, cookie_controls_mode_pref);
     auto value = static_cast<CookieControlsMode>(
         cookie_controls_mode_pref->GetValue()->GetInt());
-    AddUserSelectableValue(pref_object, ToCookiePrimarySetting(value));
-    AddUserSelectableValue(pref_object, CookiePrimarySetting::BLOCK_ALL);
+    settings_private::GeneratedPref::AddUserSelectableValue(
+        pref_object, static_cast<int>(ToCookiePrimarySetting(value)));
+    settings_private::GeneratedPref::AddUserSelectableValue(
+        pref_object, static_cast<int>(CookiePrimarySetting::BLOCK_ALL));
     return;
   }
 
@@ -300,14 +276,16 @@
     DCHECK(content_setting == CONTENT_SETTING_ALLOW ||
            content_setting == CONTENT_SETTING_SESSION_ONLY);
     pref_object->enforcement = settings_api::Enforcement::ENFORCEMENT_ENFORCED;
-    pref_object->controlled_by =
-        GetControlledByForContentSettingSource(content_setting_source);
+    settings_private::GeneratedPref::ApplyControlledByFromContentSettingSource(
+        pref_object, content_setting_source);
 
-    AddUserSelectableValue(pref_object, CookiePrimarySetting::ALLOW_ALL);
-    AddUserSelectableValue(pref_object,
-                           CookiePrimarySetting::BLOCK_THIRD_PARTY);
-    AddUserSelectableValue(pref_object,
-                           CookiePrimarySetting::BLOCK_THIRD_PARTY_INCOGNITO);
+    settings_private::GeneratedPref::AddUserSelectableValue(
+        pref_object, static_cast<int>(CookiePrimarySetting::ALLOW_ALL));
+    settings_private::GeneratedPref::AddUserSelectableValue(
+        pref_object, static_cast<int>(CookiePrimarySetting::BLOCK_THIRD_PARTY));
+    settings_private::GeneratedPref::AddUserSelectableValue(
+        pref_object,
+        static_cast<int>(CookiePrimarySetting::BLOCK_THIRD_PARTY_INCOGNITO));
   }
 }
 
diff --git a/chrome/browser/content_settings/generated_notification_pref.cc b/chrome/browser/content_settings/generated_notification_pref.cc
new file mode 100644
index 0000000..386896c
--- /dev/null
+++ b/chrome/browser/content_settings/generated_notification_pref.cc
@@ -0,0 +1,233 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/content_settings/generated_notification_pref.h"
+
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/common/extensions/api/settings_private.h"
+#include "components/content_settings/core/browser/content_settings_utils.h"
+#include "components/content_settings/core/common/content_settings.h"
+#include "components/content_settings/core/common/pref_names.h"
+
+namespace settings_api = extensions::api::settings_private;
+typedef extensions::settings_private::GeneratedPref GeneratedPref;
+
+namespace content_settings {
+
+const char kGeneratedNotificationPref[] = "generated.notification";
+
+namespace {
+
+bool IsDefaultNotificationContentSettingUserControlled(
+    HostContentSettingsMap* map) {
+  std::string content_setting_provider;
+  map->GetDefaultContentSetting(ContentSettingsType::NOTIFICATIONS,
+                                &content_setting_provider);
+  auto content_setting_source =
+      HostContentSettingsMap::GetSettingSourceFromProviderName(
+          content_setting_provider);
+  return content_setting_source == SettingSource::SETTING_SOURCE_USER;
+}
+
+}  // namespace
+
+GeneratedNotificationPref::GeneratedNotificationPref(Profile* profile)
+    : profile_(profile) {
+  user_prefs_registrar_.Init(profile->GetPrefs());
+  user_prefs_registrar_.Add(
+      prefs::kEnableQuietNotificationPermissionUi,
+      base::BindRepeating(
+          &GeneratedNotificationPref::OnNotificationPreferencesChanged,
+          base::Unretained(this)));
+
+  host_content_settings_map_ =
+      HostContentSettingsMapFactory::GetForProfile(profile_);
+  content_setting_observer_.Add(host_content_settings_map_);
+}
+
+GeneratedNotificationPref::~GeneratedNotificationPref() = default;
+
+void GeneratedNotificationPref::OnContentSettingChanged(
+    const ContentSettingsPattern& primary_pattern,
+    const ContentSettingsPattern& secondary_pattern,
+    ContentSettingsType content_type,
+    const std::string& resource_identifier) {
+  if (content_type == ContentSettingsType::NOTIFICATIONS) {
+    NotifyObservers(kGeneratedNotificationPref);
+  }
+}
+
+void GeneratedNotificationPref::OnNotificationPreferencesChanged() {
+  NotifyObservers(kGeneratedNotificationPref);
+}
+
+extensions::settings_private::SetPrefResult GeneratedNotificationPref::SetPref(
+    const base::Value* value) {
+  if (!value->is_int())
+    return extensions::settings_private::SetPrefResult::PREF_TYPE_MISMATCH;
+
+  auto selection = static_cast<NotificationSetting>(value->GetInt());
+
+  if (selection != NotificationSetting::ASK &&
+      selection != NotificationSetting::QUIETER_MESSAGING &&
+      selection != NotificationSetting::BLOCK) {
+    return extensions::settings_private::SetPrefResult::PREF_TYPE_MISMATCH;
+  }
+
+  auto current_content_setting =
+      host_content_settings_map_->GetDefaultContentSetting(
+          ContentSettingsType::NOTIFICATIONS, nullptr);
+  auto new_content_setting = selection == NotificationSetting::BLOCK
+                                 ? ContentSetting::CONTENT_SETTING_BLOCK
+                                 : ContentSetting::CONTENT_SETTING_ASK;
+
+  // Do not modify content setting if its setting source is not user.
+  // If there's no actual change, the check doesn't apply.
+  if (current_content_setting != new_content_setting &&
+      !IsDefaultNotificationContentSettingUserControlled(
+          host_content_settings_map_)) {
+    return extensions::settings_private::SetPrefResult::PREF_NOT_MODIFIABLE;
+  }
+  if (selection != NotificationSetting::BLOCK) {
+    const PrefService::Preference* quieter_pref =
+        profile_->GetPrefs()->FindPreference(
+            prefs::kEnableQuietNotificationPermissionUi);
+    bool quieter_value = quieter_pref->GetValue()->GetBool();
+    bool new_quieter_value = selection != NotificationSetting::ASK;
+
+    // Do not modify the preference value if the user is unable to change its
+    // value. If there's no actual change, this check doesn't apply.
+    if (quieter_value != new_quieter_value &&
+        !quieter_pref->IsUserModifiable()) {
+      return extensions::settings_private::SetPrefResult::PREF_NOT_MODIFIABLE;
+    }
+    profile_->GetPrefs()->SetBoolean(
+        prefs::kEnableQuietNotificationPermissionUi, new_quieter_value);
+  }
+
+  host_content_settings_map_->SetDefaultContentSetting(
+      ContentSettingsType::NOTIFICATIONS, new_content_setting);
+  return extensions::settings_private::SetPrefResult::SUCCESS;
+}
+
+std::unique_ptr<settings_api::PrefObject>
+GeneratedNotificationPref::GetPrefObject() const {
+  auto pref_object = std::make_unique<settings_api::PrefObject>();
+  pref_object->key = kGeneratedNotificationPref;
+  pref_object->type = settings_api::PREF_TYPE_NUMBER;
+
+  const auto quieter_pref_enabled =
+      profile_->GetPrefs()
+          ->FindPreference(prefs::kEnableQuietNotificationPermissionUi)
+          ->GetValue()
+          ->GetBool();
+  const auto notification_content_setting =
+      host_content_settings_map_->GetDefaultContentSetting(
+          ContentSettingsType::NOTIFICATIONS, nullptr);
+  const auto notification_content_setting_enabled =
+      notification_content_setting != ContentSetting::CONTENT_SETTING_BLOCK;
+
+  if (notification_content_setting_enabled && quieter_pref_enabled) {
+    pref_object->value = std::make_unique<base::Value>(
+        static_cast<int>(NotificationSetting::QUIETER_MESSAGING));
+  } else if (notification_content_setting_enabled) {
+    pref_object->value = std::make_unique<base::Value>(
+        static_cast<int>(NotificationSetting::ASK));
+  } else {
+    DCHECK_EQ(ContentSetting::CONTENT_SETTING_BLOCK,
+              notification_content_setting);
+    pref_object->value = std::make_unique<base::Value>(
+        static_cast<int>(NotificationSetting::BLOCK));
+  }
+
+  ApplyNotificationManagementState(profile_, pref_object.get());
+
+  return pref_object;
+}
+
+/* static */
+void GeneratedNotificationPref::ApplyNotificationManagementState(
+    Profile* profile,
+    settings_api::PrefObject* pref_object) {
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile);
+  std::string content_setting_provider;
+  auto content_setting = map->GetDefaultContentSetting(
+      ContentSettingsType::NOTIFICATIONS, &content_setting_provider);
+  auto content_setting_source =
+      HostContentSettingsMap::GetSettingSourceFromProviderName(
+          content_setting_provider);
+  bool content_setting_enforced =
+      content_setting_source !=
+      content_settings::SettingSource::SETTING_SOURCE_USER;
+
+  const PrefService::Preference* quieter_ui_pref =
+      profile->GetPrefs()->FindPreference(
+          prefs::kEnableQuietNotificationPermissionUi);
+  auto quieter_ui_on = quieter_ui_pref->GetValue()->GetBool();
+  auto quieter_ui_enforced = !quieter_ui_pref->IsUserModifiable();
+  auto quieter_ui_recommended =
+      quieter_ui_pref->GetRecommendedValue() != nullptr;
+  auto quieter_ui_recommended_on =
+      (quieter_ui_recommended &&
+       quieter_ui_pref->GetRecommendedValue()->GetBool());
+
+  if (!content_setting_enforced && !quieter_ui_enforced &&
+      !quieter_ui_recommended) {
+    // No notification setting is enforced or recommended.
+    return;
+  }
+
+  if (content_setting_enforced) {
+    pref_object->enforcement = settings_api::Enforcement::ENFORCEMENT_ENFORCED;
+
+    if (content_setting == CONTENT_SETTING_BLOCK) {
+      // Preference is fully managed by the content setting.
+      GeneratedPref::ApplyControlledByFromContentSettingSource(
+          pref_object, content_setting_source);
+      return;
+    } else if (quieter_ui_enforced) {
+      // Preference is fully managed by the content setting and quieter ui pref.
+      GeneratedPref::ApplyControlledByFromPref(pref_object, quieter_ui_pref);
+      return;
+    }
+    GeneratedPref::ApplyControlledByFromContentSettingSource(
+        pref_object, content_setting_source);
+
+    DCHECK(content_setting_enforced && !quieter_ui_enforced);
+    // Since content setting is enforced but the quieter ui pref is not,
+    // user can choose from 2 options.
+    GeneratedPref::AddUserSelectableValue(
+        pref_object, static_cast<int>(NotificationSetting::ASK));
+    GeneratedPref::AddUserSelectableValue(
+        pref_object, static_cast<int>(NotificationSetting::QUIETER_MESSAGING));
+
+    if (quieter_ui_recommended) {
+      pref_object->recommended_value =
+          std::make_unique<base::Value>(static_cast<int>(
+              quieter_ui_recommended_on ? NotificationSetting::QUIETER_MESSAGING
+                                        : NotificationSetting::ASK));
+    }
+    return;
+  }
+
+  if (quieter_ui_enforced) {
+    // Quieter ui pref is enforced, but the content setting is not, so the user
+    // can choose from 2 options
+    pref_object->enforcement = settings_api::Enforcement::ENFORCEMENT_ENFORCED;
+    GeneratedPref::ApplyControlledByFromPref(pref_object, quieter_ui_pref);
+    GeneratedPref::AddUserSelectableValue(
+        pref_object,
+        static_cast<int>(quieter_ui_on ? NotificationSetting::QUIETER_MESSAGING
+                                       : NotificationSetting::ASK));
+    GeneratedPref::AddUserSelectableValue(
+        pref_object, static_cast<int>(NotificationSetting::BLOCK));
+  }
+  // If neither of notification content setting nor quieter ui preference is
+  // enforced, but quieter ui preference is recommended, then recommended value
+  // is ignored since it's ambiguous given that notification content setting
+  // can be blocked.
+}
+
+}  // namespace content_settings
diff --git a/chrome/browser/content_settings/generated_notification_pref.h b/chrome/browser/content_settings/generated_notification_pref.h
new file mode 100644
index 0000000..fa43078
--- /dev/null
+++ b/chrome/browser/content_settings/generated_notification_pref.h
@@ -0,0 +1,60 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_CONTENT_SETTINGS_GENERATED_NOTIFICATION_PREF_H_
+#define CHROME_BROWSER_CONTENT_SETTINGS_GENERATED_NOTIFICATION_PREF_H_
+
+#include "chrome/browser/extensions/api/settings_private/generated_pref.h"
+
+#include "base/scoped_observer.h"
+#include "chrome/browser/profiles/profile.h"
+#include "components/content_settings/core/browser/content_settings_observer.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/prefs/pref_change_registrar.h"
+
+namespace content_settings {
+
+extern const char kGeneratedNotificationPref[];
+
+enum class NotificationSetting { ASK, QUIETER_MESSAGING, BLOCK };
+
+// A generated preference which represents the effective Notification setting
+// state based on the Notification content setting and quieter UI user
+// preference.
+class GeneratedNotificationPref
+    : public extensions::settings_private::GeneratedPref,
+      public content_settings::Observer {
+ public:
+  explicit GeneratedNotificationPref(Profile* profile);
+
+  ~GeneratedNotificationPref() override;
+
+  // Generated Preference Interface.
+  extensions::settings_private::SetPrefResult SetPref(
+      const base::Value* value) override;
+  std::unique_ptr<extensions::api::settings_private::PrefObject> GetPrefObject()
+      const override;
+
+  void OnContentSettingChanged(const ContentSettingsPattern& primary_pattern,
+                               const ContentSettingsPattern& secondary_pattern,
+                               ContentSettingsType content_type,
+                               const std::string& resource_identifier) override;
+
+  void OnNotificationPreferencesChanged();
+
+ private:
+  static void ApplyNotificationManagementState(
+      Profile* profile,
+      extensions::api::settings_private::PrefObject* pref_object);
+
+  Profile* const profile_;
+  HostContentSettingsMap* host_content_settings_map_;
+  ScopedObserver<HostContentSettingsMap, content_settings::Observer>
+      content_setting_observer_{this};
+  PrefChangeRegistrar user_prefs_registrar_;
+};
+
+}  // namespace content_settings
+
+#endif  // CHROME_BROWSER_CONTENT_SETTINGS_GENERATED_NOTIFICATION_PREF_H_
diff --git a/chrome/browser/content_settings/generated_notification_pref_unittest.cc b/chrome/browser/content_settings/generated_notification_pref_unittest.cc
new file mode 100644
index 0000000..0fac511
--- /dev/null
+++ b/chrome/browser/content_settings/generated_notification_pref_unittest.cc
@@ -0,0 +1,399 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/content_settings/generated_notification_pref.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/extensions/api/settings_private/generated_pref_test_base.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/content_settings/core/common/pref_names.h"
+#include "components/content_settings/core/test/content_settings_mock_provider.h"
+#include "components/content_settings/core/test/content_settings_test_utils.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace settings_api = extensions::api::settings_private;
+namespace settings_private = extensions::settings_private;
+
+namespace content_settings {
+
+namespace {
+
+// Sets the value of |generated_pref| to |pref_value| and then ensures
+// that the notification content settings and preferences match
+// |expected_content_setting| and |expected_quieter_ui|. The value of
+// the new PrefObject returned by the |generated_pref| is then checked
+// against |pref_value|.
+void ValidateGeneratedPrefSetting(
+    HostContentSettingsMap* map,
+    sync_preferences::TestingPrefServiceSyncable* prefs,
+    GeneratedNotificationPref* generated_pref,
+    NotificationSetting pref_value,
+    ContentSetting expected_content_setting,
+    bool expected_quieter_ui) {
+  EXPECT_EQ(
+      generated_pref->SetPref(
+          std::make_unique<base::Value>(static_cast<int>(pref_value)).get()),
+      settings_private::SetPrefResult::SUCCESS);
+  EXPECT_EQ(map->GetDefaultContentSetting(ContentSettingsType::NOTIFICATIONS,
+                                          nullptr),
+            expected_content_setting);
+
+  EXPECT_EQ(prefs->GetUserPref(prefs::kEnableQuietNotificationPermissionUi)
+                ->GetBool(),
+            expected_quieter_ui);
+  EXPECT_EQ(static_cast<NotificationSetting>(
+                generated_pref->GetPrefObject()->value->GetInt()),
+            pref_value);
+}
+
+const NotificationSetting kNoRecommendedValue =
+    static_cast<NotificationSetting>(-1);
+
+// Represents a set of settings, preferences and the associated expected
+// fields for the returned preference object.
+struct NotificationSettingManagedTestCase {
+  ContentSetting default_content_setting;
+  content_settings::SettingSource default_content_setting_source;
+  settings_private::PrefSetting quieter_ui;
+  settings_private::PrefSource quieter_ui_source;
+  settings_api::ControlledBy expected_controlled_by;
+  settings_api::Enforcement expected_enforcement;
+  NotificationSetting expected_recommended_value;
+  std::vector<NotificationSetting> expected_user_selectable_values;
+};
+
+static const std::vector<NotificationSettingManagedTestCase> managed_test_cases{
+    {CONTENT_SETTING_ASK,
+     SETTING_SOURCE_USER,
+     settings_private::PrefSetting::kNotSet,
+     settings_private::PrefSource::kNone,
+     settings_api::ControlledBy::CONTROLLED_BY_NONE,
+     settings_api::Enforcement::ENFORCEMENT_NONE,
+     kNoRecommendedValue,
+     {}},
+    {CONTENT_SETTING_ASK,
+     SETTING_SOURCE_EXTENSION,
+     settings_private::PrefSetting::kNotSet,
+     settings_private::PrefSource::kNone,
+     settings_api::ControlledBy::CONTROLLED_BY_EXTENSION,
+     settings_api::Enforcement::ENFORCEMENT_ENFORCED,
+     kNoRecommendedValue,
+     {NotificationSetting::ASK, NotificationSetting::QUIETER_MESSAGING}},
+    {CONTENT_SETTING_ASK,
+     SETTING_SOURCE_USER,
+     settings_private::PrefSetting::kEnforcedOn,
+     settings_private::PrefSource::kDevicePolicy,
+     settings_api::ControlledBy::CONTROLLED_BY_DEVICE_POLICY,
+     settings_api::Enforcement::ENFORCEMENT_ENFORCED,
+     kNoRecommendedValue,
+     {NotificationSetting::QUIETER_MESSAGING, NotificationSetting::BLOCK}},
+    {CONTENT_SETTING_ASK,
+     SETTING_SOURCE_USER,
+     settings_private::PrefSetting::kEnforcedOff,
+     settings_private::PrefSource::kExtension,
+     settings_api::ControlledBy::CONTROLLED_BY_EXTENSION,
+     settings_api::Enforcement::ENFORCEMENT_ENFORCED,
+     kNoRecommendedValue,
+     {NotificationSetting::ASK, NotificationSetting::BLOCK}},
+    {CONTENT_SETTING_ASK,
+     SETTING_SOURCE_POLICY,
+     settings_private::PrefSetting::kEnforcedOn,
+     settings_private::PrefSource::kDevicePolicy,
+     settings_api::ControlledBy::CONTROLLED_BY_DEVICE_POLICY,
+     settings_api::Enforcement::ENFORCEMENT_ENFORCED,
+     kNoRecommendedValue,
+     {}},
+    {CONTENT_SETTING_ASK,
+     SETTING_SOURCE_SUPERVISED,
+     settings_private::PrefSetting::kRecommendedOn,
+     settings_private::PrefSource::kRecommended,
+     settings_api::ControlledBy::CONTROLLED_BY_CHILD_RESTRICTION,
+     settings_api::Enforcement::ENFORCEMENT_ENFORCED,
+     NotificationSetting::QUIETER_MESSAGING,
+     {NotificationSetting::ASK, NotificationSetting::QUIETER_MESSAGING}},
+    {CONTENT_SETTING_ASK,
+     SETTING_SOURCE_EXTENSION,
+     settings_private::PrefSetting::kRecommendedOff,
+     settings_private::PrefSource::kRecommended,
+     settings_api::ControlledBy::CONTROLLED_BY_EXTENSION,
+     settings_api::Enforcement::ENFORCEMENT_ENFORCED,
+     NotificationSetting::ASK,
+     {NotificationSetting::ASK, NotificationSetting::QUIETER_MESSAGING}},
+    {CONTENT_SETTING_BLOCK,
+     SETTING_SOURCE_EXTENSION,
+     settings_private::PrefSetting::kRecommendedOn,
+     settings_private::PrefSource::kRecommended,
+     settings_api::ControlledBy::CONTROLLED_BY_EXTENSION,
+     settings_api::Enforcement::ENFORCEMENT_ENFORCED,
+     kNoRecommendedValue,
+     {}},
+    {CONTENT_SETTING_BLOCK,
+     SETTING_SOURCE_EXTENSION,
+     settings_private::PrefSetting::kRecommendedOff,
+     settings_private::PrefSource::kRecommended,
+     settings_api::ControlledBy::CONTROLLED_BY_EXTENSION,
+     settings_api::Enforcement::ENFORCEMENT_ENFORCED,
+     kNoRecommendedValue,
+     {}},
+    {CONTENT_SETTING_BLOCK,
+     SETTING_SOURCE_EXTENSION,
+     settings_private::PrefSetting::kEnforcedOn,
+     settings_private::PrefSource::kRecommended,
+     settings_api::ControlledBy::CONTROLLED_BY_EXTENSION,
+     settings_api::Enforcement::ENFORCEMENT_ENFORCED,
+     kNoRecommendedValue,
+     {}},
+    {CONTENT_SETTING_BLOCK,
+     SETTING_SOURCE_EXTENSION,
+     settings_private::PrefSetting::kEnforcedOff,
+     settings_private::PrefSource::kRecommended,
+     settings_api::ControlledBy::CONTROLLED_BY_EXTENSION,
+     settings_api::Enforcement::ENFORCEMENT_ENFORCED,
+     kNoRecommendedValue,
+     {}},
+    {CONTENT_SETTING_BLOCK,
+     SETTING_SOURCE_EXTENSION,
+     settings_private::PrefSetting::kNotSet,
+     settings_private::PrefSource::kRecommended,
+     settings_api::ControlledBy::CONTROLLED_BY_EXTENSION,
+     settings_api::Enforcement::ENFORCEMENT_ENFORCED,
+     kNoRecommendedValue,
+     {}},
+};
+
+void SetupManagedTestConditions(
+    HostContentSettingsMap* map,
+    sync_preferences::TestingPrefServiceSyncable* prefs,
+    const NotificationSettingManagedTestCase& test_case) {
+  auto provider = std::make_unique<content_settings::MockProvider>();
+  provider->SetWebsiteSetting(
+      ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(),
+      ContentSettingsType::NOTIFICATIONS, std::string(),
+      std::make_unique<base::Value>(test_case.default_content_setting));
+  HostContentSettingsMap::ProviderType provider_type;
+  switch (test_case.default_content_setting_source) {
+    case content_settings::SETTING_SOURCE_POLICY:
+      provider_type = HostContentSettingsMap::POLICY_PROVIDER;
+      break;
+    case content_settings::SETTING_SOURCE_EXTENSION:
+      provider_type = HostContentSettingsMap::CUSTOM_EXTENSION_PROVIDER;
+      break;
+    case content_settings::SETTING_SOURCE_SUPERVISED:
+      provider_type = HostContentSettingsMap::SUPERVISED_PROVIDER;
+      break;
+    case content_settings::SETTING_SOURCE_USER:
+    case content_settings::SETTING_SOURCE_NONE:
+    case content_settings::SETTING_SOURCE_ALLOWLIST:
+    case content_settings::SETTING_SOURCE_INSTALLED_WEBAPP:
+      provider_type = HostContentSettingsMap::DEFAULT_PROVIDER;
+  }
+  content_settings::TestUtils::OverrideProvider(map, std::move(provider),
+                                                provider_type);
+
+  settings_private::SetPrefFromSource(
+      prefs, prefs::kEnableQuietNotificationPermissionUi, test_case.quieter_ui,
+      test_case.quieter_ui_source);
+}
+
+void ValidateManagedPreference(
+    settings_api::PrefObject* pref,
+    const NotificationSettingManagedTestCase& test_case) {
+  if (test_case.expected_controlled_by !=
+      settings_api::ControlledBy::CONTROLLED_BY_NONE) {
+    EXPECT_EQ(pref->controlled_by, test_case.expected_controlled_by);
+  }
+
+  if (test_case.expected_enforcement !=
+      settings_api::Enforcement::ENFORCEMENT_NONE) {
+    EXPECT_EQ(pref->enforcement, test_case.expected_enforcement);
+  }
+
+  if (test_case.expected_recommended_value != kNoRecommendedValue) {
+    EXPECT_EQ(
+        static_cast<NotificationSetting>(pref->recommended_value->GetInt()),
+        test_case.expected_recommended_value);
+  }
+
+  // Ensure user selectable values are as expected. Ordering is enforced here
+  // despite not being required by the SettingsPrivate API.
+  // First convert std::vector<std::unique_ptr<base::value(T)>> to
+  // std::vector<T> for easier comparison.
+  std::vector<NotificationSetting> pref_user_selectable_values;
+  if (pref->user_selectable_values) {
+    for (const auto& value : *pref->user_selectable_values) {
+      pref_user_selectable_values.push_back(
+          static_cast<NotificationSetting>(value->GetInt()));
+    }
+  }
+  EXPECT_EQ(pref_user_selectable_values.size(),
+            test_case.expected_user_selectable_values.size());
+
+  // Avoid crashing the test if the previous check fails.
+  if (pref_user_selectable_values.size() ==
+      test_case.expected_user_selectable_values.size()) {
+    EXPECT_TRUE(std::equal(pref_user_selectable_values.begin(),
+                           pref_user_selectable_values.end(),
+                           test_case.expected_user_selectable_values.begin()));
+  }
+}
+
+}  // namespace
+
+typedef settings_private::GeneratedPrefTestBase GeneratedNotificationPrefTest;
+
+TEST_F(GeneratedNotificationPrefTest, UpdatePreference) {
+  auto pref = std::make_unique<GeneratedNotificationPref>(profile());
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+
+  // Setup a baseline content setting and preference state.
+  map->SetDefaultContentSetting(ContentSettingsType::NOTIFICATIONS,
+                                ContentSetting::CONTENT_SETTING_ASK);
+  prefs()->SetUserPref(prefs::kEnableQuietNotificationPermissionUi,
+                       std::make_unique<base::Value>(false));
+
+  // Check that each of the three possible preference values sets the correct
+  // state and is correctly reflected in a newly returned PrefObject.
+  ValidateGeneratedPrefSetting(map, prefs(), pref.get(),
+                               NotificationSetting::BLOCK,
+                               ContentSetting::CONTENT_SETTING_BLOCK, false);
+  ValidateGeneratedPrefSetting(map, prefs(), pref.get(),
+                               NotificationSetting::ASK,
+                               ContentSetting::CONTENT_SETTING_ASK, false);
+  ValidateGeneratedPrefSetting(map, prefs(), pref.get(),
+                               NotificationSetting::QUIETER_MESSAGING,
+                               ContentSetting::CONTENT_SETTING_ASK, true);
+  // Setting notification content setting to
+  // |ContentSetting::CONTENT_SETTING_BLOCK| should not change the quieter UI
+  // pref.
+  ValidateGeneratedPrefSetting(map, prefs(), pref.get(),
+                               NotificationSetting::BLOCK,
+                               ContentSetting::CONTENT_SETTING_BLOCK, true);
+}
+
+TEST_F(GeneratedNotificationPrefTest, UpdatePreferenceInvalidAction) {
+  auto pref = std::make_unique<GeneratedNotificationPref>(profile());
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+
+  // Setup a baseline content setting and preference state.
+  map->SetDefaultContentSetting(ContentSettingsType::NOTIFICATIONS,
+                                ContentSetting::CONTENT_SETTING_BLOCK);
+  prefs()->SetUserPref(prefs::kEnableQuietNotificationPermissionUi,
+                       std::make_unique<base::Value>(false));
+
+  // Confirm that a type mismatch is reported as such.
+  EXPECT_EQ(pref->SetPref(std::make_unique<base::Value>(true).get()),
+            settings_private::SetPrefResult::PREF_TYPE_MISMATCH);
+  // Check a numerical value outside of the acceptable range.
+  EXPECT_EQ(pref->SetPref(std::make_unique<base::Value>(
+                              static_cast<int>(NotificationSetting::BLOCK) + 1)
+                              .get()),
+            settings_private::SetPrefResult::PREF_TYPE_MISMATCH);
+
+  // Make quieter UI preference not user modifiable.
+  settings_private::SetPrefFromSource(
+      prefs(), prefs::kEnableQuietNotificationPermissionUi,
+      settings_private::PrefSetting::kEnforcedOff,
+      settings_private::PrefSource::kDevicePolicy);
+
+  // Confirm that quieter UI preference isn't modified when it's enforced.
+  EXPECT_EQ(pref->SetPref(
+                std::make_unique<base::Value>(
+                    static_cast<int>(NotificationSetting::QUIETER_MESSAGING))
+                    .get()),
+            settings_private::SetPrefResult::PREF_NOT_MODIFIABLE);
+
+  // Confirm the neither value was modified.
+  EXPECT_EQ(map->GetDefaultContentSetting(ContentSettingsType::NOTIFICATIONS,
+                                          nullptr),
+            ContentSetting::CONTENT_SETTING_BLOCK);
+  EXPECT_FALSE(prefs()
+                   ->FindPreference(prefs::kEnableQuietNotificationPermissionUi)
+                   ->GetValue()
+                   ->GetBool());
+
+  // Make notification content setting not user modifiable.
+  auto provider = std::make_unique<content_settings::MockProvider>();
+  provider->SetWebsiteSetting(
+      ContentSettingsPattern::Wildcard(), ContentSettingsPattern::Wildcard(),
+      ContentSettingsType::NOTIFICATIONS, std::string(),
+      std::make_unique<base::Value>(ContentSetting::CONTENT_SETTING_ASK));
+
+  content_settings::TestUtils::OverrideProvider(
+      map, std::move(provider), HostContentSettingsMap::POLICY_PROVIDER);
+
+  // Confirm that notification content setting isn't modified when it's
+  // enforced.
+  EXPECT_EQ(pref->SetPref(
+                std::make_unique<base::Value>(
+                    static_cast<int>(NotificationSetting::QUIETER_MESSAGING))
+                    .get()),
+            settings_private::SetPrefResult::PREF_NOT_MODIFIABLE);
+
+  // Confirm the neither value was modified.
+  EXPECT_EQ(map->GetDefaultContentSetting(ContentSettingsType::NOTIFICATIONS,
+                                          nullptr),
+            ContentSetting::CONTENT_SETTING_ASK);
+  EXPECT_FALSE(prefs()
+                   ->FindPreference(prefs::kEnableQuietNotificationPermissionUi)
+                   ->GetValue()
+                   ->GetBool());
+
+  // Confirm that notification content setting isn't modified when it's
+  // enforced.
+  EXPECT_EQ(pref->SetPref(std::make_unique<base::Value>(
+                              static_cast<int>(NotificationSetting::BLOCK))
+                              .get()),
+            settings_private::SetPrefResult::PREF_NOT_MODIFIABLE);
+
+  // Confirm the neither value was modified.
+  EXPECT_EQ(map->GetDefaultContentSetting(ContentSettingsType::NOTIFICATIONS,
+                                          nullptr),
+            ContentSetting::CONTENT_SETTING_ASK);
+  EXPECT_FALSE(prefs()
+                   ->FindPreference(prefs::kEnableQuietNotificationPermissionUi)
+                   ->GetValue()
+                   ->GetBool());
+}
+
+TEST_F(GeneratedNotificationPrefTest, NotifyPrefUpdates) {
+  // Update source Notification preferences and ensure an observer is fired.
+  auto pref = std::make_unique<GeneratedNotificationPref>(profile());
+
+  settings_private::TestGeneratedPrefObserver test_observer;
+  pref->AddObserver(&test_observer);
+
+  prefs()->SetUserPref(prefs::kEnableQuietNotificationPermissionUi,
+                       std::make_unique<base::Value>(true));
+  EXPECT_EQ(test_observer.GetUpdatedPrefName(), kGeneratedNotificationPref);
+  test_observer.Reset();
+
+  HostContentSettingsMap* map =
+      HostContentSettingsMapFactory::GetForProfile(profile());
+  map->SetDefaultContentSetting(ContentSettingsType::NOTIFICATIONS,
+                                ContentSetting::CONTENT_SETTING_BLOCK);
+
+  EXPECT_EQ(test_observer.GetUpdatedPrefName(), kGeneratedNotificationPref);
+}
+
+TEST_F(GeneratedNotificationPrefTest, ManagedState) {
+  for (const auto& test_case : managed_test_cases) {
+    TestingProfile profile;
+    HostContentSettingsMap* map =
+        HostContentSettingsMapFactory::GetForProfile(&profile);
+
+    testing::Message scope_message;
+    scope_message << "Content Setting:" << test_case.default_content_setting
+                  << " Quieter UI:" << static_cast<int>(test_case.quieter_ui);
+    SCOPED_TRACE(scope_message);
+    SetupManagedTestConditions(map, profile.GetTestingPrefService(), test_case);
+    auto pref =
+        std::make_unique<content_settings::GeneratedNotificationPref>(&profile);
+    auto pref_object = pref->GetPrefObject();
+    ValidateManagedPreference(pref_object.get(), test_case);
+  }
+}
+
+}  // namespace content_settings
diff --git a/chrome/browser/extensions/api/DEPS b/chrome/browser/extensions/api/DEPS
index 5b31a7ff..9898aa8 100644
--- a/chrome/browser/extensions/api/DEPS
+++ b/chrome/browser/extensions/api/DEPS
@@ -11,6 +11,7 @@
   ".*test.*": [
     "+chrome/browser/ui/views/frame",
     "+components/captive_portal",
+    "+components/web_package/test_support",
   ],
   "tls_socket_unittest\.cc": [
     "+services/network/network_context.h",
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
index 9c5248d..8fef4011 100644
--- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
+++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_browsertest.cc
@@ -27,6 +27,7 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/lock.h"
 #include "base/task/post_task.h"
+#include "base/test/bind_test_util.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/simple_test_clock.h"
 #include "base/threading/thread_restrictions.h"
@@ -54,6 +55,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/proxy_config/proxy_config_dictionary.h"
 #include "components/proxy_config/proxy_config_pref_names.h"
+#include "components/web_package/test_support/web_bundle_builder.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -61,6 +63,7 @@
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/storage_partition.h"
+#include "content/public/common/content_features.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
@@ -104,8 +107,10 @@
 #include "ipc/ipc_message.h"
 #include "net/base/net_errors.h"
 #include "net/dns/mock_host_resolver.h"
+#include "net/http/http_status_code.h"
 #include "net/test/embedded_test_server/default_handlers.h"
 #include "net/test/embedded_test_server/http_request.h"
+#include "net/test/embedded_test_server/http_response.h"
 #include "net/test/spawned_test_server/spawned_test_server.h"
 #include "net/test/test_data_directory.h"
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
@@ -219,10 +224,8 @@
     // Map all hosts to localhost.
     host_resolver()->AddRule("*", "127.0.0.1");
 
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-
-    ruleset_manager_observer_ =
-        std::make_unique<RulesetManagerObserver>(ruleset_manager());
+    CreateTempDir();
+    InitializeRulesetManagerObserver();
   }
 
   void TearDownOnMainThread() override {
@@ -564,6 +567,13 @@
     return rule;
   }
 
+  void CreateTempDir() { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); }
+
+  void InitializeRulesetManagerObserver() {
+    ruleset_manager_observer_ =
+        std::make_unique<RulesetManagerObserver>(ruleset_manager());
+  }
+
  private:
   // Handler to monitor the requests which reach the EmbeddedTestServer. This
   // will be run on the EmbeddedTestServer's IO thread.
@@ -4522,6 +4532,298 @@
             {"block_none.com", kNone}});
 }
 
+class DeclarativeNetRequestSubresourceWebBundlesBrowserTest
+    : public DeclarativeNetRequestBrowserTest {
+ public:
+  DeclarativeNetRequestSubresourceWebBundlesBrowserTest() = default;
+  void SetUp() override {
+    feature_list_.InitWithFeatures({features::kSubresourceWebBundles}, {});
+    DeclarativeNetRequestBrowserTest::SetUp();
+  }
+  void SetUpOnMainThread() override {
+    ExtensionBrowserTest::SetUpOnMainThread();
+    CreateTempDir();
+    InitializeRulesetManagerObserver();
+  }
+
+ protected:
+  bool TryLoadScript(const char* script_src) {
+    content::WebContents* web_contents =
+        browser()->tab_strip_model()->GetActiveWebContents();
+    bool success = false;
+    std::string script = base::StringPrintf(R"(
+      (() => {
+        const script = document.createElement('script');
+        script.addEventListener('load', () => {
+          window.domAutomationController.send(true);
+        });
+        script.addEventListener('error', () => {
+          window.domAutomationController.send(false);
+        });
+        script.src = '%s';
+        document.body.appendChild(script);
+      })();
+                                          )",
+                                            script_src);
+    EXPECT_TRUE(ExecuteScriptAndExtractBool(web_contents->GetMainFrame(),
+                                            script, &success));
+    return success;
+  }
+
+  // Registers a request handler for static content.
+  void RegisterRequestHandler(const std::string& relative_url,
+                              const std::string& content_type,
+                              const std::string& content) {
+    embedded_test_server()->RegisterRequestHandler(base::BindLambdaForTesting(
+        [relative_url, content_type,
+         content](const net::test_server::HttpRequest& request)
+            -> std::unique_ptr<net::test_server::HttpResponse> {
+          if (request.relative_url == relative_url) {
+            auto response =
+                std::make_unique<net::test_server::BasicHttpResponse>();
+            response->set_code(net::HTTP_OK);
+            response->set_content_type(content_type);
+            response->set_content(content);
+            return std::move(response);
+          }
+          return nullptr;
+        }));
+  }
+
+  // Registers a request handler for web bundle. This method takes a pointer of
+  // the content of the web bundle, because we can't create the content of the
+  // web bundle before starting the server since we need to know the port number
+  // of the test server due to the same-origin restriction (the origin of
+  // subresource which is written in the web bundle must be same as the origin
+  // of the web bundle), and we can't call
+  // EmbeddedTestServer::RegisterRequestHandler() after starting the server.
+  void RegisterWebBundleRequestHandler(const std::string& relative_url,
+                                       const std::string* web_bundle) {
+    embedded_test_server()->RegisterRequestHandler(base::BindLambdaForTesting(
+        [relative_url, web_bundle](const net::test_server::HttpRequest& request)
+            -> std::unique_ptr<net::test_server::HttpResponse> {
+          if (request.relative_url == relative_url) {
+            auto response =
+                std::make_unique<net::test_server::BasicHttpResponse>();
+            response->set_code(net::HTTP_OK);
+            response->set_content_type("application/webbundle");
+            response->set_content(*web_bundle);
+            return std::move(response);
+          }
+          return nullptr;
+        }));
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+// Ensure DeclarativeNetRequest API can block the requests for the subresources
+// inside the web bundle.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest,
+                       RequestCanceled) {
+  TestRule rule = CreateGenericRule();
+  std::vector<TestRule> rules;
+  rule.id = kMinValidID;
+  rule.condition->url_filter = "cancel.js|";
+  rule.condition->resource_types = std::vector<std::string>({"script"});
+  rule.priority = 1;
+  rules.push_back(rule);
+  ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(rules));
+
+  const char kPageHtml[] = R"(
+        <title>Loaded</title>
+        <body>
+        <script>
+        (() => {
+          const wbn_url =
+              new URL('./web_bundle.wbn', location.href).toString();
+          const pass_js_url = new URL('./pass.js', location.href).toString();
+          const cancel_js_url =
+              new URL('./cancel.js', location.href).toString();
+          const link = document.createElement('link');
+          link.rel = 'webbundle';
+          link.href = wbn_url;
+          link.resources = pass_js_url + ' ' + cancel_js_url;
+          document.body.appendChild(link);
+        })();
+        </script>
+        </body>
+      )";
+
+  std::string web_bundle;
+  RegisterWebBundleRequestHandler("/web_bundle.wbn", &web_bundle);
+  RegisterRequestHandler("/test.html", "text/html", kPageHtml);
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  // Create a web bundle.
+  std::string pass_js_url_str =
+      embedded_test_server()->GetURL("/pass.js").spec();
+  std::string cancel_js_url_str =
+      embedded_test_server()->GetURL("/cancel.js").spec();
+  // Currently the web bundle format requires a valid GURL for the fallback URL
+  // of a web bundle. So we use |pass_js_url_str| for the fallback URL.
+  // TODO(crbug.com/966753): Stop using |pass_js_url_str| when
+  // https://github.com/WICG/webpackage/issues/590 is resolved.
+  web_package::test::WebBundleBuilder builder(pass_js_url_str, "");
+  auto pass_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'script loaded';");
+  auto cancel_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}}, "");
+  builder.AddIndexEntry(pass_js_url_str, "", {pass_js_location});
+  builder.AddIndexEntry(cancel_js_url_str, "", {cancel_js_location});
+  std::vector<uint8_t> bundle = builder.CreateBundle();
+  web_bundle = std::string(bundle.begin(), bundle.end());
+
+  GURL page_url = embedded_test_server()->GetURL("/test.html");
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ui_test_utils::NavigateToURL(browser(), page_url);
+  EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
+
+  base::string16 expected_title = base::ASCIIToUTF16("script loaded");
+  content::TitleWatcher title_watcher(web_contents, expected_title);
+  EXPECT_TRUE(TryLoadScript("pass.js"));
+  // Check that the script in the web bundle is correctly loaded even when the
+  // extension with blocking handler intercepted the request.
+  EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+
+  EXPECT_FALSE(TryLoadScript("cancel.js"));
+}
+
+// Ensure DeclarativeNetRequest API can redirect the requests for the
+// subresources inside the web bundle.
+IN_PROC_BROWSER_TEST_P(DeclarativeNetRequestSubresourceWebBundlesBrowserTest,
+                       RequestRedirected) {
+  const char kPageHtml[] = R"(
+        <title>Loaded</title>
+        <body>
+        <script>
+        (() => {
+          const wbn_url = new URL('./web_bundle.wbn', location.href).toString();
+          const redirect_js_url =
+              new URL('./redirect.js', location.href).toString();
+          const redirected_js_url =
+              new URL('./redirected.js', location.href).toString();
+          const redirect_to_unlisted_js_url =
+              new URL('./redirect_to_unlisted.js', location.href).toString();
+          const redirect_to_server =
+              new URL('./redirect_to_server.js', location.href).toString();
+          const link = document.createElement('link');
+          link.rel = 'webbundle';
+          link.href = wbn_url;
+          link.resources = redirect_js_url + ' ' + redirected_js_url + ' ' +
+                           redirect_to_unlisted_js_url + ' ' +
+                           redirect_to_server;
+          document.body.appendChild(link);
+        })();
+        </script>
+        </body>
+      )";
+
+  std::string web_bundle;
+  RegisterWebBundleRequestHandler("/web_bundle.wbn", &web_bundle);
+  RegisterRequestHandler("/test.html", "text/html", kPageHtml);
+  RegisterRequestHandler("/redirect_to_server.js", "application/javascript",
+                         "document.title = 'redirect_to_server';");
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  // Create a web bundle.
+  std::string redirect_js_url_str =
+      embedded_test_server()->GetURL("/redirect.js").spec();
+  std::string redirected_js_url_str =
+      embedded_test_server()->GetURL("/redirected.js").spec();
+  std::string redirect_to_unlisted_js_url_str =
+      embedded_test_server()->GetURL("/redirect_to_unlisted.js").spec();
+  std::string redirected_to_unlisted_js_url_str =
+      embedded_test_server()->GetURL("/redirected_to_unlisted.js").spec();
+  std::string redirect_to_server_js_url_str =
+      embedded_test_server()->GetURL("/redirect_to_server.js").spec();
+  // Currently the web bundle format requires a valid GURL for the fallback URL
+  // of a web bundle. So we use |redirect_js_url_str| for the fallback URL.
+  // TODO(crbug.com/966753): Stop using |redirect_js_url_str| when
+  // https://github.com/WICG/webpackage/issues/590 is resolved.
+  web_package::test::WebBundleBuilder builder(redirect_js_url_str, "");
+  auto redirect_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'redirect';");
+  auto redirected_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'redirected';");
+  auto redirect_to_unlisted_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'redirect_to_unlisted';");
+  auto redirected_to_unlisted_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'redirected_to_unlisted';");
+  auto redirect_to_server_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'redirect_to_server';");
+  builder.AddIndexEntry(redirect_js_url_str, "", {redirect_js_location});
+  builder.AddIndexEntry(redirected_js_url_str, "", {redirected_js_location});
+  builder.AddIndexEntry(redirect_to_unlisted_js_url_str, "",
+                        {redirect_to_unlisted_location});
+  builder.AddIndexEntry(redirected_to_unlisted_js_url_str, "",
+                        {redirected_to_unlisted_js_location});
+  builder.AddIndexEntry(redirect_to_server_js_url_str, "",
+                        {redirect_to_server_js_location});
+  std::vector<uint8_t> bundle = builder.CreateBundle();
+  web_bundle = std::string(bundle.begin(), bundle.end());
+
+  struct {
+    std::string url_filter;
+    std::string redirect_url_path;
+  } rules_data[] = {
+      {"redirect.js|", "/redirected.js"},
+      {"redirect_to_unlisted.js|", "/redirected_to_unlisted.js"},
+      {"redirect_to_server.js|", "/redirected_to_server.js"},
+  };
+
+  std::vector<TestRule> rules;
+  int rule_id = kMinValidID;
+  int rule_priority = 1;
+  for (const auto& rule_data : rules_data) {
+    TestRule rule = CreateGenericRule();
+    rule.id = rule_id++;
+    rule.priority = rule_priority++;
+    rule.condition->url_filter = rule_data.url_filter;
+    rule.condition->resource_types = std::vector<std::string>({"script"});
+    rule.action->type = "redirect";
+    rule.action->redirect.emplace();
+    rule.action->redirect->url =
+        embedded_test_server()->GetURL(rule_data.redirect_url_path).spec();
+    rules.push_back(rule);
+  }
+  ASSERT_NO_FATAL_FAILURE(LoadExtensionWithRules(
+      rules, "test_extension", {URLPattern::kAllUrlsPattern}));
+
+  GURL page_url = embedded_test_server()->GetURL("/test.html");
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ui_test_utils::NavigateToURL(browser(), page_url);
+  EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
+  {
+    base::string16 expected_title = base::ASCIIToUTF16("redirected");
+    content::TitleWatcher title_watcher(web_contents, expected_title);
+    EXPECT_TRUE(TryLoadScript("redirect.js"));
+    EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+  }
+  {
+    // In the current implementation, extensions can redirect the request to
+    // the other resource in the web bundle even if the resource is not listed
+    // in the resources attribute.
+    base::string16 expected_title =
+        base::ASCIIToUTF16("redirected_to_unlisted");
+    content::TitleWatcher title_watcher(web_contents, expected_title);
+    EXPECT_TRUE(TryLoadScript("redirect_to_unlisted.js"));
+    EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+  }
+  // In the current implementation, extensions can't redirect the request to
+  // outside the web bundle.
+  EXPECT_FALSE(TryLoadScript("redirect_to_server.js"));
+}
+
 INSTANTIATE_TEST_SUITE_P(All,
                          DeclarativeNetRequestBrowserTest,
                          ::testing::Values(ExtensionLoadType::PACKED,
@@ -4535,6 +4837,10 @@
                          DeclarativeNetRequestResourceTypeBrowserTest,
                          ::testing::Values(ExtensionLoadType::PACKED,
                                            ExtensionLoadType::UNPACKED));
+INSTANTIATE_TEST_SUITE_P(All,
+                         DeclarativeNetRequestSubresourceWebBundlesBrowserTest,
+                         ::testing::Values(ExtensionLoadType::PACKED,
+                                           ExtensionLoadType::UNPACKED));
 
 INSTANTIATE_TEST_SUITE_P(All,
                          DeclarativeNetRequestBrowserTest_Packed,
diff --git a/chrome/browser/extensions/api/settings_private/generated_pref.cc b/chrome/browser/extensions/api/settings_private/generated_pref.cc
index 4fd337bf..4b2a667 100644
--- a/chrome/browser/extensions/api/settings_private/generated_pref.cc
+++ b/chrome/browser/extensions/api/settings_private/generated_pref.cc
@@ -55,5 +55,39 @@
   NOTREACHED();
 }
 
+/* static */
+void GeneratedPref::ApplyControlledByFromContentSettingSource(
+    api::settings_private::PrefObject* pref_object,
+    content_settings::SettingSource setting_source) {
+  switch (setting_source) {
+    case content_settings::SETTING_SOURCE_POLICY:
+      pref_object->controlled_by =
+          settings_api::ControlledBy::CONTROLLED_BY_DEVICE_POLICY;
+      break;
+    case content_settings::SETTING_SOURCE_EXTENSION:
+      pref_object->controlled_by =
+          settings_api::ControlledBy::CONTROLLED_BY_EXTENSION;
+      break;
+    case content_settings::SETTING_SOURCE_SUPERVISED:
+      pref_object->controlled_by =
+          settings_api::ControlledBy::CONTROLLED_BY_CHILD_RESTRICTION;
+      break;
+    default:
+      NOTREACHED();
+  }
+}
+
+/* static */
+void GeneratedPref::AddUserSelectableValue(
+    settings_api::PrefObject* pref_object,
+    int value) {
+  if (!pref_object->user_selectable_values) {
+    pref_object->user_selectable_values =
+        std::make_unique<std::vector<std::unique_ptr<base::Value>>>();
+  }
+  pref_object->user_selectable_values->push_back(
+      std::make_unique<base::Value>(static_cast<int>(value)));
+}
+
 }  // namespace settings_private
 }  // namespace extensions
diff --git a/chrome/browser/extensions/api/settings_private/generated_pref.h b/chrome/browser/extensions/api/settings_private/generated_pref.h
index 0026476..6914046 100644
--- a/chrome/browser/extensions/api/settings_private/generated_pref.h
+++ b/chrome/browser/extensions/api/settings_private/generated_pref.h
@@ -10,6 +10,7 @@
 #include "base/macros.h"
 #include "base/observer_list.h"
 #include "chrome/browser/extensions/api/settings_private/prefs_util_enums.h"
+#include "components/content_settings/core/common/content_settings.h"
 #include "components/prefs/pref_service.h"
 
 namespace base {
@@ -69,6 +70,19 @@
       api::settings_private::PrefObject* pref_object,
       const PrefService::Preference* pref);
 
+  // Sets controlled_by for |pref_object| base on provided |setting_source|
+  // for a limited subset of controlled_by sources relevant for content
+  // settings.
+  static void ApplyControlledByFromContentSettingSource(
+      api::settings_private::PrefObject* pref_object,
+      content_settings::SettingSource setting_source);
+
+  // Adds the provided |value| to the user selectable values of |pref_object|,
+  // creating the base::Value vector if required.
+  static void AddUserSelectableValue(
+      extensions::api::settings_private::PrefObject* pref_object,
+      int value);
+
  private:
   base::ObserverList<Observer>::Unchecked observers_;
 
diff --git a/chrome/browser/extensions/api/settings_private/generated_pref_test_base.cc b/chrome/browser/extensions/api/settings_private/generated_pref_test_base.cc
index 505519b..29cb1a55 100644
--- a/chrome/browser/extensions/api/settings_private/generated_pref_test_base.cc
+++ b/chrome/browser/extensions/api/settings_private/generated_pref_test_base.cc
@@ -7,6 +7,27 @@
 namespace extensions {
 namespace settings_private {
 
+void SetPrefFromSource(sync_preferences::TestingPrefServiceSyncable* prefs,
+                       const std::string& pref_name,
+                       settings_private::PrefSetting pref_setting,
+                       settings_private::PrefSource source) {
+  if (pref_setting == settings_private::PrefSetting::kNotSet) {
+    return;
+  }
+  auto pref_value = std::make_unique<base::Value>(
+      pref_setting == settings_private::PrefSetting::kRecommendedOn ||
+      pref_setting == settings_private::PrefSetting::kEnforcedOn);
+  if (source == settings_private::PrefSource::kExtension) {
+    prefs->SetExtensionPref(pref_name, std::move(pref_value));
+  } else if (source == settings_private::PrefSource::kDevicePolicy) {
+    prefs->SetManagedPref(pref_name, std::move(pref_value));
+  } else if (source == settings_private::PrefSource::kRecommended) {
+    prefs->SetRecommendedPref(pref_name, std::move(pref_value));
+  } else {
+    NOTREACHED();
+  }
+}
+
 void TestGeneratedPrefObserver::OnGeneratedPrefChanged(
     const std::string& pref_name) {
   updated_pref_name_ = pref_name;
diff --git a/chrome/browser/extensions/api/settings_private/generated_pref_test_base.h b/chrome/browser/extensions/api/settings_private/generated_pref_test_base.h
index 7036ad4..22fa6f1 100644
--- a/chrome/browser/extensions/api/settings_private/generated_pref_test_base.h
+++ b/chrome/browser/extensions/api/settings_private/generated_pref_test_base.h
@@ -8,6 +8,7 @@
 #include "chrome/browser/extensions/api/settings_private/generated_pref.h"
 #include "chrome/common/extensions/api/settings_private.h"
 #include "chrome/test/base/testing_profile.h"
+#include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -36,6 +37,13 @@
   kNone,
 };
 
+// Sets |pref_name| to |pref_setting|, using the appropriate store in |prefs|
+// for |source|.
+void SetPrefFromSource(sync_preferences::TestingPrefServiceSyncable* prefs,
+                       const std::string& pref_name,
+                       settings_private::PrefSetting pref_setting,
+                       settings_private::PrefSource source);
+
 class TestGeneratedPrefObserver : public GeneratedPref::Observer {
  public:
   void OnGeneratedPrefChanged(const std::string& pref_name) override;
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index 8709d516..b84b9b5 100644
--- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -19,6 +19,7 @@
 #include "base/task/post_task.h"
 #include "base/test/bind_test_util.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/time/time.h"
 #include "base/time/time_override.h"
 #include "base/values.h"
@@ -65,6 +66,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/proxy_config/proxy_config_dictionary.h"
 #include "components/proxy_config/proxy_config_pref_names.h"
+#include "components/web_package/test_support/web_bundle_builder.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/navigation_controller.h"
@@ -78,6 +80,7 @@
 #include "content/public/browser/render_widget_host.h"
 #include "content/public/browser/storage_partition.h"
 #include "content/public/browser/web_contents.h"
+#include "content/public/common/content_features.h"
 #include "content/public/common/page_type.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
@@ -3126,6 +3129,414 @@
   EXPECT_EQ(final_url, web_contents->GetLastCommittedURL());
 }
 
+class SubresourceWebBundlesWebRequestApiTest : public ExtensionApiTest {
+ public:
+  void SetUp() override {
+    feature_list_.InitWithFeatures({features::kSubresourceWebBundles}, {});
+    ExtensionApiTest::SetUp();
+  }
+
+ protected:
+  bool TryLoadScript(const char* script_src) {
+    content::WebContents* web_contents =
+        browser()->tab_strip_model()->GetActiveWebContents();
+    bool success = false;
+    std::string script = base::StringPrintf(R"(
+          (() => {
+            const script = document.createElement('script');
+            script.addEventListener('load', () => {
+              window.domAutomationController.send(true);
+            });
+            script.addEventListener('error', () => {
+              window.domAutomationController.send(false);
+            });
+            script.src = '%s';
+            document.body.appendChild(script);
+          })();
+        )",
+                                            script_src);
+    EXPECT_TRUE(ExecuteScriptAndExtractBool(web_contents->GetMainFrame(),
+                                            script, &success));
+    return success;
+  }
+
+  // Registers a request handler for static content.
+  void RegisterRequestHandler(const std::string& relative_url,
+                              const std::string& content_type,
+                              const std::string& content) {
+    embedded_test_server()->RegisterRequestHandler(base::BindLambdaForTesting(
+        [relative_url, content_type,
+         content](const net::test_server::HttpRequest& request)
+            -> std::unique_ptr<net::test_server::HttpResponse> {
+          if (request.relative_url == relative_url) {
+            auto response =
+                std::make_unique<net::test_server::BasicHttpResponse>();
+            response->set_code(net::HTTP_OK);
+            response->set_content_type(content_type);
+            response->set_content(content);
+            return std::move(response);
+          }
+          return nullptr;
+        }));
+  }
+
+  // Registers a request handler for web bundle. This method takes a pointer of
+  // the content of the web bundle, because we can't create the content of the
+  // web bundle before starting the server since we need to know the port number
+  // of the test server due to the same-origin restriction (the origin of
+  // subresource which is written in the web bundle must be same as the origin
+  // of the web bundle), and we can't call
+  // EmbeddedTestServer::RegisterRequestHandler() after starting the server.
+  void RegisterWebBundleRequestHandler(const std::string& relative_url,
+                                       const std::string* web_bundle) {
+    embedded_test_server()->RegisterRequestHandler(base::BindLambdaForTesting(
+        [relative_url, web_bundle](const net::test_server::HttpRequest& request)
+            -> std::unique_ptr<net::test_server::HttpResponse> {
+          if (request.relative_url == relative_url) {
+            auto response =
+                std::make_unique<net::test_server::BasicHttpResponse>();
+            response->set_code(net::HTTP_OK);
+            response->set_content_type("application/webbundle");
+            response->set_content(*web_bundle);
+            return std::move(response);
+          }
+          return nullptr;
+        }));
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+// Ensure web request listeners can intercept requests for a web bundle and its
+// subresources.
+IN_PROC_BROWSER_TEST_F(SubresourceWebBundlesWebRequestApiTest,
+                       RequestIntercepted) {
+  // Create an extension that intercepts requests.
+  TestExtensionDir test_dir;
+  test_dir.WriteManifest(R"({
+        "name": "Web Request Subresource Web Bundles Test",
+        "manifest_version": 2,
+        "version": "0.1",
+        "background": { "scripts": ["background.js"] },
+        "permissions": ["<all_urls>", "webRequest"]
+      })");
+  test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), R"(
+        window.numMainResourceRequests = 0;
+        window.numWebBundleRequests = 0;
+        window.numScriptRequests = 0;
+        chrome.webRequest.onBeforeRequest.addListener(function(details) {
+          if (details.url.includes('test.html'))
+            window.numMainResourceRequests++;
+          else if (details.url.includes('web_bundle.wbn'))
+            window.numWebBundleRequests++;
+          else if (details.url.includes('test.js'))
+            window.numScriptRequests++;
+        }, {urls: ['<all_urls>']}, []);
+
+        chrome.test.sendMessage('ready');
+      )");
+  const Extension* extension = nullptr;
+  {
+    ExtensionTestMessageListener listener("ready", false);
+    extension = LoadExtension(test_dir.UnpackedPath());
+    ASSERT_TRUE(extension);
+    EXPECT_TRUE(listener.WaitUntilSatisfied());
+  }
+
+  const char kPageHtml[] = R"(
+        <title>Loaded</title>
+        <body>
+        <script>
+          (() => {
+            const wbn_url =
+                new URL('./web_bundle.wbn', location.href).toString();
+            const script_url = new URL('./test.js', location.href).toString();
+            const link = document.createElement('link');
+            link.rel = 'webbundle';
+            link.href = wbn_url;
+            link.resources = script_url;
+            document.body.appendChild(link);
+            const script = document.createElement('script');
+            script.src = script_url;
+            document.body.appendChild(script);
+          })();
+        </script>
+        </body>
+      )";
+  std::string web_bundle;
+  RegisterWebBundleRequestHandler("/web_bundle.wbn", &web_bundle);
+  RegisterRequestHandler("/test.html", "text/html", kPageHtml);
+  ASSERT_TRUE(StartEmbeddedTestServer());
+
+  // Create a web bundle.
+  std::string script_url_str =
+      embedded_test_server()->GetURL("/test.js").spec();
+  // Currently the web bundle format requires a valid GURL for the fallback URL
+  // of a web bundle. So we use |script_url_str| for the fallback URL.
+  // TODO(crbug.com/966753): Stop using |script_url_str| when
+  // https://github.com/WICG/webpackage/issues/590 is resolved.
+  web_package::test::WebBundleBuilder builder(script_url_str, "");
+  auto location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'Done';");
+  builder.AddIndexEntry(script_url_str, "", {location});
+  std::vector<uint8_t> bundle = builder.CreateBundle();
+  web_bundle = std::string(bundle.begin(), bundle.end());
+
+  GURL page_url = embedded_test_server()->GetURL("/test.html");
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  base::string16 expected_title = base::ASCIIToUTF16("Done");
+  content::TitleWatcher title_watcher(web_contents, expected_title);
+  ui_test_utils::NavigateToURL(browser(), page_url);
+  EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
+  // Check that the script in the web bundle is correctly loaded even when the
+  // extension intercepted the request.
+  EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+
+  EXPECT_EQ(1, GetCountFromBackgroundPage(extension, profile(),
+                                          "window.numMainResourceRequests"));
+  EXPECT_EQ(1, GetCountFromBackgroundPage(extension, profile(),
+                                          "window.numWebBundleRequests"));
+  EXPECT_EQ(1, GetCountFromBackgroundPage(extension, profile(),
+                                          "window.numScriptRequests"));
+}
+
+// Ensure web request API can block the requests for the subresources inside the
+// web bundle.
+IN_PROC_BROWSER_TEST_F(SubresourceWebBundlesWebRequestApiTest,
+                       RequestCanceled) {
+  // Create an extension that blocks a bundle subresource request.
+  TestExtensionDir test_dir;
+  test_dir.WriteManifest(R"({
+        "name": "Web Request Subresource Web Bundles Test",
+        "manifest_version": 2,
+        "version": "0.1",
+        "background": { "scripts": ["background.js"] },
+        "permissions": ["<all_urls>", "webRequest", "webRequestBlocking"]
+      })");
+  test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), R"(
+        window.numPassScriptRequests = 0;
+        window.numCancelScriptRequests = 0;
+        chrome.webRequest.onBeforeRequest.addListener(function(details) {
+          if (details.url.includes('pass.js')) {
+            window.numPassScriptRequests++;
+            return {cancel: false};
+          } else if (details.url.includes('cancel.js')) {
+            window.numCancelScriptRequests++;
+            return {cancel: true};
+          }
+        }, {urls: ['<all_urls>']}, ['blocking']);
+
+        chrome.test.sendMessage('ready');
+      )");
+  const Extension* extension = nullptr;
+  {
+    ExtensionTestMessageListener listener("ready", false);
+    extension = LoadExtension(test_dir.UnpackedPath());
+    ASSERT_TRUE(extension);
+    EXPECT_TRUE(listener.WaitUntilSatisfied());
+  }
+  const char kPageHtml[] = R"(
+        <title>Loaded</title>
+        <body>
+        <script>
+        (() => {
+          const wbn_url = new URL('./web_bundle.wbn', location.href).toString();
+          const pass_js_url = new URL('./pass.js', location.href).toString();
+          const cancel_js_url =
+              new URL('./cancel.js', location.href).toString();
+          const link = document.createElement('link');
+          link.rel = 'webbundle';
+          link.href = wbn_url;
+          link.resources = pass_js_url + ' ' + cancel_js_url;
+          document.body.appendChild(link);
+        })();
+        </script>
+        </body>
+      )";
+
+  std::string web_bundle;
+  RegisterWebBundleRequestHandler("/web_bundle.wbn", &web_bundle);
+  RegisterRequestHandler("/test.html", "text/html", kPageHtml);
+  ASSERT_TRUE(StartEmbeddedTestServer());
+
+  // Create a web bundle.
+  std::string pass_js_url_str =
+      embedded_test_server()->GetURL("/pass.js").spec();
+  std::string cancel_js_url_str =
+      embedded_test_server()->GetURL("/cancel.js").spec();
+  web_package::test::WebBundleBuilder builder(pass_js_url_str, "");
+  auto pass_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'script loaded';");
+  auto cancel_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}}, "");
+  builder.AddIndexEntry(pass_js_url_str, "", {pass_js_location});
+  builder.AddIndexEntry(cancel_js_url_str, "", {cancel_js_location});
+  std::vector<uint8_t> bundle = builder.CreateBundle();
+  web_bundle = std::string(bundle.begin(), bundle.end());
+
+  GURL page_url = embedded_test_server()->GetURL("/test.html");
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ui_test_utils::NavigateToURL(browser(), page_url);
+  EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
+
+  base::string16 expected_title = base::ASCIIToUTF16("script loaded");
+  content::TitleWatcher title_watcher(web_contents, expected_title);
+  EXPECT_TRUE(TryLoadScript("pass.js"));
+  // Check that the script in the web bundle is correctly loaded even when the
+  // extension with blocking handler intercepted the request.
+  EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+
+  EXPECT_FALSE(TryLoadScript("cancel.js"));
+
+  EXPECT_EQ(1, GetCountFromBackgroundPage(extension, profile(),
+                                          "window.numPassScriptRequests"));
+  EXPECT_EQ(1, GetCountFromBackgroundPage(extension, profile(),
+                                          "window.numCancelScriptRequests"));
+}
+
+// Ensure web request API can redirect the requests for the subresources inside
+// the web bundle.
+IN_PROC_BROWSER_TEST_F(SubresourceWebBundlesWebRequestApiTest,
+                       RequestRedirected) {
+  // Create an extension that redirects a bundle subresource request.
+  TestExtensionDir test_dir;
+  test_dir.WriteManifest(R"({
+        "name": "Web Request Subresource Web Bundles Test",
+        "manifest_version": 2,
+        "version": "0.1",
+        "background": { "scripts": ["background.js"] },
+        "permissions": ["<all_urls>", "webRequest", "webRequestBlocking"]
+      })");
+  test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), R"(
+        chrome.webRequest.onBeforeRequest.addListener(function(details) {
+          if (details.url.includes('redirect.js')) {
+            const redirectUrl =
+                details.url.replace('redirect.js', 'redirected.js');
+            return {redirectUrl: redirectUrl};
+          } else if (details.url.includes('redirect_to_unlisted.js')) {
+            const redirectUrl =
+                details.url.replace('redirect_to_unlisted.js',
+                                    'redirected_to_unlisted.js');
+            return {redirectUrl: redirectUrl};
+          } else if (details.url.includes('redirect_to_server.js')) {
+            const redirectUrl =
+                details.url.replace('redirect_to_server.js',
+                                    'redirected_to_server.js');
+            return {redirectUrl: redirectUrl};
+          }
+        }, {urls: ['<all_urls>']}, ['blocking']);
+
+        chrome.test.sendMessage('ready');
+      )");
+  const Extension* extension = nullptr;
+  {
+    ExtensionTestMessageListener listener("ready", false);
+    extension = LoadExtension(test_dir.UnpackedPath());
+    ASSERT_TRUE(extension);
+    EXPECT_TRUE(listener.WaitUntilSatisfied());
+  }
+  const char kPageHtml[] = R"(
+        <title>Loaded</title>
+        <body>
+        <script>
+        (() => {
+          const wbn_url = new URL('./web_bundle.wbn', location.href).toString();
+          const redirect_js_url =
+              new URL('./redirect.js', location.href).toString();
+          const redirected_js_url =
+              new URL('./redirected.js', location.href).toString();
+          const redirect_to_unlisted_js_url =
+              new URL('./redirect_to_unlisted.js', location.href).toString();
+          const redirect_to_server =
+              new URL('./redirect_to_server.js', location.href).toString();
+          const link = document.createElement('link');
+          link.rel = 'webbundle';
+          link.href = wbn_url;
+          link.resources = redirect_js_url + ' ' + redirected_js_url + ' ' +
+                           redirect_to_unlisted_js_url + ' ' +
+                           redirect_to_server;
+          document.body.appendChild(link);
+        })();
+        </script>
+        </body>
+      )";
+
+  std::string web_bundle;
+  RegisterWebBundleRequestHandler("/web_bundle.wbn", &web_bundle);
+  RegisterRequestHandler("/test.html", "text/html", kPageHtml);
+  RegisterRequestHandler("/redirect_to_server.js", "application/javascript",
+                         "document.title = 'redirect_to_server';");
+  ASSERT_TRUE(StartEmbeddedTestServer());
+
+  // Create a web bundle.
+  std::string redirect_js_url_str =
+      embedded_test_server()->GetURL("/redirect.js").spec();
+  std::string redirected_js_url_str =
+      embedded_test_server()->GetURL("/redirected.js").spec();
+  std::string redirect_to_unlisted_js_url_str =
+      embedded_test_server()->GetURL("/redirect_to_unlisted.js").spec();
+  std::string redirected_to_unlisted_js_url_str =
+      embedded_test_server()->GetURL("/redirected_to_unlisted.js").spec();
+  std::string redirect_to_server_js_url_str =
+      embedded_test_server()->GetURL("/redirect_to_server.js").spec();
+  web_package::test::WebBundleBuilder builder(redirect_js_url_str, "");
+  auto redirect_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'redirect';");
+  auto redirected_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'redirected';");
+  auto redirect_to_unlisted_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'redirect_to_unlisted';");
+  auto redirected_to_unlisted_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'redirected_to_unlisted';");
+  auto redirect_to_server_js_location = builder.AddResponse(
+      {{":status", "200"}, {"content-type", "application/javascript"}},
+      "document.title = 'redirect_to_server';");
+  builder.AddIndexEntry(redirect_js_url_str, "", {redirect_js_location});
+  builder.AddIndexEntry(redirected_js_url_str, "", {redirected_js_location});
+  builder.AddIndexEntry(redirect_to_unlisted_js_url_str, "",
+                        {redirect_to_unlisted_location});
+  builder.AddIndexEntry(redirected_to_unlisted_js_url_str, "",
+                        {redirected_to_unlisted_js_location});
+  builder.AddIndexEntry(redirect_to_server_js_url_str, "",
+                        {redirect_to_server_js_location});
+  std::vector<uint8_t> bundle = builder.CreateBundle();
+  web_bundle = std::string(bundle.begin(), bundle.end());
+
+  GURL page_url = embedded_test_server()->GetURL("/test.html");
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  ui_test_utils::NavigateToURL(browser(), page_url);
+  EXPECT_EQ(page_url, web_contents->GetLastCommittedURL());
+  {
+    base::string16 expected_title = base::ASCIIToUTF16("redirected");
+    content::TitleWatcher title_watcher(web_contents, expected_title);
+    EXPECT_TRUE(TryLoadScript("redirect.js"));
+    EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+  }
+  {
+    // In the current implementation, extensions can redirect the request to
+    // the other resource in the web bundle even if the resource is not listed
+    // in the resources attribute.
+    base::string16 expected_title =
+        base::ASCIIToUTF16("redirected_to_unlisted");
+    content::TitleWatcher title_watcher(web_contents, expected_title);
+    EXPECT_TRUE(TryLoadScript("redirect_to_unlisted.js"));
+    EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
+  }
+  // In the current implementation, extensions can't redirect the request to
+  // outside the web bundle.
+  EXPECT_FALSE(TryLoadScript("redirect_to_server.js"));
+}
+
 enum class RedirectType {
   kOnBeforeRequest,
   kOnHeadersReceived,
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 7a3218a..638ff49 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -769,6 +769,11 @@
     "expiry_milestone": 89
   },
   {
+    "name": "default-browser-setting",
+    "owners": [ "gambard", "bling-flags" ],
+    "expiry_milestone": 87
+  },
+  {
     "name": "delay-async-script-execution",
     "owners": [ "dom", "chrome-loading@google.com" ],
     "expiry_milestone": 88
diff --git a/chrome/browser/loader/url_loader_factory_proxy_impl.cc b/chrome/browser/loader/url_loader_factory_proxy_impl.cc
new file mode 100644
index 0000000..c332727
--- /dev/null
+++ b/chrome/browser/loader/url_loader_factory_proxy_impl.cc
@@ -0,0 +1,45 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/loader/url_loader_factory_proxy_impl.h"
+
+#include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/render_process_host.h"
+#include "extensions/browser/api/web_request/web_request_api.h"
+#include "extensions/browser/browser_context_keyed_api_factory.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
+
+// static
+void UrlLoaderFactoryProxyImpl::Create(
+    content::RenderFrameHost* frame_host,
+    mojo::PendingReceiver<chrome::mojom::UrlLoaderFactoryProxy> receiver) {
+  mojo::MakeSelfOwnedReceiver(
+      std::make_unique<UrlLoaderFactoryProxyImpl>(frame_host),
+      std::move(receiver));
+}
+
+UrlLoaderFactoryProxyImpl::UrlLoaderFactoryProxyImpl(
+    content::RenderFrameHost* frame_host)
+    : frame_host_(frame_host) {}
+
+UrlLoaderFactoryProxyImpl::~UrlLoaderFactoryProxyImpl() = default;
+
+void UrlLoaderFactoryProxyImpl::GetProxiedURLLoaderFactory(
+    mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory,
+    mojo::PendingReceiver<network::mojom::URLLoaderFactory> proxied_factory) {
+  auto* process = frame_host_->GetProcess();
+  auto* browser_context = process->GetBrowserContext();
+  auto* web_request_api =
+      extensions::BrowserContextKeyedAPIFactory<extensions::WebRequestAPI>::Get(
+          browser_context);
+  DCHECK(web_request_api);
+
+  web_request_api->MaybeProxyURLLoaderFactory(
+      browser_context, frame_host_, process->GetID(),
+      content::ContentBrowserClient::URLLoaderFactoryType::kDocumentSubResource,
+      /*navigation_id=*/base::nullopt, &proxied_factory,
+      /*headber_client=*/nullptr);
+
+  mojo::FusePipes(std::move(proxied_factory), std::move(original_factory));
+}
diff --git a/chrome/browser/loader/url_loader_factory_proxy_impl.h b/chrome/browser/loader/url_loader_factory_proxy_impl.h
new file mode 100644
index 0000000..39966c7
--- /dev/null
+++ b/chrome/browser/loader/url_loader_factory_proxy_impl.h
@@ -0,0 +1,35 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_LOADER_URL_LOADER_FACTORY_PROXY_IMPL_H_
+#define CHROME_BROWSER_LOADER_URL_LOADER_FACTORY_PROXY_IMPL_H_
+
+#include "chrome/common/url_loader_factory_proxy.mojom.h"
+
+namespace content {
+class RenderFrameHost;
+}  // namespace content
+
+// This class is currently used by subresource loading for Web Bundles to proxy
+// requests, so that subresource requests that are served within the renderer
+// process (from a Web Bundle) can still be intercepted by Chrome extensions.
+// This interface is implemented only when ENABLE_EXTENSIONS build flag is set.
+class UrlLoaderFactoryProxyImpl : public chrome::mojom::UrlLoaderFactoryProxy {
+ public:
+  static void Create(
+      content::RenderFrameHost* frame_host,
+      mojo::PendingReceiver<chrome::mojom::UrlLoaderFactoryProxy> receiver);
+
+  explicit UrlLoaderFactoryProxyImpl(content::RenderFrameHost* frame_host);
+  ~UrlLoaderFactoryProxyImpl() override;
+  void GetProxiedURLLoaderFactory(
+      mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory,
+      mojo::PendingReceiver<::network::mojom::URLLoaderFactory> proxied_factory)
+      override;
+
+ private:
+  content::RenderFrameHost* frame_host_;
+};
+
+#endif  // CHROME_BROWSER_LOADER_URL_LOADER_FACTORY_PROXY_IMPL_H_
diff --git a/chrome/browser/nearby_sharing/nearby_share_default_device_name.cc b/chrome/browser/nearby_sharing/nearby_share_default_device_name.cc
index ad4e0275..eb07fc2 100644
--- a/chrome/browser/nearby_sharing/nearby_share_default_device_name.cc
+++ b/chrome/browser/nearby_sharing/nearby_share_default_device_name.cc
@@ -39,12 +39,7 @@
     return base::nullopt;
 
   name = base::UTF16ToUTF8(user->GetDisplayName());
-#elif defined(OS_WIN)
-  // TODO(https://crbug.com/1127603): The non-Chrome OS strategy below caused
-  // Nearby Share service unit tests to crash on Windows trybots when we tried
-  // to integrate this into the Nearby Share service.
-  name = "First Last";
-#else  // !defined(OS_CHROMEOS) && !defined(OS_WIN)
+#else   // !defined(OS_CHROMEOS)
   ProfileAttributesEntry* entry = nullptr;
   if (!g_browser_process->profile_manager()
            ->GetProfileAttributesStorage()
@@ -53,7 +48,7 @@
   }
 
   name = base::UTF16ToUTF8(entry->GetLocalProfileName());
-#endif
+#endif  // defined(OS_CHROMEOS)
 
   return name.empty() ? base::nullopt : base::make_optional(name);
 }
diff --git a/chrome/browser/nearby_sharing/nearby_share_default_device_name_unittest.cc b/chrome/browser/nearby_sharing/nearby_share_default_device_name_unittest.cc
index 6c6d88cd..8744522 100644
--- a/chrome/browser/nearby_sharing/nearby_share_default_device_name_unittest.cc
+++ b/chrome/browser/nearby_sharing/nearby_share_default_device_name_unittest.cc
@@ -83,14 +83,7 @@
   EXPECT_EQ(std::string(kFakeNameFromProfile) + "'s " +
                 base::UTF16ToUTF8(ui::GetChromeOSDeviceName()),
             *device_name);
-#elif defined(OS_WIN)
-  std::string expected_model_name = GetModelNameBlocking();
-  if (expected_model_name.empty()) {
-    EXPECT_TRUE(device_name->rfind("First Last's ", 0) == 0);
-  } else {
-    EXPECT_EQ("First Last's " + expected_model_name, device_name);
-  }
-#else   // !defined(OS_CHROMEOS) && !defined(OS_WIN)
+#else   // !defined(OS_CHROMEOS)
   std::string expected_model_name = GetModelNameBlocking();
   if (expected_model_name.empty()) {
     EXPECT_TRUE(
diff --git a/chrome/browser/paint_preview/BUILD.gn b/chrome/browser/paint_preview/BUILD.gn
index f01324a5..c83f8b3 100644
--- a/chrome/browser/paint_preview/BUILD.gn
+++ b/chrome/browser/paint_preview/BUILD.gn
@@ -22,6 +22,8 @@
   ]
 
   if (is_android) {
+    sources += [ "paint_preview_compositor_utils.cc" ]
+
     deps += [ "//chrome/browser/paint_preview/android:jni_headers" ]
   }
 }
diff --git a/chrome/browser/paint_preview/android/BUILD.gn b/chrome/browser/paint_preview/android/BUILD.gn
index 2c6db38..c2e5c7c 100644
--- a/chrome/browser/paint_preview/android/BUILD.gn
+++ b/chrome/browser/paint_preview/android/BUILD.gn
@@ -6,6 +6,7 @@
 
 generate_jni("jni_headers") {
   sources = [
+    "java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewCompositorUtils.java",
     "java/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewDemoService.java",
     "java/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewDemoServiceFactory.java",
     "java/src/org/chromium/chrome/browser/paint_preview/services/PaintPreviewTabService.java",
@@ -17,6 +18,7 @@
   annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
 
   sources = [
+    "java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewCompositorUtils.java",
     "java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewDemoManager.java",
     "java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java",
     "java/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreviewMetricsHelper.java",
@@ -31,6 +33,7 @@
     ":java_resources",
     "//base:base_java",
     "//base:jni_java",
+    "//chrome/browser/android/lifecycle:java",
     "//chrome/browser/flags:java",
     "//chrome/browser/tab:java",
     "//chrome/browser/tabmodel:java",
diff --git a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewCompositorUtils.java b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewCompositorUtils.java
new file mode 100644
index 0000000..a0504606
--- /dev/null
+++ b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewCompositorUtils.java
@@ -0,0 +1,38 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.paint_preview;
+
+import org.chromium.base.annotations.JNINamespace;
+import org.chromium.base.annotations.NativeMethods;
+
+/**
+ * Utilities for warming up a compositor process for paint previews.
+ */
+@JNINamespace("paint_preview")
+public class PaintPreviewCompositorUtils {
+    /**
+     * Warms up the compositor process.
+     */
+    static void warmupCompositor() {
+        PaintPreviewCompositorUtilsJni.get().warmupCompositor();
+    }
+
+    /**
+     * Stops the warm warm compositor process if one exists.
+     */
+    static boolean stopWarmCompositor() {
+        return PaintPreviewCompositorUtilsJni.get().stopWarmCompositor();
+    }
+
+    @NativeMethods
+    interface Natives {
+        void warmupCompositor();
+        boolean stopWarmCompositor();
+    }
+
+    private PaintPreviewCompositorUtils() {}
+}
+
+
diff --git a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewDemoManager.java b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewDemoManager.java
index 989d99b9..f0265ba5 100644
--- a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewDemoManager.java
+++ b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewDemoManager.java
@@ -74,6 +74,7 @@
     }
 
     void removePaintPreviewDemo() {
+        PaintPreviewCompositorUtils.stopWarmCompositor();
         if (mTab == null || mPlayerManager == null) {
             return;
         }
diff --git a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java
index f50f931..3d609e1 100644
--- a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java
+++ b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/PaintPreviewTabHelper.java
@@ -40,6 +40,7 @@
             return;
         }
 
+        PaintPreviewCompositorUtils.warmupCompositor();
         mPaintPreviewDemoManager.showPaintPreviewDemo();
     }
 
diff --git a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreviewPlayer.java b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreviewPlayer.java
index 019a157..7cfb9bd 100644
--- a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreviewPlayer.java
+++ b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/TabbedPaintPreviewPlayer.java
@@ -154,6 +154,8 @@
         mInitializing = hasCapture;
         mMetricsHelper.recordHadCapture(hasCapture);
         if (!hasCapture) return false;
+
+        PaintPreviewCompositorUtils.warmupCompositor();
         mFirstMeaningfulPaintHappened = false;
 
         mPlayerManager = new PlayerManager(mTab.getUrl(), mTab.getContext(),
@@ -187,6 +189,7 @@
      * nothing if there is no view showing.
      */
     private void removePaintPreview(@ExitCause int exitCause) {
+        PaintPreviewCompositorUtils.stopWarmCompositor();
         mOnDismissed = null;
         mInitializing = false;
         if (mTab == null || mPlayerManager == null) return;
diff --git a/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc b/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc
index b765dd6..2524069 100644
--- a/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc
+++ b/chrome/browser/paint_preview/paint_preview_compositor_browsertest.cc
@@ -18,6 +18,7 @@
 #include "components/paint_preview/browser/paint_preview_base_service_test_factory.h"
 #include "components/paint_preview/browser/paint_preview_compositor_client_impl.h"
 #include "components/paint_preview/browser/paint_preview_compositor_service_impl.h"
+#include "components/paint_preview/browser/warm_compositor.h"
 #include "components/paint_preview/public/paint_preview_compositor_client.h"
 #include "components/paint_preview/public/paint_preview_compositor_service.h"
 #include "components/services/paint_preview_compositor/public/mojom/paint_preview_compositor.mojom.h"
@@ -198,4 +199,28 @@
   EXPECT_FALSE(IsBoundAndConnected(compositor.get()));
 }
 
+IN_PROC_BROWSER_TEST_F(PaintPreviewCompositorBrowserTest, PreWarmCompositor) {
+  // Start with warm compositor.
+  WarmCompositor* warm_compositor = WarmCompositor::GetInstance();
+  warm_compositor->WarmupCompositor();
+  auto compositor_service = ToCompositorServiceImpl(
+      warm_compositor->GetOrStartCompositorService(base::DoNothing()));
+  EXPECT_FALSE(warm_compositor->StopCompositor());
+  EXPECT_NE(compositor_service, nullptr);
+  compositor_service.reset();
+  EXPECT_EQ(compositor_service, nullptr);
+
+  // Start and stop.
+  warm_compositor->WarmupCompositor();
+  EXPECT_TRUE(warm_compositor->StopCompositor());
+
+  // Verify it is still possible to start if the compositor was prematurely
+  // stopped.
+  compositor_service = ToCompositorServiceImpl(
+      warm_compositor->GetOrStartCompositorService(base::DoNothing()));
+  EXPECT_NE(compositor_service, nullptr);
+  compositor_service.reset();
+  EXPECT_EQ(compositor_service, nullptr);
+}
+
 }  // namespace paint_preview
diff --git a/chrome/browser/paint_preview/paint_preview_compositor_utils.cc b/chrome/browser/paint_preview/paint_preview_compositor_utils.cc
new file mode 100644
index 0000000..4ae3f4e
--- /dev/null
+++ b/chrome/browser/paint_preview/paint_preview_compositor_utils.cc
@@ -0,0 +1,18 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/paint_preview/android/jni_headers/PaintPreviewCompositorUtils_jni.h"
+#include "components/paint_preview/browser/warm_compositor.h"
+
+namespace paint_preview {
+
+void JNI_PaintPreviewCompositorUtils_WarmupCompositor(JNIEnv* env) {
+  WarmCompositor::GetInstance()->WarmupCompositor();
+}
+
+jboolean JNI_PaintPreviewCompositorUtils_StopWarmCompositor(JNIEnv* env) {
+  return static_cast<jboolean>(WarmCompositor::GetInstance()->StopCompositor());
+}
+
+}  // namespace paint_preview
diff --git a/chrome/browser/paint_preview/services/paint_preview_tab_service.cc b/chrome/browser/paint_preview/services/paint_preview_tab_service.cc
index a78ee55..e4b4bc8 100644
--- a/chrome/browser/paint_preview/services/paint_preview_tab_service.cc
+++ b/chrome/browser/paint_preview/services/paint_preview_tab_service.cc
@@ -13,6 +13,7 @@
 #include "base/task/post_task.h"
 #include "base/task/task_traits.h"
 #include "components/paint_preview/browser/file_manager.h"
+#include "components/paint_preview/browser/warm_compositor.h"
 #include "ui/gfx/geometry/rect.h"
 
 #if defined(OS_ANDROID)
diff --git a/chrome/browser/password_manager/android/password_accessory_controller_impl.cc b/chrome/browser/password_manager/android/password_accessory_controller_impl.cc
index 21d28c5e..fab7ace 100644
--- a/chrome/browser/password_manager/android/password_accessory_controller_impl.cc
+++ b/chrome/browser/password_manager/android/password_accessory_controller_impl.cc
@@ -14,6 +14,7 @@
 #include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/autofill/manual_filling_controller.h"
 #include "chrome/browser/autofill/manual_filling_utils.h"
@@ -373,12 +374,10 @@
   if (origin.opaque())
     return false;  // Don't proceed for invalid origins.
 
-  const auto& credentials =
-      credential_cache_->GetCredentialStore(origin).GetCredentials();
-  return std::any_of(
-      credentials.begin(), credentials.end(), [&](const auto& credential) {
-        return suggestion ==
-               (is_password ? credential.password() : credential.username());
+  return base::ranges::any_of(
+      credential_cache_->GetCredentialStore(origin).GetCredentials(),
+      [&](const auto& cred) {
+        return suggestion == (is_password ? cred.password() : cred.username());
       });
 }
 
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 5fd395e1..9e827b4e 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -594,11 +594,12 @@
     SetContentCustomCommandIdRange(IDC_CONTENT_CONTEXT_CUSTOM_FIRST,
                                    IDC_CONTENT_CONTEXT_CUSTOM_LAST);
   }
-  set_content_type(
-      ContextMenuContentTypeFactory::Create(source_web_contents_, params));
+  set_content_type(ContextMenuContentTypeFactory::Create(
+      source_web_contents_, params));
 }
 
-RenderViewContextMenu::~RenderViewContextMenu() = default;
+RenderViewContextMenu::~RenderViewContextMenu() {
+}
 
 // Menu construction functions -------------------------------------------------
 
@@ -683,17 +684,18 @@
 
   // Get a list of extension id's that have context menu items, and sort by the
   // top level context menu title of the extension.
+  std::set<MenuItem::ExtensionKey> ids = menu_manager->ExtensionIds();
   std::vector<base::string16> sorted_menu_titles;
   std::map<base::string16, std::vector<const Extension*>>
       title_to_extensions_map;
-  for (const auto& id : menu_manager->ExtensionIds()) {
+  for (auto iter = ids.begin(); iter != ids.end(); ++iter) {
     const Extension* extension = registry->GetExtensionById(
-        id.extension_id, extensions::ExtensionRegistry::ENABLED);
+        iter->extension_id, extensions::ExtensionRegistry::ENABLED);
     // Platform apps have their context menus created directly in
     // AppendPlatformAppItems.
     if (extension && !extension->is_platform_app()) {
       base::string16 menu_title = extension_items_.GetTopLevelContextMenuTitle(
-          id, printable_selection_text);
+          *iter, printable_selection_text);
       title_to_extensions_map[menu_title].push_back(extension);
       sorted_menu_titles.push_back(menu_title);
     }
@@ -889,14 +891,14 @@
   if (content_type_->SupportsGroup(
           ContextMenuContentType::ITEM_GROUP_ALL_EXTENSION)) {
     DCHECK(!content_type_->SupportsGroup(
-        ContextMenuContentType::ITEM_GROUP_CURRENT_EXTENSION));
+               ContextMenuContentType::ITEM_GROUP_CURRENT_EXTENSION));
     AppendAllExtensionItems();
   }
 
   if (content_type_->SupportsGroup(
           ContextMenuContentType::ITEM_GROUP_CURRENT_EXTENSION)) {
     DCHECK(!content_type_->SupportsGroup(
-        ContextMenuContentType::ITEM_GROUP_ALL_EXTENSION));
+               ContextMenuContentType::ITEM_GROUP_ALL_EXTENSION));
     AppendCurrentExtensionItems();
   }
 
@@ -1172,14 +1174,14 @@
       // Find all regular profiles other than the current one which have at
       // least one open window.
       std::vector<ProfileAttributesEntry*> entries =
-          profile_manager->GetProfileAttributesStorage()
-              .GetAllProfilesAttributesSortedByName();
+          profile_manager->GetProfileAttributesStorage().
+              GetAllProfilesAttributesSortedByName();
       std::vector<ProfileAttributesEntry*> target_profiles_entries;
       for (ProfileAttributesEntry* entry : entries) {
         base::FilePath profile_path = entry->GetPath();
         Profile* profile = profile_manager->GetProfileByPath(profile_path);
-        if (profile != GetProfile() && !entry->IsOmitted() &&
-            !entry->IsSigninRequired()) {
+        if (profile != GetProfile() &&
+            !entry->IsOmitted() && !entry->IsSigninRequired()) {
           target_profiles_entries.push_back(entry);
           if (chrome::FindLastActiveWithProfile(profile))
             multiple_profiles_open_ = true;
@@ -1271,10 +1273,11 @@
                                     IDS_CONTENT_CONTEXT_SAVELINKAS);
   }
 
-  menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_COPYLINKLOCATION,
-                                  params_.link_url.SchemeIs(url::kMailToScheme)
-                                      ? IDS_CONTENT_CONTEXT_COPYEMAILADDRESS
-                                      : IDS_CONTENT_CONTEXT_COPYLINKLOCATION);
+  menu_model_.AddItemWithStringId(
+      IDC_CONTENT_CONTEXT_COPYLINKLOCATION,
+      params_.link_url.SchemeIs(url::kMailToScheme) ?
+          IDS_CONTENT_CONTEXT_COPYEMAILADDRESS :
+          IDS_CONTENT_CONTEXT_COPYLINKLOCATION);
 
   if (params_.source_type == ui::MENU_SOURCE_TOUCH &&
       params_.media_type != ContextMenuDataMediaType::kImage &&
@@ -1519,24 +1522,22 @@
     menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
   }
 
-  translate::TranslateManager* manager =
-      ChromeTranslateClient::FromWebContents(embedder_web_contents_)
-          ->GetTranslateManager();
-
-  if (manager->CanManuallyTranslate()) {
-    language::LanguageModel* language_model =
-        LanguageModelManagerFactory::GetForBrowserContext(browser_context_)
-            ->GetPrimaryModel();
+  if (TranslateService::IsTranslatableURL(params_.page_url)) {
     std::unique_ptr<translate::TranslatePrefs> prefs(
         ChromeTranslateClient::CreateTranslatePrefs(
             GetPrefs(browser_context_)));
-    std::string locale = translate::TranslateManager::GetTargetLanguage(
-        prefs.get(), language_model);
-    base::string16 language =
-        l10n_util::GetDisplayNameForLocale(locale, locale, true);
-    menu_model_.AddItem(
-        IDC_CONTENT_CONTEXT_TRANSLATE,
-        l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_TRANSLATE, language));
+    if (prefs->IsTranslateAllowedByPolicy()) {
+      language::LanguageModel* language_model =
+          LanguageModelManagerFactory::GetForBrowserContext(browser_context_)
+              ->GetPrimaryModel();
+      std::string locale = translate::TranslateManager::GetTargetLanguage(
+          prefs.get(), language_model);
+      base::string16 language =
+          l10n_util::GetDisplayNameForLocale(locale, locale, true);
+      menu_model_.AddItem(
+          IDC_CONTENT_CONTEXT_TRANSLATE,
+          l10n_util::GetStringFUTF16(IDS_CONTENT_CONTEXT_TRANSLATE, language));
+    }
   }
 }
 
@@ -1745,7 +1746,7 @@
   if (handlers.empty())
     return;
   size_t max = IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_LAST -
-               IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST;
+      IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST;
   for (size_t i = 0; i < handlers.size() && i <= max; i++) {
     protocol_handler_submenu_model_.AddItem(
         IDC_CONTENT_CONTEXT_PROTOCOL_HANDLER_FIRST + i,
@@ -1947,7 +1948,7 @@
     case IDC_CONTENT_CONTEXT_OPENIMAGENEWTAB:
     case IDC_CONTENT_CONTEXT_SEARCHWEBFORIMAGE:
       return params_.src_url.is_valid() &&
-             (params_.src_url.scheme() != content::kChromeUIScheme);
+          (params_.src_url.scheme() != content::kChromeUIScheme);
 
     case IDC_CONTENT_CONTEXT_COPYIMAGE:
       return params_.has_image_contents;
@@ -2448,7 +2449,7 @@
 }
 
 ProtocolHandlerRegistry::ProtocolHandlerList
-RenderViewContextMenu::GetHandlersForLinkUrl() {
+    RenderViewContextMenu::GetHandlersForLinkUrl() {
   ProtocolHandlerRegistry::ProtocolHandlerList handlers =
       protocol_handler_registry_->GetHandlersFor(params_.link_url.scheme());
   std::sort(handlers.begin(), handlers.end());
@@ -2462,7 +2463,8 @@
 }
 
 base::string16 RenderViewContextMenu::PrintableSelectionText() {
-  return gfx::TruncateString(params_.selection_text, kMaxSelectionTextLength,
+  return gfx::TruncateString(params_.selection_text,
+                             kMaxSelectionTextLength,
                              gfx::WORD_BREAK);
 }
 
@@ -2556,8 +2558,7 @@
   if (profile->IsChild()) {
     SupervisedUserService* supervised_user_service =
         SupervisedUserServiceFactory::GetForProfile(profile);
-    SupervisedUserURLFilter* url_filter =
-        supervised_user_service->GetURLFilter();
+    SupervisedUserURLFilter* url_filter = supervised_user_service->GetURLFilter();
     if (url_filter->GetFilteringBehaviorForURL(params_.link_url) !=
         SupervisedUserURLFilter::FilteringBehavior::ALLOW)
       return false;
@@ -2565,7 +2566,7 @@
 #endif
 
   return params_.link_url.is_valid() &&
-         ProfileIOData::IsHandledProtocol(params_.link_url.scheme());
+      ProfileIOData::IsHandledProtocol(params_.link_url.scheme());
 }
 
 bool RenderViewContextMenu::IsSaveImageAsEnabled() const {
@@ -2592,7 +2593,7 @@
 #if BUILDFLAG(ENABLE_PRINT_PREVIEW)
   // Do not save the preview PDF on the print preview page.
   can_save = can_save &&
-             !(printing::PrintPreviewDialogController::IsPrintPreviewURL(url));
+      !(printing::PrintPreviewDialogController::IsPrintPreviewURL(url));
 #endif
   return can_save;
 }
@@ -2757,7 +2758,9 @@
   WindowOpenDisposition disposition = ui::DispositionFromEventFlags(
       event_flags, WindowOpenDisposition::NEW_FOREGROUND_TAB);
   OpenURL(handlers[handler_index].TranslateUrl(params_.link_url),
-          GetDocumentURL(params_), disposition, ui::PAGE_TRANSITION_LINK);
+          GetDocumentURL(params_),
+          disposition,
+          ui::PAGE_TRANSITION_LINK);
 }
 
 void RenderViewContextMenu::ExecOpenLinkInProfile(int profile_index) {
@@ -2834,8 +2837,8 @@
 }
 
 void RenderViewContextMenu::ExecSaveAs() {
-  bool is_large_data_url =
-      params_.has_image_contents && params_.src_url.is_empty();
+  bool is_large_data_url = params_.has_image_contents &&
+      params_.src_url.is_empty();
   if (params_.media_type == ContextMenuDataMediaType::kCanvas ||
       (params_.media_type == ContextMenuDataMediaType::kImage &&
        is_large_data_url)) {
@@ -3003,11 +3006,32 @@
 }
 
 void RenderViewContextMenu::ExecTranslate() {
+  // A translation might have been triggered by the time the menu got
+  // selected, do nothing in that case.
+  ChromeTranslateClient* chrome_translate_client =
+      ChromeTranslateClient::FromWebContents(embedder_web_contents_);
+  if (!chrome_translate_client ||
+      chrome_translate_client->GetLanguageState().IsPageTranslated() ||
+      chrome_translate_client->GetLanguageState().translation_pending()) {
+    return;
+  }
+
+  std::string original_lang =
+      chrome_translate_client->GetLanguageState().original_language();
+  std::string target_lang = GetTargetLanguage();
+
+  // Since the user decided to translate for that language and site, clears
+  // any preferences for not translating them.
+  std::unique_ptr<translate::TranslatePrefs> prefs(
+      ChromeTranslateClient::CreateTranslatePrefs(
+          GetPrefs(browser_context_)));
+  prefs->UnblockLanguage(original_lang);
+  prefs->RemoveSiteFromBlacklist(params_.page_url.HostNoBrackets());
+
   translate::TranslateManager* manager =
-      ChromeTranslateClient::FromWebContents(embedder_web_contents_)
-          ->GetTranslateManager();
+      chrome_translate_client->GetTranslateManager();
   DCHECK(manager);
-  manager->InitiateManualTranslation(true, true);
+  manager->TranslatePage(original_lang, target_lang, true);
 }
 
 void RenderViewContextMenu::ExecLanguageSettings(int event_flags) {
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb
index 8733b00..4dee3456 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_as.xtb
@@ -52,6 +52,7 @@
 <translation id="1291286136605998134">ট’গল কৰা বুটাম</translation>
 <translation id="1299774449519412690">পাতল আকাশী নীলা</translation>
 <translation id="1303806948938513162">ChromeVox মেনু অন্তর্ভুক্ত কৰিবলৈ ৪টা আঙুলি ব্যৱহাৰ কৰি টিপক</translation>
+<translation id="1313373992684326101">পূৰ্বৱৰ্তী শাখাটোলৈ যাওক। উদাহৰণত ষ্টেটাছ ট্ৰে’ আৰু লঞ্চাৰ অন্তৰ্ভুক্ত।</translation>
 <translation id="1325363694295259631"><ph name="NAME" />, মেনুৰ বস্তুৰ ৰেডিঅ’ বুটাম বাছনিৰ পৰা আঁতৰোৱা হৈছে</translation>
 <translation id="1325946044405407859">হালধীয়া মুগা</translation>
 <translation id="1331702245475014624"><ph name="TOTAL" />ৰ <ph name="INDEX" /></translation>
@@ -79,6 +80,7 @@
 <translation id="1506187449813838456">তীব্ৰতা বৃদ্ধি কৰক</translation>
 <translation id="151784044608172266">পৰৱৰ্তী বাক্য</translation>
 <translation id="1524531499102321782">ব্ৰেইলৰ পৰৱর্তী শাৰী</translation>
+<translation id="1542513807034338907">পূৰ্বৱৰ্তী পৃষ্ঠালৈ স্ক্ৰ’ল কৰক</translation>
 <translation id="1546370775711804143">স্ক্ৰল বাৰ</translation>
 <translation id="1555130319947370107">নীলা</translation>
 <translation id="1559739829547075274">পাছলৈ নেভিগে'ট কৰক</translation>
@@ -484,6 +486,7 @@
 <translation id="4763480195061959176">ভিডিঅ’</translation>
 <translation id="4764692524839457597">ডিফ'ল্ট</translation>
 <translation id="4772771694153161212">তলত আঁচ দিয়া নহয়</translation>
+<translation id="4780458943471935919">পৰৱৰ্তী পৃষ্ঠালৈ স্ক্ৰ’ল কৰক</translation>
 <translation id="4784215347943747396">ডিভাইচটো মাত্ৰ ১ টা অথবা ২ টা ছুইচেৰে নিয়ন্ত্ৰণ কৰক</translation>
 <translation id="4786285211967466855">কোনো পূর্বৱর্তী স্তৰ ১ৰ শিৰোনাম নাই</translation>
 <translation id="4787577491510559358">বৰ্তমানৰ বস্তুটোৰ ফৰ্মেটিঙৰ বিষয়ে ঘোষণা কৰক</translation>
@@ -819,6 +822,7 @@
 <translation id="744163271241493234">পাছৱৰ্ড সম্পাদক</translation>
 <translation id="7484805699335881122">উপাদানৰ প্ৰকাৰ আৰু উদ্ধৃত, মচা, ব’ল্ড কৰা, বন্ধনীযুক্ত অথবা বৰফলাত থকা পাঠ কওঁতে কণ্ঠস্বৰৰ তীব্ৰতাৰ স্তৰ সলনি কৰক।</translation>
 <translation id="7491962110804786152">টেব</translation>
+<translation id="7492497529767769458">পৰৱৰ্তী শাখাটোলৈ যাওক। উদাহৰণত ষ্টেটাছ ট্ৰে’ আৰু লঞ্চাৰ অন্তৰ্ভুক্ত।</translation>
 <translation id="7505149250476994901">আখৰৰ আগত "cap" বুলি কওক</translation>
 <translation id="7518543783849163354">সাময়িকভাৱে ChromeVoxৰ কথা কোৱা বন্ধ কৰিবলৈ নিয়ন্ত্ৰণ বুটামটো টিপক।</translation>
 <translation id="7533226154149229506">পাতল সোণালী ৰ'ড হালধীয়া</translation>
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb
index 85cd488..05eea50 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb
+++ b/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_en-GB.xtb
@@ -52,6 +52,7 @@
 <translation id="1291286136605998134">Toggle button</translation>
 <translation id="1299774449519412690">Light Sky Blue</translation>
 <translation id="1303806948938513162">Tap with 4 fingers to enter the ChromeVox menus</translation>
+<translation id="1313373992684326101">Move to previous section. Examples include the Status Tray and Launcher.</translation>
 <translation id="1325363694295259631"><ph name="NAME" />, menu item radio button unselected</translation>
 <translation id="1325946044405407859">Tan</translation>
 <translation id="1331702245475014624"><ph name="INDEX" /> of <ph name="TOTAL" /></translation>
@@ -79,6 +80,7 @@
 <translation id="1506187449813838456">Increase pitch</translation>
 <translation id="151784044608172266">Next Sentence</translation>
 <translation id="1524531499102321782">Braille next Line</translation>
+<translation id="1542513807034338907">Scroll to previous page</translation>
 <translation id="1546370775711804143">Scroll bar</translation>
 <translation id="1555130319947370107">Blue</translation>
 <translation id="1559739829547075274">Navigate backward</translation>
@@ -485,6 +487,7 @@
 <translation id="4763480195061959176">video</translation>
 <translation id="4764692524839457597">default</translation>
 <translation id="4772771694153161212">Not underline</translation>
+<translation id="4780458943471935919">Scroll to next page</translation>
 <translation id="4784215347943747396">Control the device with just 1 or 2 switches</translation>
 <translation id="4786285211967466855">No previous level 1 heading</translation>
 <translation id="4787577491510559358">Announce formatting for current item</translation>
@@ -820,6 +823,7 @@
 <translation id="744163271241493234">pwded</translation>
 <translation id="7484805699335881122">Change pitch when speaking element types and quoted, deleted, bolded, parenthesised or capitalised text.</translation>
 <translation id="7491962110804786152">tab</translation>
+<translation id="7492497529767769458">Move to next section. Examples include the Status Tray and Launcher.</translation>
 <translation id="7505149250476994901">Say 'cap' before letter</translation>
 <translation id="7518543783849163354">To temporarily stop ChromeVox from speaking, press the Control key.</translation>
 <translation id="7533226154149229506">Light Goldenrod Yellow</translation>
diff --git a/chrome/browser/resources/chromeos/login/arc_terms_of_service.html b/chrome/browser/resources/chromeos/login/arc_terms_of_service.html
index a2b9eb81..57fb8d4 100644
--- a/chrome/browser/resources/chromeos/login/arc_terms_of_service.html
+++ b/chrome/browser/resources/chromeos/login/arc_terms_of_service.html
@@ -14,6 +14,8 @@
     <!-- As this dialog have pre-loading logic that require access to elements,
          dialog is marked as no-lazy. -->
     <oobe-dialog id="arcTosDialog" has-buttons class="arc-tos-loading"
+        role="dialog"
+        aria-label$="[[i18nDynamic(locale, 'arcTermsOfServiceScreenHeading')]]"
         title-key="arcTermsOfServiceScreenHeading"
         subtitle-key="arcTermsOfServiceScreenDescription" no-lazy>
       <iron-icon src="chrome://oobe/playstore.svg" slot="oobe-icon">
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.html b/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.html
index ec6a8f00..c6e47fc 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.html
+++ b/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.html
@@ -241,7 +241,9 @@
               <div class="cr-secondary-text">
                 <ul class="explanation-list">
                   <li>$i18n{nearbyShareContactVisibilityOthers}</li>
-                  <li>$i18n{nearbyShareContactVisibilityNearbyShareOpen}</li>
+                  <li>
+                    $i18n{nearbyShareContactVisibilityNearbyShareOpenOthers}
+                  </li>
                 </ul>
               </div>
             </div>
@@ -259,7 +261,9 @@
                 <div class="cr-secondary-text">
                   <ul class="explanation-list">
                     <li>$i18n{nearbyShareContactVisibilityOwnAll}</li>
-                    <li>$i18n{nearbyShareContactVisibilityNearbyShareOpen}</li>
+                    <li>
+                      $i18n{nearbyShareContactVisibilityNearbyShareOpenOwn}
+                    </li>
                   </ul>
                 </div>
               </template>
@@ -268,7 +272,9 @@
                 <div class="cr-secondary-text">
                   <ul class="explanation-list">
                     <li>$i18n{nearbyShareContactVisibilityOwnSome}</li>
-                    <li>$i18n{nearbyShareContactVisibilityNearbyShareOpen}</li>
+                    <li>
+                      $i18n{nearbyShareContactVisibilityNearbyShareOpenOwn}
+                    </li>
                   </ul>
                 </div>
               </template>
diff --git a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html
index 17e3c7f..534c545 100644
--- a/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html
+++ b/chrome/browser/resources/signin/profile_picker/profile_creation_flow/local_profile_customization.html
@@ -106,6 +106,10 @@
     #nameInput {
       --cr-input-placeholder-color: rgba(var(--google-grey-200-rgb), .5);
     }
+
+    #colorPickerContainer {
+      border-color: var(--google-grey-refresh-700);
+    }
   }
 </style>
 
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
index d102d4b..3efc115 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate.cc
@@ -152,9 +152,15 @@
   return &enabled;
 }
 
-EventResult CalculateEventResult(bool allowed, bool should_warn) {
-  return allowed ? EventResult::ALLOWED
-                 : (should_warn ? EventResult::WARNED : EventResult::BLOCKED);
+EventResult CalculateEventResult(
+    const enterprise_connectors::AnalysisSettings& settings,
+    bool allowed_by_scan_result,
+    bool should_warn) {
+  bool wait_for_verdict = settings.block_until_verdict ==
+                          enterprise_connectors::BlockUntilVerdict::BLOCK;
+  return (allowed_by_scan_result || !wait_for_verdict)
+             ? EventResult::ALLOWED
+             : (should_warn ? EventResult::WARNED : EventResult::BLOCKED);
 }
 
 }  // namespace
@@ -410,7 +416,7 @@
       "text/plain",
       extensions::SafeBrowsingPrivateEventRouter::kTriggerWebContentUpload,
       access_point_, content_size, result, response,
-      CalculateEventResult(text_complies, should_warn));
+      CalculateEventResult(data_.settings, text_complies, should_warn));
 
   if (!text_complies) {
     if (should_warn) {
@@ -445,7 +451,7 @@
       file_info_[index].sha256, mime_type,
       extensions::SafeBrowsingPrivateEventRouter::kTriggerFileUpload,
       access_point_, file_info_[index].size, result, response,
-      CalculateEventResult(file_complies, should_warn));
+      CalculateEventResult(data_.settings, file_complies, should_warn));
 
   ++file_result_count_;
 
diff --git a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate_browsertest.cc b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate_browsertest.cc
index 623d9c4..b8f2f3e 100644
--- a/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate_browsertest.cc
+++ b/chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_dialog_delegate_browsertest.cc
@@ -816,7 +816,11 @@
       /*dlp_verdict*/ dlp_verdict,
       /*mimetypes*/ DocMimeTypes(),
       /*size*/ std::string("foo content").size(),
-      /*result*/ EventResultToString(EventResult::BLOCKED));
+      // If the policy allows immediate delivery of the file, then the result is
+      // ALLOWED even if the verdict obtained afterwards is BLOCKED.
+      /*result*/
+      EventResultToString(expected_result() ? EventResult::ALLOWED
+                                            : EventResult::BLOCKED));
 
   bool called = false;
   base::RunLoop run_loop;
diff --git a/chrome/browser/safe_browsing/generated_safe_browsing_pref_unittest.cc b/chrome/browser/safe_browsing/generated_safe_browsing_pref_unittest.cc
index 6cc313e..28c588e8b 100644
--- a/chrome/browser/safe_browsing/generated_safe_browsing_pref_unittest.cc
+++ b/chrome/browser/safe_browsing/generated_safe_browsing_pref_unittest.cc
@@ -163,39 +163,18 @@
      {SafeBrowsingSetting::STANDARD, SafeBrowsingSetting::DISABLED}},
 };
 
-// Sets |pref_name| to |pref_setting|, using the appropriate store in |prefs|
-// for |source|.
-void SetPrefFromSource(sync_preferences::TestingPrefServiceSyncable* prefs,
-                       const std::string& pref_name,
-                       settings_private::PrefSetting pref_setting,
-                       settings_private::PrefSource source) {
-  if (pref_setting == settings_private::PrefSetting::kNotSet) {
-    return;
-  }
-  auto pref_value = std::make_unique<base::Value>(
-      pref_setting == settings_private::PrefSetting::kRecommendedOn ||
-      pref_setting == settings_private::PrefSetting::kEnforcedOn);
-  if (source == settings_private::PrefSource::kExtension) {
-    prefs->SetExtensionPref(pref_name, std::move(pref_value));
-  } else if (source == settings_private::PrefSource::kDevicePolicy) {
-    prefs->SetManagedPref(pref_name, std::move(pref_value));
-  } else if (source == settings_private::PrefSource::kRecommended) {
-    prefs->SetRecommendedPref(pref_name, std::move(pref_value));
-  }
-}
-
 void SetupManagedTestConditions(
     sync_preferences::TestingPrefServiceSyncable* prefs,
     const SafeBrowsingManagementTestCase& test_case) {
-  SetPrefFromSource(prefs, prefs::kSafeBrowsingEnabled,
-                    test_case.safe_browsing_enabled,
-                    test_case.enabled_enhanced_preference_source);
-  SetPrefFromSource(prefs, prefs::kSafeBrowsingEnhanced,
-                    test_case.safe_browsing_enhanced,
-                    test_case.enabled_enhanced_preference_source);
-  SetPrefFromSource(prefs, prefs::kSafeBrowsingScoutReportingEnabled,
-                    test_case.safe_browsing_reporting,
-                    test_case.reporting_preference_source);
+  extensions::settings_private::SetPrefFromSource(
+      prefs, prefs::kSafeBrowsingEnabled, test_case.safe_browsing_enabled,
+      test_case.enabled_enhanced_preference_source);
+  extensions::settings_private::SetPrefFromSource(
+      prefs, prefs::kSafeBrowsingEnhanced, test_case.safe_browsing_enhanced,
+      test_case.enabled_enhanced_preference_source);
+  extensions::settings_private::SetPrefFromSource(
+      prefs, prefs::kSafeBrowsingScoutReportingEnabled,
+      test_case.safe_browsing_reporting, test_case.reporting_preference_source);
 }
 
 void ValidateManagedPreference(
diff --git a/chrome/browser/sync/test/integration/enable_disable_test.cc b/chrome/browser/sync/test/integration/enable_disable_test.cc
index 5995c388..293f024 100644
--- a/chrome/browser/sync/test/integration/enable_disable_test.cc
+++ b/chrome/browser/sync/test/integration/enable_disable_test.cc
@@ -424,8 +424,15 @@
   EXPECT_EQ(GetNumUpdatesDownloadedInLastCycle(), initial_updates_downloaded);
 }
 
+// Flakiness spike on Windows, see crbug.com/1111227.
+#if defined(OS_WIN)
+#define MAYBE_DoesNotRedownloadAfterKeepData \
+  DISABLED_DoesNotRedownloadAfterKeepData
+#else
+#define MAYBE_DoesNotRedownloadAfterKeepData DoesNotRedownloadAfterKeepData
+#endif
 IN_PROC_BROWSER_TEST_F(EnableDisableSingleClientTest,
-                       DoesNotRedownloadAfterKeepData) {
+                       MAYBE_DoesNotRedownloadAfterKeepData) {
   ASSERT_TRUE(SetupClients());
   ASSERT_FALSE(bookmarks_helper::GetBookmarkModel(0)->IsBookmarked(
       GURL(kSyncedBookmarkURL)));
diff --git a/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc b/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc
index 1475251..85aadac1 100644
--- a/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_web_apps_bmo_sync_test.cc
@@ -231,8 +231,16 @@
   EXPECT_EQ(GetRegistrar(GetProfile(1)).GetAppShortName(app_id), "Test name 2");
 }
 
+// Flaky, see crbug.com/1126404.
+#if defined(OS_MAC) || defined(OS_LINUX) || defined(OS_CHROMEOS)
+#define MAYBE_SyncDoubleInstallationDifferentUserDisplayMode \
+  DISABLED_SyncDoubleInstallationDifferentUserDisplayMode
+#else
+#define MAYBE_SyncDoubleInstallationDifferentUserDisplayMode \
+  SyncDoubleInstallationDifferentUserDisplayMode
+#endif
 IN_PROC_BROWSER_TEST_F(TwoClientWebAppsBMOSyncTest,
-                       SyncDoubleInstallationDifferentUserDisplayMode) {
+                       MAYBE_SyncDoubleInstallationDifferentUserDisplayMode) {
   ASSERT_TRUE(SetupSync());
   ASSERT_TRUE(AllProfilesHaveSameWebAppIds());
 
diff --git a/chrome/browser/ui/android/default_browser_promo/BUILD.gn b/chrome/browser/ui/android/default_browser_promo/BUILD.gn
index 39f8519b..960506d 100644
--- a/chrome/browser/ui/android/default_browser_promo/BUILD.gn
+++ b/chrome/browser/ui/android/default_browser_promo/BUILD.gn
@@ -63,7 +63,6 @@
     ":java",
     "//base:base_java",
     "//base:base_java_test_support",
-    "//chrome/android:chrome_java",
     "//chrome/browser/android/lifecycle:java",
     "//chrome/browser/flags:java",
     "//chrome/test/android:chrome_java_test_support",
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd
index 26f316b..5c2cb05b 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings.grd
+++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -2438,7 +2438,7 @@
         Choose an account
       </message>
       <message name="IDS_SIGNIN_ACCOUNT_PICKER_BOTTOM_SHEET_SUBTITLE" desc="The subtitle for the account picker bottom sheet that tells the user what happens if the button 'Continue as John Doe' is clicked">
-        You’ll be signed in with your Google Account\n(this won’t turn on Chrome Sync)
+        You’ll be signed in to this site, Chrome, and Google apps
       </message>
       <message name="IDS_SIGNIN_ACCOUNT_PICKER_BOTTOM_SHEET_SIGNIN_TITLE" desc="The title of the account picker bottom sheet tells that the user is in the process of signing in with their Google Account">
         Signing in...
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_ACCOUNT_PICKER_BOTTOM_SHEET_SUBTITLE.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_ACCOUNT_PICKER_BOTTOM_SHEET_SUBTITLE.png.sha1
index 673c98c8..0e3f0ef 100644
--- a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_ACCOUNT_PICKER_BOTTOM_SHEET_SUBTITLE.png.sha1
+++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGNIN_ACCOUNT_PICKER_BOTTOM_SHEET_SUBTITLE.png.sha1
@@ -1 +1 @@
-2dcacf290c7a55db4d3cb803a107fa375645fa6f
\ No newline at end of file
+4fbd75618be02396a4dd8761f68f45375434aad3
\ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
index f90a063..0811b1d6 100644
--- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
+++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -895,6 +895,7 @@
 <translation id="7930998711684428189">הצגת אזהרה אם סיסמאות נחשפות עקב פרצה באבטחת מידע.</translation>
 <translation id="7942131818088350342"><ph name="PRODUCT_NAME" /> אינו מעודכן.</translation>
 <translation id="7947953824732555851">קבל והיכנס</translation>
+<translation id="7961926449547174351">השבתת את הגישה לאחסון. כדי להפעיל אותה, יש לעבור להגדרות.</translation>
 <translation id="7963646190083259054">ספק:</translation>
 <translation id="7967911570373677897">‏כדי לסרוק קוד QR, צריך לשנות את ההגדרות כך שמערכת Chrome תוכל להשתמש במצלמה</translation>
 <translation id="7971136598759319605">פעילות אחרונה: לפני יום אחד</translation>
diff --git a/chrome/browser/ui/ash/assistant/assistant_client_impl.cc b/chrome/browser/ui/ash/assistant/assistant_client_impl.cc
index e2957f5..f32aaa1 100644
--- a/chrome/browser/ui/ash/assistant/assistant_client_impl.cc
+++ b/chrome/browser/ui/ash/assistant/assistant_client_impl.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/ui/ash/assistant/device_actions_delegate_impl.h"
 #include "chromeos/components/bloom/public/cpp/bloom_controller.h"
 #include "chromeos/components/bloom/public/cpp/bloom_controller_factory.h"
+#include "chromeos/components/bloom/public/cpp/bloom_screenshot_delegate.h"
 #include "chromeos/constants/chromeos_features.h"
 #include "chromeos/constants/chromeos_switches.h"
 #include "chromeos/services/assistant/public/cpp/features.h"
@@ -92,7 +93,9 @@
   if (chromeos::assistant::features::IsBloomEnabled()) {
     bloom_controller_ = chromeos::bloom::BloomControllerFactory::Create(
         profile->GetURLLoaderFactory(),
-        IdentityManagerFactory::GetForProfile(profile));
+        IdentityManagerFactory::GetForProfile(profile),
+        nullptr  // TODO(jeroendh): pass in real BloomScreenshotDelegate
+    );
   }
 }
 
diff --git a/chrome/browser/ui/search/local_ntp_browsertest.cc b/chrome/browser/ui/search/local_ntp_browsertest.cc
index 041dec3..23d2949f4 100644
--- a/chrome/browser/ui/search/local_ntp_browsertest.cc
+++ b/chrome/browser/ui/search/local_ntp_browsertest.cc
@@ -1162,7 +1162,10 @@
 
   // Verify that the omnibox displays |slow_url|.
   OmniboxView* view = browser()->window()->GetLocationBar()->GetOmniboxView();
-  EXPECT_EQ(base::ASCIIToUTF16(slow_url.spec()), view->GetText());
+  std::string omnibox_text = base::UTF16ToUTF8(view->GetText());
+  EXPECT_THAT(omnibox_text, ::testing::StartsWith(slow_url.host()));
+  EXPECT_THAT(omnibox_text, ::testing::EndsWith(slow_url.path()));
+  EXPECT_THAT(slow_url.spec(), ::testing::EndsWith(omnibox_text));
 }
 
 // Verifies that Chrome won't spawn a separate renderer process for
diff --git a/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc b/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc
index 2385b0b..fdc0658d 100644
--- a/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc
+++ b/chrome/browser/ui/startup/credential_provider_signin_dialog_win.cc
@@ -317,7 +317,7 @@
   }
 
   ui::ModalType GetDialogModalType() const override {
-    return ui::MODAL_TYPE_SYSTEM;
+    return ui::MODAL_TYPE_WINDOW;
   }
 
   base::string16 GetDialogTitle() const override { return base::string16(); }
diff --git a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc
index 54ef1e6..d5d09e2 100644
--- a/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc
+++ b/chrome/browser/ui/views/frame/top_controls_slide_controller_chromeos_browsertest.cc
@@ -745,7 +745,13 @@
       scrollable_page_contents));
 }
 
-IN_PROC_BROWSER_TEST_F(TopControlsSlideControllerTest, TestClosingATab) {
+#if defined(OS_CHROMEOS)
+// http://crbug.com/1127805: Flaky on Chrome OS builders
+#define MAYBE_TestClosingATab DISABLED_TestClosingATab
+#else
+#define MAYBE_TestClosingATab TestClosingATab
+#endif
+IN_PROC_BROWSER_TEST_F(TopControlsSlideControllerTest, MAYBE_TestClosingATab) {
   ToggleTabletMode();
   ASSERT_TRUE(GetTabletModeEnabled());
   EXPECT_TRUE(top_controls_slide_controller()->IsEnabled());
diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
index be1d28e..0d106eb 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_view_views_browsertest.cc
@@ -536,7 +536,7 @@
   ui_test_utils::NavigateToURL(browser(),
                                GURL("http://example.com/#%E2%98%83"));
 
-  EXPECT_EQ(view->GetText(), base::UTF8ToUTF16("http://example.com/#\u2603"));
+  EXPECT_EQ(view->GetText(), base::UTF8ToUTF16("example.com/#\u2603"));
 }
 
 // Ensure that when the user navigates between suggestions, that the accessible
@@ -725,29 +725,23 @@
       static_cast<OmniboxViewViews*>(omnibox_view);
 
   ASSERT_TRUE(embedded_test_server()->Start());
-  // Use a hostname ("a.test") since IP addresses aren't eligible for eliding.
-  GURL url = embedded_test_server()->GetURL("a.test", "/title1.html");
+  GURL url = embedded_test_server()->GetURL("/title1.html");
   base::string16 url_text = base::ASCIIToUTF16(url.spec());
 
   ui_test_utils::NavigateToURL(browser(), url);
 
-  // By default, the URL should be elided by pushing the scheme out of the
-  // display area.
-  EXPECT_EQ(url_text, omnibox_view_views->GetText());
-  EXPECT_GT(0,
-            omnibox_view_views->GetRenderText()->GetUpdatedDisplayOffset().x());
+  // By default, the elided URL should be shown.
+  EXPECT_EQ(url_text,
+            base::ASCIIToUTF16("http://") + omnibox_view_views->GetText());
 
   // After toggling the setting, the full URL should be shown.
   chrome::ToggleShowFullURLs(browser());
   EXPECT_EQ(url_text, omnibox_view_views->GetText());
-  EXPECT_EQ(0,
-            omnibox_view_views->GetRenderText()->GetUpdatedDisplayOffset().x());
 
   // Toggling the setting again should go back to the elided URL.
   chrome::ToggleShowFullURLs(browser());
-  EXPECT_EQ(url_text, omnibox_view_views->GetText());
-  EXPECT_GT(0,
-            omnibox_view_views->GetRenderText()->GetUpdatedDisplayOffset().x());
+  EXPECT_EQ(url_text,
+            base::ASCIIToUTF16("http://") + omnibox_view_views->GetText());
 }
 
 // The following set of tests require UIA accessibility support, which only
diff --git a/chrome/browser/ui/webui/nearby_share/shared_resources.cc b/chrome/browser/ui/webui/nearby_share/shared_resources.cc
index 5acae327..f88f835 100644
--- a/chrome/browser/ui/webui/nearby_share/shared_resources.cc
+++ b/chrome/browser/ui/webui/nearby_share/shared_resources.cc
@@ -81,8 +81,10 @@
        IDS_NEARBY_VISIBLITY_ALL_CONTACTS_DESCRIPTION},
       {"nearbyShareContactVisibilityContactsTitle",
        IDS_NEARBY_CONTACT_VISIBILITY_CONTACTS_TITLE},
-      {"nearbyShareContactVisibilityNearbyShareOpen",
-       IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN},
+      {"nearbyShareContactVisibilityNearbyShareOpenOthers",
+       IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN_OTHERS},
+      {"nearbyShareContactVisibilityNearbyShareOpenOwn",
+       IDS_NEARBY_CONTACT_VISIBILITY_NEARBY_SHARE_OPEN_OWN},
       {"nearbyShareContactVisibilityNoContactsSubtitle",
        IDS_NEARBY_CONTACT_VISIBILITY_NO_CONTACTS_SUBTITLE},
       {"nearbyShareContactVisibilityNoContactsTitle",
diff --git a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
index 1e436337d0..690f13a 100644
--- a/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
+++ b/chrome/browser/ui/webui/ntp/app_launcher_handler.cc
@@ -8,7 +8,6 @@
 
 #include <string>
 #include <utility>
-#include <vector>
 
 #include "base/auto_reset.h"
 #include "base/bind.h"
@@ -161,14 +160,12 @@
   return base::FeatureList::IsEnabled(features::kDesktopPWAsWithoutExtensions);
 }
 
-bool HasMatchingOrGreaterThanIcon(
-    std::vector<SquareSizePx> downloaded_icon_sizes,
-    int pixels) {
-  for (const SquareSizePx icon_size : downloaded_icon_sizes) {
-    if (icon_size >= pixels)
-      return true;
-  }
-  return false;
+bool HasMatchingOrGreaterThanIcon(const SortedSizesPx& downloaded_icon_sizes,
+                                  int pixels) {
+  if (downloaded_icon_sizes.empty())
+    return false;
+  SquareSizePx largest = *downloaded_icon_sizes.rbegin();
+  return largest >= pixels;
 }
 
 }  // namespace
diff --git a/chrome/browser/web_applications/components/app_icon_manager.h b/chrome/browser/web_applications/components/app_icon_manager.h
index d345409..fa621c95 100644
--- a/chrome/browser/web_applications/components/app_icon_manager.h
+++ b/chrome/browser/web_applications/components/app_icon_manager.h
@@ -44,10 +44,9 @@
 
   // Returns false if any icon in |icon_sizes_in_px| is missing from downloaded
   // icons for a given app and |purpose|.
-  virtual bool HasIcons(
-      const AppId& app_id,
-      IconPurpose purpose,
-      const std::vector<SquareSizePx>& icon_sizes_in_px) const = 0;
+  virtual bool HasIcons(const AppId& app_id,
+                        IconPurpose purpose,
+                        const SortedSizesPx& icon_sizes_in_px) const = 0;
   struct IconSizeAndPurpose {
     SquareSizePx size_px = 0;
     IconPurpose purpose = IconPurpose::ANY;
@@ -70,7 +69,7 @@
   // |callback| if IO error.
   virtual void ReadIcons(const AppId& app_id,
                          IconPurpose purpose,
-                         const std::vector<SquareSizePx>& icon_sizes_in_px,
+                         const SortedSizesPx& icon_sizes,
                          ReadIconsCallback callback) const = 0;
 
   using ReadShortcutsMenuIconsCallback = base::OnceCallback<void(
diff --git a/chrome/browser/web_applications/components/app_registrar.h b/chrome/browser/web_applications/components/app_registrar.h
index ad927855..3c3c7fd 100644
--- a/chrome/browser/web_applications/components/app_registrar.h
+++ b/chrome/browser/web_applications/components/app_registrar.h
@@ -109,7 +109,7 @@
       const AppId& app_id) const = 0;
 
   // Represents which icon sizes we successfully downloaded from the IconInfos.
-  virtual std::vector<SquareSizePx> GetAppDownloadedIconSizesAny(
+  virtual SortedSizesPx GetAppDownloadedIconSizesAny(
       const AppId& app_id) const = 0;
 
   // Returns the "shortcuts" field from the app manifest, use |AppIconManager|
diff --git a/chrome/browser/web_applications/components/web_app_utils_unittest.cc b/chrome/browser/web_applications/components/web_app_utils_unittest.cc
index a5c8e0be..fb631d9 100644
--- a/chrome/browser/web_applications/components/web_app_utils_unittest.cc
+++ b/chrome/browser/web_applications/components/web_app_utils_unittest.cc
@@ -6,10 +6,12 @@
 
 #include <memory>
 
+#include "base/containers/adapters.h"
 #include "base/files/file_path.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/web_applications/test/web_app_test.h"
 #include "chrome/common/chrome_constants.h"
+#include "chrome/common/web_application_info.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -24,6 +26,26 @@
 namespace web_app {
 
 using WebAppUtilsTest = WebAppTest;
+using ::testing::ElementsAre;
+
+// Sanity check that iteration order of SortedSizesPx is ascending. The
+// correctness of most usage of SortedSizesPx depends on this.
+TEST(WebAppTest, SortedSizesPxIsAscending) {
+  // Removal of duplicates is expected but not required for correctness.
+  std::vector<SquareSizePx> in{512, 512, 16, 512, 64, 32, 256};
+  SortedSizesPx sorted(in);
+  ASSERT_THAT(sorted, ElementsAre(16, 32, 64, 256, 512));
+
+  std::vector<SquareSizePx> out(sorted.begin(), sorted.end());
+  ASSERT_THAT(out, ElementsAre(16, 32, 64, 256, 512));
+
+  std::vector<SquareSizePx> reversed(sorted.rbegin(), sorted.rend());
+  ASSERT_THAT(reversed, ElementsAre(512, 256, 64, 32, 16));
+
+  std::vector<SquareSizePx> base_reversed(base::Reversed(sorted).begin(),
+                                          base::Reversed(sorted).end());
+  ASSERT_THAT(base_reversed, ElementsAre(512, 256, 64, 32, 16));
+}
 
 TEST_F(WebAppUtilsTest, AreWebAppsEnabled) {
   Profile* regular_profile = profile();
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_icon_manager.cc b/chrome/browser/web_applications/extensions/bookmark_app_icon_manager.cc
index d1fece74..51e48f4e 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_icon_manager.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_icon_manager.cc
@@ -179,7 +179,7 @@
 bool BookmarkAppIconManager::HasIcons(
     const web_app::AppId& app_id,
     IconPurpose purpose,
-    const std::vector<SquareSizePx>& icon_sizes_in_px) const {
+    const SortedSizesPx& icon_sizes_in_px) const {
   const Extension* app = GetBookmarkApp(profile_, app_id);
   if (!app)
     return false;
@@ -231,11 +231,10 @@
   return FindIconMatchBigger(app_id, purposes, min_size).has_value();
 }
 
-void BookmarkAppIconManager::ReadIcons(
-    const web_app::AppId& app_id,
-    IconPurpose purpose,
-    const std::vector<SquareSizePx>& icon_sizes_in_px,
-    ReadIconsCallback callback) const {
+void BookmarkAppIconManager::ReadIcons(const web_app::AppId& app_id,
+                                       IconPurpose purpose,
+                                       const SortedSizesPx& icon_sizes_in_px,
+                                       ReadIconsCallback callback) const {
   DCHECK(HasIcons(app_id, purpose, icon_sizes_in_px));
   // Legacy bookmark apps handle IconPurpose::ANY icons only.
   if (purpose != IconPurpose::ANY) {
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_icon_manager.h b/chrome/browser/web_applications/extensions/bookmark_app_icon_manager.h
index c63741f94..24b43d9 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_icon_manager.h
+++ b/chrome/browser/web_applications/extensions/bookmark_app_icon_manager.h
@@ -8,6 +8,7 @@
 #include <vector>
 
 #include "chrome/browser/web_applications/components/app_icon_manager.h"
+#include "chrome/common/web_application_info.h"
 
 class Profile;
 
@@ -24,10 +25,9 @@
   // AppIconManager:
   void Start() override;
   void Shutdown() override;
-  bool HasIcons(
-      const web_app::AppId& app_id,
-      IconPurpose purpose,
-      const std::vector<SquareSizePx>& icon_sizes_in_px) const override;
+  bool HasIcons(const web_app::AppId& app_id,
+                IconPurpose purpose,
+                const SortedSizesPx& icon_sizes_in_px) const override;
   base::Optional<IconSizeAndPurpose> FindIconMatchBigger(
       const web_app::AppId& app_id,
       const std::vector<IconPurpose>& purposes,
@@ -37,7 +37,7 @@
                        SquareSizePx min_size) const override;
   void ReadIcons(const web_app::AppId& app_id,
                  IconPurpose purpose,
-                 const std::vector<SquareSizePx>& icon_sizes_in_px,
+                 const SortedSizesPx& icon_sizes_in_px,
                  ReadIconsCallback callback) const override;
   void ReadAllIcons(const web_app::AppId& app_id,
                     ReadIconBitmapsCallback callback) const override;
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_registrar.cc b/chrome/browser/web_applications/extensions/bookmark_app_registrar.cc
index 9b7f904..092dd3d 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_registrar.cc
+++ b/chrome/browser/web_applications/extensions/bookmark_app_registrar.cc
@@ -263,11 +263,11 @@
   return result;
 }
 
-std::vector<SquareSizePx> BookmarkAppRegistrar::GetAppDownloadedIconSizesAny(
+SortedSizesPx BookmarkAppRegistrar::GetAppDownloadedIconSizesAny(
     const web_app::AppId& app_id) const {
   const Extension* extension = GetBookmarkAppDchecked(app_id);
   return extension ? GetBookmarkAppDownloadedIconSizes(extension)
-                   : std::vector<SquareSizePx>();
+                   : SortedSizesPx();
 }
 
 std::vector<WebApplicationShortcutsMenuItemInfo>
diff --git a/chrome/browser/web_applications/extensions/bookmark_app_registrar.h b/chrome/browser/web_applications/extensions/bookmark_app_registrar.h
index 951198d..bba4d6f5 100644
--- a/chrome/browser/web_applications/extensions/bookmark_app_registrar.h
+++ b/chrome/browser/web_applications/extensions/bookmark_app_registrar.h
@@ -12,6 +12,7 @@
 #include "base/scoped_observer.h"
 #include "chrome/browser/web_applications/components/app_registrar.h"
 #include "chrome/browser/web_applications/components/web_app_constants.h"
+#include "chrome/common/web_application_info.h"
 #include "components/sync/model/string_ordinal.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extension_registry_observer.h"
@@ -57,7 +58,7 @@
   base::Time GetAppInstallTime(const web_app::AppId& app_id) const override;
   std::vector<WebApplicationIconInfo> GetAppIconInfos(
       const web_app::AppId& app_id) const override;
-  std::vector<SquareSizePx> GetAppDownloadedIconSizesAny(
+  SortedSizesPx GetAppDownloadedIconSizesAny(
       const web_app::AppId& app_id) const override;
   std::vector<WebApplicationShortcutsMenuItemInfo> GetAppShortcutsMenuItemInfos(
       const web_app::AppId& app_id) const override;
diff --git a/chrome/browser/web_applications/test/test_app_registrar.cc b/chrome/browser/web_applications/test/test_app_registrar.cc
index 316ac47..cdb38f4f 100644
--- a/chrome/browser/web_applications/test/test_app_registrar.cc
+++ b/chrome/browser/web_applications/test/test_app_registrar.cc
@@ -153,7 +153,7 @@
   return {};
 }
 
-std::vector<SquareSizePx> TestAppRegistrar::GetAppDownloadedIconSizesAny(
+SortedSizesPx TestAppRegistrar::GetAppDownloadedIconSizesAny(
     const AppId& app_id) const {
   NOTIMPLEMENTED();
   return {};
diff --git a/chrome/browser/web_applications/test/test_app_registrar.h b/chrome/browser/web_applications/test/test_app_registrar.h
index f010b2c..c18686a 100644
--- a/chrome/browser/web_applications/test/test_app_registrar.h
+++ b/chrome/browser/web_applications/test/test_app_registrar.h
@@ -14,6 +14,7 @@
 #include "chrome/browser/web_applications/components/app_registrar.h"
 #include "chrome/browser/web_applications/components/web_app_constants.h"
 #include "chrome/browser/web_applications/components/web_app_id.h"
+#include "chrome/common/web_application_info.h"
 #include "url/gurl.h"
 
 namespace base {
@@ -68,7 +69,7 @@
   base::Time GetAppInstallTime(const web_app::AppId& app_id) const override;
   std::vector<WebApplicationIconInfo> GetAppIconInfos(
       const AppId& app_id) const override;
-  std::vector<SquareSizePx> GetAppDownloadedIconSizesAny(
+  SortedSizesPx GetAppDownloadedIconSizesAny(
       const AppId& app_id) const override;
   std::vector<WebApplicationShortcutsMenuItemInfo> GetAppShortcutsMenuItemInfos(
       const AppId& app_id) const override;
diff --git a/chrome/browser/web_applications/web_app.cc b/chrome/browser/web_applications/web_app.cc
index 8c4062f..ad7b65f 100644
--- a/chrome/browser/web_applications/web_app.cc
+++ b/chrome/browser/web_applications/web_app.cc
@@ -43,8 +43,7 @@
 
 WebApp& WebApp::operator=(WebApp&& web_app) = default;
 
-const std::vector<SquareSizePx>& WebApp::downloaded_icon_sizes(
-    IconPurpose purpose) const {
+const SortedSizesPx& WebApp::downloaded_icon_sizes(IconPurpose purpose) const {
   switch (purpose) {
     case IconPurpose::ANY:
       return downloaded_icon_sizes_any_;
@@ -200,9 +199,7 @@
   icon_infos_ = std::move(icon_infos);
 }
 
-void WebApp::SetDownloadedIconSizes(IconPurpose purpose,
-                                    std::vector<SquareSizePx> sizes) {
-  std::sort(sizes.begin(), sizes.end());
+void WebApp::SetDownloadedIconSizes(IconPurpose purpose, SortedSizesPx sizes) {
   switch (purpose) {
     case IconPurpose::ANY:
       downloaded_icon_sizes_any_ = std::move(sizes);
diff --git a/chrome/browser/web_applications/web_app.h b/chrome/browser/web_applications/web_app.h
index f95ac96..63edf22 100644
--- a/chrome/browser/web_applications/web_app.h
+++ b/chrome/browser/web_applications/web_app.h
@@ -92,11 +92,8 @@
   }
 
   // Represents which icon sizes we successfully downloaded from the
-  // |icon_infos| for the given |purpose|. Icon sizes are sorted in ascending
-  // order.
-  // TODO(crbug.com/1102701): Convert to use flat_set to enforce size ordering.
-  const std::vector<SquareSizePx>& downloaded_icon_sizes(
-      IconPurpose purpose) const;
+  // |icon_infos| for the given |purpose|.
+  const SortedSizesPx& downloaded_icon_sizes(IconPurpose purpose) const;
 
   // Represents whether the icons for the web app are generated by Chrome due to
   // no suitable icons being available.
@@ -186,9 +183,8 @@
   void SetIsLocallyInstalled(bool is_locally_installed);
   void SetIsInSyncInstall(bool is_in_sync_install);
   void SetIconInfos(std::vector<WebApplicationIconInfo> icon_infos);
-  // Performs sorting of |sizes| vector. Must be called rarely.
-  void SetDownloadedIconSizes(IconPurpose purpose,
-                              std::vector<SquareSizePx> sizes);
+  // Performs sorting and uniquifying of |sizes| if passed as vector.
+  void SetDownloadedIconSizes(IconPurpose purpose, SortedSizesPx sizes);
   void SetIsGeneratedIcon(bool is_generated_icon);
   void SetShortcutsMenuItemInfos(
       std::vector<WebApplicationShortcutsMenuItemInfo>
@@ -236,10 +232,10 @@
   bool is_locally_installed_ = true;
   bool is_in_sync_install_ = false;
   std::vector<WebApplicationIconInfo> icon_infos_;
-  std::vector<SquareSizePx> downloaded_icon_sizes_any_;
+  SortedSizesPx downloaded_icon_sizes_any_;
   // TODO (crbug.com/1114638): Monochrome icons are not currently downloaded.
-  std::vector<SquareSizePx> downloaded_icon_sizes_monochrome_;
-  std::vector<SquareSizePx> downloaded_icon_sizes_maskable_;
+  SortedSizesPx downloaded_icon_sizes_monochrome_;
+  SortedSizesPx downloaded_icon_sizes_maskable_;
   bool is_generated_icon_ = false;
   std::vector<WebApplicationShortcutsMenuItemInfo> shortcuts_menu_item_infos_;
   std::vector<std::vector<SquareSizePx>> downloaded_shortcuts_menu_icons_sizes_;
diff --git a/chrome/browser/web_applications/web_app_database.cc b/chrome/browser/web_applications/web_app_database.cc
index 969e93d4..7115c45 100644
--- a/chrome/browser/web_applications/web_app_database.cc
+++ b/chrome/browser/web_applications/web_app_database.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/web_applications/web_app_database_factory.h"
 #include "chrome/browser/web_applications/web_app_proto_utils.h"
 #include "chrome/browser/web_applications/web_app_registry_update.h"
+#include "chrome/common/web_application_info.h"
 #include "components/services/app_service/public/cpp/file_handler.h"
 #include "components/services/app_service/public/cpp/protocol_handler_info.h"
 #include "components/services/app_service/public/cpp/share_target.h"
@@ -452,13 +453,14 @@
   std::vector<SquareSizePx> icon_sizes_any;
   for (int32_t size : local_data.downloaded_icon_sizes_purpose_any())
     icon_sizes_any.push_back(size);
-  web_app->SetDownloadedIconSizes(IconPurpose::ANY, std::move(icon_sizes_any));
+  web_app->SetDownloadedIconSizes(IconPurpose::ANY,
+                                  SortedSizesPx(std::move(icon_sizes_any)));
 
   std::vector<SquareSizePx> icon_sizes_maskable;
   for (int32_t size : local_data.downloaded_icon_sizes_purpose_maskable())
     icon_sizes_maskable.push_back(size);
-  web_app->SetDownloadedIconSizes(IconPurpose::MASKABLE,
-                                  std::move(icon_sizes_maskable));
+  web_app->SetDownloadedIconSizes(
+      IconPurpose::MASKABLE, SortedSizesPx(std::move(icon_sizes_maskable)));
 
   web_app->SetIsGeneratedIcon(local_data.is_generated_icon());
 
diff --git a/chrome/browser/web_applications/web_app_icon_manager.cc b/chrome/browser/web_applications/web_app_icon_manager.cc
index 210e825..20d623d 100644
--- a/chrome/browser/web_applications/web_app_icon_manager.cc
+++ b/chrome/browser/web_applications/web_app_icon_manager.cc
@@ -23,7 +23,6 @@
 #include "chrome/browser/web_applications/file_utils_wrapper.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/browser/web_applications/web_app_registrar.h"
-#include "chrome/common/web_application_info.h"
 #include "content/public/browser/browser_thread.h"
 #include "skia/ext/image_operations.h"
 #include "third_party/skia/include/core/SkBitmap.h"
@@ -556,17 +555,15 @@
 
 void WebAppIconManager::Shutdown() {}
 
-bool WebAppIconManager::HasIcons(
-    const AppId& app_id,
-    IconPurpose purpose,
-    const std::vector<SquareSizePx>& icon_sizes_in_px) const {
+bool WebAppIconManager::HasIcons(const AppId& app_id,
+                                 IconPurpose purpose,
+                                 const SortedSizesPx& icon_sizes) const {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   const WebApp* web_app = registrar_.GetAppById(app_id);
   if (!web_app)
     return false;
 
-  return base::STLIncludes(web_app->downloaded_icon_sizes(purpose),
-                           icon_sizes_in_px);
+  return base::STLIncludes(web_app->downloaded_icon_sizes(purpose), icon_sizes);
 }
 
 base::Optional<AppIconManager::IconSizeAndPurpose>
@@ -580,9 +577,8 @@
 
   // Must iterate through purposes in order given.
   for (IconPurpose purpose : purposes) {
-    const std::vector<SquareSizePx>& sizes =
-        web_app->downloaded_icon_sizes(purpose);
-    DCHECK(base::STLIsSorted(sizes));
+    // Must iterate sizes from smallest to largest.
+    const SortedSizesPx& sizes = web_app->downloaded_icon_sizes(purpose);
     for (SquareSizePx size : sizes) {
       if (size >= min_size)
         return IconSizeAndPurpose{size, purpose};
@@ -601,15 +597,17 @@
 
 void WebAppIconManager::ReadIcons(const AppId& app_id,
                                   IconPurpose purpose,
-                                  const std::vector<SquareSizePx>& icon_sizes,
+                                  const SortedSizesPx& icon_sizes,
                                   ReadIconsCallback callback) const {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(HasIcons(app_id, purpose, icon_sizes));
 
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE, kTaskTraits,
-      base::BindOnce(ReadIconsBlocking, utils_->Clone(), web_apps_directory_,
-                     app_id, purpose, icon_sizes),
+      base::BindOnce(
+          ReadIconsBlocking, utils_->Clone(), web_apps_directory_, app_id,
+          purpose,
+          std::vector<SquareSizePx>(icon_sizes.begin(), icon_sizes.end())),
       std::move(callback));
 }
 
@@ -623,10 +621,14 @@
   }
 
   std::map<IconPurpose, std::vector<SquareSizePx>> icon_purposes_to_sizes;
-  icon_purposes_to_sizes[IconPurpose::ANY] =
+  const SortedSizesPx& sizes_any =
       web_app->downloaded_icon_sizes(IconPurpose::ANY);
-  icon_purposes_to_sizes[IconPurpose::MASKABLE] =
+  icon_purposes_to_sizes[IconPurpose::ANY] =
+      std::vector<SquareSizePx>(sizes_any.begin(), sizes_any.end());
+  const SortedSizesPx& sizes_maskable =
       web_app->downloaded_icon_sizes(IconPurpose::MASKABLE);
+  icon_purposes_to_sizes[IconPurpose::MASKABLE] =
+      std::vector<SquareSizePx>(sizes_maskable.begin(), sizes_maskable.end());
 
   base::ThreadPool::PostTaskAndReplyWithResult(
       FROM_HERE, kTaskTraits,
@@ -752,9 +754,8 @@
 
   // Must check purposes in the order given.
   for (IconPurpose purpose : purposes) {
-    const std::vector<SquareSizePx>& sizes =
-        web_app->downloaded_icon_sizes(purpose);
-    DCHECK(base::STLIsSorted(sizes));
+    // Must iterate sizes from largest to smallest.
+    const SortedSizesPx& sizes = web_app->downloaded_icon_sizes(purpose);
     for (SquareSizePx size : base::Reversed(sizes)) {
       if (size <= max_size)
         return IconSizeAndPurpose{size, purpose};
diff --git a/chrome/browser/web_applications/web_app_icon_manager.h b/chrome/browser/web_applications/web_app_icon_manager.h
index e9b1854..e78a563 100644
--- a/chrome/browser/web_applications/web_app_icon_manager.h
+++ b/chrome/browser/web_applications/web_app_icon_manager.h
@@ -53,10 +53,9 @@
   // AppIconManager:
   void Start() override;
   void Shutdown() override;
-  bool HasIcons(
-      const AppId& app_id,
-      IconPurpose purpose,
-      const std::vector<SquareSizePx>& icon_sizes_in_px) const override;
+  bool HasIcons(const AppId& app_id,
+                IconPurpose purpose,
+                const SortedSizesPx& icon_sizes) const override;
   base::Optional<IconSizeAndPurpose> FindIconMatchBigger(
       const AppId& app_id,
       const std::vector<IconPurpose>& purposes,
@@ -66,7 +65,7 @@
                        SquareSizePx min_size) const override;
   void ReadIcons(const AppId& app_id,
                  IconPurpose purpose,
-                 const std::vector<SquareSizePx>& icon_sizes,
+                 const SortedSizesPx& icon_sizes,
                  ReadIconsCallback callback) const override;
   void ReadAllIcons(const AppId& app_id,
                     ReadIconBitmapsCallback callback) const override;
diff --git a/chrome/browser/web_applications/web_app_install_manager_unittest.cc b/chrome/browser/web_applications/web_app_install_manager_unittest.cc
index 04c8194..bfc6c6a 100644
--- a/chrome/browser/web_applications/web_app_install_manager_unittest.cc
+++ b/chrome/browser/web_applications/web_app_install_manager_unittest.cc
@@ -36,6 +36,7 @@
 #include "chrome/browser/web_applications/web_app_install_task.h"
 #include "chrome/browser/web_applications/web_app_registrar.h"
 #include "chrome/browser/web_applications/web_app_sync_bridge.h"
+#include "chrome/common/web_application_info.h"
 #include "chrome/test/base/testing_profile.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/manifest/display_mode.mojom-shared.h"
@@ -366,10 +367,9 @@
     return result.app_id;
   }
 
-  std::map<SquareSizePx, SkBitmap> ReadIcons(
-      const AppId& app_id,
-      IconPurpose purpose,
-      std::vector<SquareSizePx> sizes_px) {
+  std::map<SquareSizePx, SkBitmap> ReadIcons(const AppId& app_id,
+                                             IconPurpose purpose,
+                                             SortedSizesPx sizes_px) {
     std::map<SquareSizePx, SkBitmap> result;
     base::RunLoop run_loop;
     icon_manager().ReadIcons(
diff --git a/chrome/browser/web_applications/web_app_installation_utils.cc b/chrome/browser/web_applications/web_app_installation_utils.cc
index 24edd08..6833d7c9 100644
--- a/chrome/browser/web_applications/web_app_installation_utils.cc
+++ b/chrome/browser/web_applications/web_app_installation_utils.cc
@@ -175,6 +175,7 @@
   web_app.SetIconInfos(web_app_info.icon_infos);
   web_app.SetDownloadedIconSizes(
       IconPurpose::ANY, GetSquareSizePxs(web_app_info.icon_bitmaps_any));
+  // TODO (crbug.com/1114638): Add monochrome icons support.
   web_app.SetDownloadedIconSizes(
       IconPurpose::MASKABLE,
       GetSquareSizePxs(web_app_info.icon_bitmaps_maskable));
diff --git a/chrome/browser/web_applications/web_app_registrar.cc b/chrome/browser/web_applications/web_app_registrar.cc
index f9a4897..268e985 100644
--- a/chrome/browser/web_applications/web_app_registrar.cc
+++ b/chrome/browser/web_applications/web_app_registrar.cc
@@ -142,11 +142,11 @@
                  : std::vector<WebApplicationIconInfo>();
 }
 
-std::vector<SquareSizePx> WebAppRegistrar::GetAppDownloadedIconSizesAny(
+SortedSizesPx WebAppRegistrar::GetAppDownloadedIconSizesAny(
     const AppId& app_id) const {
   auto* web_app = GetAppById(app_id);
   return web_app ? web_app->downloaded_icon_sizes(IconPurpose::ANY)
-                 : std::vector<SquareSizePx>();
+                 : SortedSizesPx();
 }
 
 std::vector<WebApplicationShortcutsMenuItemInfo>
diff --git a/chrome/browser/web_applications/web_app_registrar.h b/chrome/browser/web_applications/web_app_registrar.h
index a563616..afd7063 100644
--- a/chrome/browser/web_applications/web_app_registrar.h
+++ b/chrome/browser/web_applications/web_app_registrar.h
@@ -18,6 +18,7 @@
 #include "chrome/browser/web_applications/components/app_registrar.h"
 #include "chrome/browser/web_applications/components/web_app_constants.h"
 #include "chrome/browser/web_applications/components/web_app_id.h"
+#include "chrome/common/web_application_info.h"
 
 namespace web_app {
 
@@ -57,7 +58,7 @@
   base::Time GetAppInstallTime(const web_app::AppId& app_id) const override;
   std::vector<WebApplicationIconInfo> GetAppIconInfos(
       const AppId& app_id) const override;
-  std::vector<SquareSizePx> GetAppDownloadedIconSizesAny(
+  SortedSizesPx GetAppDownloadedIconSizesAny(
       const AppId& app_id) const override;
   std::vector<WebApplicationShortcutsMenuItemInfo> GetAppShortcutsMenuItemInfos(
       const AppId& app_id) const override;
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 7096898..c108cfd 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-master-1600062449-3179a4da9bad3e513a066b6120519028fcbec2a4.profdata
+chrome-linux-master-1600084447-654ce493c2d2b8d13e6243ff3cb852a603e3ef72.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index e3d9418..f9d791c55 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-master-1600062449-eb397872f2f81f98b45c4ec794b206b9a087897d.profdata
+chrome-mac-master-1600084447-6a3b264d40de14a9dcaaf57db5d6240ab2f7fff3.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 0b1d021..57d4d50d 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-master-1600019602-32c2a84e23bf8e92bb08ca2c2b541f0b03d0321b.profdata
+chrome-win32-master-1600062449-2fe327552dcb0c48f221a41ff1f1e25d4acb9926.profdata
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index 3c745772..3d1e299e 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -744,6 +744,10 @@
     enabled_features = [ "enable_offline_pages" ]
   }
 
+  if (enable_extensions) {
+    sources += [ "url_loader_factory_proxy.mojom" ]
+  }
+
   public_deps = [
     "//components/content_settings/core/common:mojo_bindings",
     "//components/prerender/common:mojo_bindings",
diff --git a/chrome/common/url_loader_factory_proxy.mojom b/chrome/common/url_loader_factory_proxy.mojom
new file mode 100644
index 0000000..bcfd2f6
--- /dev/null
+++ b/chrome/common/url_loader_factory_proxy.mojom
@@ -0,0 +1,25 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+module chrome.mojom;
+
+import "services/network/public/mojom/url_loader_factory.mojom";
+import "url/mojom/url.mojom";
+
+// This interface is implemented in the browser process and is used by a
+// renderer process if it wants to proxy requests to URLLoaderFactory. This is
+// currently used by subresource loading for Web Bundles, so that subresource
+// requests that are served within the renderer process (from a Web Bundle) can
+// still be intercepted by Chrome extensions. This interface is implemented
+// only when ENABLE_EXTENSIONS build flag is set.
+interface UrlLoaderFactoryProxy {
+  // Get the proxied URLLoaderFactory. When there is any extension which has
+  // active WebRequest event listeners, the requests to the |proxied_factory|
+  // will be intercepted by the browser process to trigger the WebRequest event
+  // listeners. Otherwise this method just fuses |original_factory| and
+  // |proxied_factory|.
+  GetProxiedURLLoaderFactory(
+      pending_remote<network.mojom.URLLoaderFactory> original_factory,
+      pending_receiver<network.mojom.URLLoaderFactory> proxied_factory);
+};
diff --git a/chrome/common/web_application_info.h b/chrome/common/web_application_info.h
index a9d99bb..039f5858 100644
--- a/chrome/common/web_application_info.h
+++ b/chrome/common/web_application_info.h
@@ -5,12 +5,14 @@
 #ifndef CHROME_COMMON_WEB_APPLICATION_INFO_H_
 #define CHROME_COMMON_WEB_APPLICATION_INFO_H_
 
+#include <functional>
 #include <iosfwd>
 #include <map>
 #include <memory>
 #include <string>
 #include <vector>
 
+#include "base/containers/flat_set.h"
 #include "base/optional.h"
 #include "base/strings/string16.h"
 #include "third_party/blink/public/common/manifest/manifest.h"
@@ -21,6 +23,8 @@
 #include "url/gurl.h"
 
 using SquareSizePx = int;
+// Iterates in ascending order (checked in SortedSizesPxIsAscending test).
+using SortedSizesPx = base::flat_set<SquareSizePx, std::less<>>;
 using ShortcutsMenuIconsBitmaps = std::vector<std::map<SquareSizePx, SkBitmap>>;
 using IconPurpose = blink::Manifest::ImageResource::Purpose;
 
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index eb6e5d3..87243e7 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -178,6 +178,7 @@
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 #include "chrome/common/initialize_extensions_client.h"
+#include "chrome/common/url_loader_factory_proxy.mojom.h"
 #include "chrome/renderer/extensions/chrome_extensions_renderer_client.h"
 #include "extensions/common/constants.h"
 #include "extensions/common/extension_urls.h"
@@ -186,6 +187,7 @@
 #include "extensions/renderer/dispatcher.h"
 #include "extensions/renderer/guest_view/mime_handler_view/mime_handler_view_container_manager.h"
 #include "extensions/renderer/renderer_extension_registry.h"
+#include "third_party/blink/public/common/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/common/css/preferred_color_scheme.h"
 #include "third_party/blink/public/web/web_settings.h"
 #include "third_party/blink/public/web/web_view.h"
@@ -1678,3 +1680,20 @@
   // for this purpose.
   return url.SchemeIs("file");
 }
+
+// When extension is not available, we don't need to proxy the URLLoaderFactory.
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+void ChromeContentRendererClient::MaybeProxyURLLoaderFactory(
+    content::RenderFrame* render_frame,
+    mojo::PendingReceiver<network::mojom::URLLoaderFactory>* factory_receiver) {
+  mojo::PendingRemote<network::mojom::URLLoaderFactory> original_factory;
+  mojo::PendingReceiver<::network::mojom::URLLoaderFactory> proxied_factory(
+      std::move(*factory_receiver));
+  *factory_receiver = original_factory.InitWithNewPipeAndPassReceiver();
+  mojo::Remote<chrome::mojom::UrlLoaderFactoryProxy> url_loader_factory_proxy;
+  render_frame->GetBrowserInterfaceBroker()->GetInterface(
+      url_loader_factory_proxy.BindNewPipeAndPassReceiver());
+  url_loader_factory_proxy->GetProxiedURLLoaderFactory(
+      std::move(original_factory), std::move(proxied_factory));
+}
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h
index 066a1a0..04d63a8 100644
--- a/chrome/renderer/chrome_content_renderer_client.h
+++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -202,6 +202,12 @@
   bool IsSafeRedirectTarget(const GURL& url) override;
   void DidSetUserAgent(const std::string& user_agent) override;
   bool RequiresWebComponentsV0(const GURL& url) override;
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  void MaybeProxyURLLoaderFactory(
+      content::RenderFrame* render_frame,
+      mojo::PendingReceiver<network::mojom::URLLoaderFactory>* factory_receiver)
+      override;
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
 #if BUILDFLAG(ENABLE_PLUGINS)
   static mojo::AssociatedRemote<chrome::mojom::PluginInfoHost>&
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 7429f32..6eb4883 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -2024,6 +2024,7 @@
         "//components/content_settings/core/test:test_support",
         "//components/guest_view/browser:test_support",
         "//components/keep_alive_registry",
+        "//components/web_package:test_support",
         "//google_apis/drive:test_support",
 
         # TODO(rockot) bug 505926: The chrome_extensions_browsertests target
@@ -3769,6 +3770,7 @@
       "../browser/component_updater/soda_en_us_component_installer_unittest.cc",
       "../browser/component_updater/soda_ja_jp_component_installer_unittest.cc",
       "../browser/content_settings/generated_cookie_prefs_unittest.cc",
+      "../browser/content_settings/generated_notification_pref_unittest.cc",
       "../browser/device_identity/device_oauth2_token_service_unittest.cc",
       "../browser/media/feeds/media_feeds_converter_unittest.cc",
       "../browser/media/feeds/media_feeds_fetcher_unittest.cc",
diff --git a/chrome/test/data/webui/settings/password_check_test.js b/chrome/test/data/webui/settings/password_check_test.js
index 0c1602d0..7a8364b 100644
--- a/chrome/test/data/webui/settings/password_check_test.js
+++ b/chrome/test/data/webui/settings/password_check_test.js
@@ -16,6 +16,7 @@
 import {getSyncAllPrefs,simulateSyncStatus} from 'chrome://test/settings/sync_test_util.m.js';
 import {TestOpenWindowProxy} from 'chrome://test/settings/test_open_window_proxy.js';
 import {TestPasswordManagerProxy} from 'chrome://test/settings/test_password_manager_proxy.js';
+import {eventToPromise} from 'chrome://test/test_util.m.js';
 
 // clang-format on
 
@@ -1191,7 +1192,7 @@
         checkPasswordSection.$$('settings-password-check-edit-dialog')));
   });
 
-  if (cr.isChromeOS) {
+  if (isChromeOS) {
     // Verify that getPlaintext succeeded after auth token resolved
     test('showHidePasswordMenuItemAuth', async function() {
       passwordManager.data.leakedCredentials =
@@ -1206,7 +1207,8 @@
       // Open the more actions menu and click 'Show Password'.
       node.$.more.click();
       checkPasswordSection.$.menuShowPassword.click();
-      await passwordManager.whenCalled('getPlaintextCompromisedPassword');
+      // Wait for the more actions menu to disappear before proceeding.
+      await eventToPromise('close', checkPasswordSection.$.moreActionsMenu);
 
       // Verify that password field didn't change
       assertEquals('password', node.$.leakedPassword.type);
@@ -1214,7 +1216,6 @@
 
       passwordManager.plaintextPassword_ = 'test4';
       node.tokenRequestManager.resolve();
-      passwordManager.resetResolver('getPlaintextCompromisedPassword');
       await passwordManager.whenCalled('getPlaintextCompromisedPassword');
 
       assertEquals('text', node.$.leakedPassword.type);
diff --git a/chromeos/components/bloom/BUILD.gn b/chromeos/components/bloom/BUILD.gn
index 16a4cd42..3743abe 100644
--- a/chromeos/components/bloom/BUILD.gn
+++ b/chromeos/components/bloom/BUILD.gn
@@ -14,7 +14,6 @@
     "bloom_server_proxy.h",
     "bloom_server_proxy_impl.cc",
     "bloom_server_proxy_impl.h",
-    "screenshot_grabber.h",
   ]
 
   deps = [
@@ -25,6 +24,7 @@
     "//chromeos/services/assistant/public/shared",
     "//components/signin/public/identity_manager",
     "//services/network/public/cpp",
+    "//ui/gfx",
   ]
 }
 
@@ -44,5 +44,7 @@
     "//services/network/public/cpp",
     "//testing/gmock",
     "//testing/gtest",
+    "//ui/gfx",
+    "//ui/gfx:test_support",
   ]
 }
diff --git a/chromeos/components/bloom/DEPS b/chromeos/components/bloom/DEPS
index c00284d3..a93f07b 100644
--- a/chromeos/components/bloom/DEPS
+++ b/chromeos/components/bloom/DEPS
@@ -2,4 +2,5 @@
   "+ash/public",
   "+components/signin/public/identity_manager",
   "+services/network/public",
+  "+ui/gfx",
 ]
diff --git a/chromeos/components/bloom/bloom_controller_impl.cc b/chromeos/components/bloom/bloom_controller_impl.cc
index f3aa21f..27a10c4 100644
--- a/chromeos/components/bloom/bloom_controller_impl.cc
+++ b/chromeos/components/bloom/bloom_controller_impl.cc
@@ -7,20 +7,20 @@
 #include "base/logging.h"
 #include "chromeos/components/bloom/bloom_interaction.h"
 #include "chromeos/components/bloom/bloom_server_proxy.h"
-#include "chromeos/components/bloom/screenshot_grabber.h"
+#include "chromeos/components/bloom/public/cpp/bloom_screenshot_delegate.h"
 
 namespace chromeos {
 namespace bloom {
 
 BloomControllerImpl::BloomControllerImpl(
     signin::IdentityManager* identity_manager,
-    std::unique_ptr<ScreenshotGrabber> screenshot_grabber,
+    std::unique_ptr<BloomScreenshotDelegate> screenshot_delegate,
     std::unique_ptr<BloomServerProxy> server_proxy)
     : identity_manager_(identity_manager),
-      screenshot_grabber_(std::move(screenshot_grabber)),
+      screenshot_delegate_(std::move(screenshot_delegate)),
       server_proxy_(std::move(server_proxy)) {
   DCHECK(identity_manager_);
-  DCHECK(screenshot_grabber_);
+  DCHECK(screenshot_delegate_);
   DCHECK(server_proxy_);
 }
 
@@ -76,10 +76,10 @@
   owned_interaction_observers_.push_back(std::move(observer));
 }
 
-void BloomControllerImpl::SetScreenshotGrabberForTesting(
-    std::unique_ptr<ScreenshotGrabber> screenshot_grabber) {
-  DCHECK(screenshot_grabber);
-  screenshot_grabber_ = std::move(screenshot_grabber);
+void BloomControllerImpl::SetScreenshotDelegateForTesting(
+    std::unique_ptr<BloomScreenshotDelegate> screenshot_delegate) {
+  DCHECK(screenshot_delegate);
+  screenshot_delegate_ = std::move(screenshot_delegate);
 }
 
 }  // namespace bloom
diff --git a/chromeos/components/bloom/bloom_controller_impl.h b/chromeos/components/bloom/bloom_controller_impl.h
index 1807976..cab0d3c0 100644
--- a/chromeos/components/bloom/bloom_controller_impl.h
+++ b/chromeos/components/bloom/bloom_controller_impl.h
@@ -20,14 +20,15 @@
 namespace bloom {
 
 class BloomInteraction;
+class BloomScreenshotDelegate;
 class BloomServerProxy;
-class ScreenshotGrabber;
 
 class BloomControllerImpl : public BloomController {
  public:
-  BloomControllerImpl(signin::IdentityManager* identity_manager,
-                      std::unique_ptr<ScreenshotGrabber> screenshot_grabber,
-                      std::unique_ptr<BloomServerProxy> server_proxy);
+  BloomControllerImpl(
+      signin::IdentityManager* identity_manager,
+      std::unique_ptr<BloomScreenshotDelegate> screenshot_delegate,
+      std::unique_ptr<BloomServerProxy> server_proxy);
   BloomControllerImpl(const BloomControllerImpl&) = delete;
   BloomControllerImpl& operator=(const BloomControllerImpl&) = delete;
   ~BloomControllerImpl() override;
@@ -43,15 +44,18 @@
   void ShowUI();
   void ShowResult(const std::string& result);
 
-  ScreenshotGrabber* screenshot_grabber() { return screenshot_grabber_.get(); }
+  BloomScreenshotDelegate* screenshot_delegate() {
+    return screenshot_delegate_.get();
+  }
   BloomServerProxy* server_proxy() { return server_proxy_.get(); }
   signin::IdentityManager* identity_manager() { return identity_manager_; }
 
-  void SetScreenshotGrabberForTesting(std::unique_ptr<ScreenshotGrabber>);
+  void SetScreenshotDelegateForTesting(
+      std::unique_ptr<BloomScreenshotDelegate>);
 
  private:
   signin::IdentityManager* const identity_manager_;
-  std::unique_ptr<ScreenshotGrabber> screenshot_grabber_;
+  std::unique_ptr<BloomScreenshotDelegate> screenshot_delegate_;
   std::unique_ptr<BloomServerProxy> server_proxy_;
 
   base::ObserverList<BloomInteractionObserver> interaction_observers_;
diff --git a/chromeos/components/bloom/bloom_controller_impl_unittest.cc b/chromeos/components/bloom/bloom_controller_impl_unittest.cc
index 9b6f2eb4..935c22b 100644
--- a/chromeos/components/bloom/bloom_controller_impl_unittest.cc
+++ b/chromeos/components/bloom/bloom_controller_impl_unittest.cc
@@ -7,13 +7,15 @@
 #include "chromeos/components/bloom/bloom_interaction_observer.h"
 #include "chromeos/components/bloom/bloom_server_proxy.h"
 #include "chromeos/components/bloom/public/cpp/bloom_interaction_resolution.h"
-#include "chromeos/components/bloom/screenshot_grabber.h"
+#include "chromeos/components/bloom/public/cpp/bloom_screenshot_delegate.h"
 #include "chromeos/services/assistant/public/shared/constants.h"
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
 #include "components/signin/public/identity_manager/scope_set.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/image/image.h"
+#include "ui/gfx/image/image_unittest_util.h"
 
 namespace chromeos {
 namespace bloom {
@@ -28,22 +30,22 @@
 
 #define EXPECT_NO_CALLS(args...) EXPECT_CALL(args).Times(0)
 
-class ScreenshotGrabberMock : public ScreenshotGrabber {
+class ScreenshotDelegateMock : public BloomScreenshotDelegate {
  public:
-  ScreenshotGrabberMock() {
+  ScreenshotDelegateMock() {
     ON_CALL(*this, TakeScreenshot).WillByDefault([this](Callback callback) {
       // Store the callback passed to TakeScreenshot() so we can invoke it
       // later from our tests.
       this->callback_ = std::move(callback);
     });
   }
-  ~ScreenshotGrabberMock() override = default;
+  ~ScreenshotDelegateMock() override = default;
 
   MOCK_METHOD(void, TakeScreenshot, (Callback callback));
 
   // Sends the given screenshot to the callback passed to TakeScreenshot()
   void SendScreenshot(
-      const base::Optional<Screenshot>& screenshot = Screenshot()) {
+      const base::Optional<gfx::Image>& screenshot = gfx::Image()) {
     EXPECT_TRUE(callback_) << "TakeScreenshot() was never called.";
 
     if (callback_)
@@ -104,7 +106,7 @@
   BloomServerProxyMock() {
     ON_CALL(*this, AnalyzeProblem)
         .WillByDefault([this](const std::string& access_token,
-                              const Screenshot screenshot, Callback callback) {
+                              const gfx::Image& screenshot, Callback callback) {
           // Store the callback passed to AnalyzeProblem() so we can invoke it
           // later from our tests.
           this->callback_ = std::move(callback);
@@ -113,7 +115,7 @@
   MOCK_METHOD(void,
               AnalyzeProblem,
               (const std::string& access_token,
-               const Screenshot screenshot,
+               const gfx::Image& screenshot,
                Callback callback));
 
   void SendResponse(base::Optional<std::string> html = std::string("<html/>")) {
@@ -156,10 +158,10 @@
  protected:
   void StartInteractionAndSendAccessTokenAndScreenshot(
       std::string access_token = "<access-token>",
-      Screenshot screenshot = Screenshot()) {
+      gfx::Image screenshot = gfx::Image()) {
     controller().StartInteraction();
     IssueAccessToken(access_token);
-    screenshot_grabber_mock().SendScreenshot(screenshot);
+    screenshot_delegate_mock().SendScreenshot(screenshot);
   }
 
   // Returns the |ScopeSet| that was passed to the access token request.
@@ -178,9 +180,9 @@
 
   BloomControllerImpl& controller() { return controller_; }
 
-  ScreenshotGrabberMock& screenshot_grabber_mock() {
-    return *static_cast<ScreenshotGrabberMock*>(
-        controller_.screenshot_grabber());
+  ScreenshotDelegateMock& screenshot_delegate_mock() {
+    return *static_cast<ScreenshotDelegateMock*>(
+        controller_.screenshot_delegate());
   }
 
   BloomInteractionObserverMock* AddInteractionObserverMock() {
@@ -217,7 +219,7 @@
 
   BloomControllerImpl controller_{
       identity_test_env_.identity_manager(),
-      std::make_unique<NiceMock<ScreenshotGrabberMock>>(),
+      std::make_unique<NiceMock<ScreenshotDelegateMock>>(),
       std::make_unique<NiceMock<BloomServerProxyMock>>()};
 };
 
@@ -236,7 +238,7 @@
 }
 
 TEST_F(BloomControllerImplTest, ShouldTakeScreenshot) {
-  EXPECT_CALL(screenshot_grabber_mock(), TakeScreenshot);
+  EXPECT_CALL(screenshot_delegate_mock(), TakeScreenshot);
 
   controller().StartInteraction();
 }
@@ -245,7 +247,7 @@
   auto* interaction_tracker = AddInteractionTracker();
 
   controller().StartInteraction();
-  screenshot_grabber_mock().SendScreenshot();
+  screenshot_delegate_mock().SendScreenshot();
 
   FailAccessToken();
 
@@ -260,7 +262,7 @@
   controller().StartInteraction();
   IssueAccessToken();
 
-  screenshot_grabber_mock().SendScreenshotFailed();
+  screenshot_delegate_mock().SendScreenshotFailed();
 
   EXPECT_FALSE(interaction_tracker->HasInteraction());
   EXPECT_EQ(BloomInteractionResolution::kNoScreenshot,
@@ -270,7 +272,7 @@
 TEST_F(BloomControllerImplTest,
        ShouldPassAccessTokenAndScreenshotToBloomServer) {
   const std::string& access_token = "<the-access-token>";
-  const Screenshot screenshot{1, 2, 3, 4, 5};
+  const gfx::Image screenshot = gfx::test::CreateImage(10, 20);
 
   EXPECT_CALL(bloom_server(), AnalyzeProblem(access_token, screenshot, _));
 
@@ -312,7 +314,7 @@
 
   controller().StartInteraction();
   IssueAccessToken();
-  screenshot_grabber_mock().SendScreenshot();
+  screenshot_delegate_mock().SendScreenshot();
 }
 
 TEST_F(BloomInteractionObserverTest,
@@ -322,7 +324,7 @@
   EXPECT_NO_CALLS(*observer, OnShowUI);
 
   controller().StartInteraction();
-  screenshot_grabber_mock().SendScreenshot();
+  screenshot_delegate_mock().SendScreenshot();
 }
 
 TEST_F(BloomInteractionObserverTest,
diff --git a/chromeos/components/bloom/bloom_interaction.cc b/chromeos/components/bloom/bloom_interaction.cc
index 961fa68..27675e6 100644
--- a/chromeos/components/bloom/bloom_interaction.cc
+++ b/chromeos/components/bloom/bloom_interaction.cc
@@ -9,12 +9,13 @@
 #include "chromeos/components/bloom/bloom_controller_impl.h"
 #include "chromeos/components/bloom/bloom_interaction.h"
 #include "chromeos/components/bloom/bloom_server_proxy.h"
+#include "chromeos/components/bloom/public/cpp/bloom_screenshot_delegate.h"
 #include "chromeos/components/bloom/public/cpp/future_value.h"
-#include "chromeos/components/bloom/screenshot_grabber.h"
 #include "chromeos/services/assistant/public/shared/constants.h"
 #include "components/signin/public/identity_manager/access_token_info.h"
 #include "components/signin/public/identity_manager/primary_account_access_token_fetcher.h"
 #include "components/signin/public/identity_manager/scope_set.h"
+#include "ui/gfx/image/image.h"
 
 namespace chromeos {
 namespace bloom {
@@ -33,8 +34,10 @@
 }
 
 void BloomInteraction::StartAssistantInteraction(std::string&& access_token,
-                                                 Screenshot&& screenshot) {
+                                                 gfx::Image&& screenshot) {
+  DVLOG(2) << "Opening assistant UI";
   controller_->ShowUI();
+  DVLOG(2) << "Contacting Bloom server";
   controller_->server_proxy()->AnalyzeProblem(
       access_token, screenshot, Bind(&BloomInteraction::OnServerResponse));
 }
@@ -45,10 +48,13 @@
     return;
   }
 
+  DVLOG(2) << "Got server response";
   controller_->ShowResult(html.value());
 }
 
 void BloomInteraction::FetchAccessTokenAsync() {
+  DVLOG(2) << "Fetching access token";
+
   signin::ScopeSet scopes;
   scopes.insert(assistant::kBloomScope);
 
@@ -64,7 +70,7 @@
 }
 
 void BloomInteraction::FetchScreenshotAsync() {
-  controller_->screenshot_grabber()->TakeScreenshot(
+  controller_->screenshot_delegate()->TakeScreenshot(
       Bind(&BloomInteraction::OnScreenshotReady));
   screenshot_future_ = std::make_unique<ScreenshotFuture>();
 }
@@ -73,20 +79,24 @@
     GoogleServiceAuthError error,
     signin::AccessTokenInfo access_token_info) {
   if (error.state() != GoogleServiceAuthError::NONE) {
+    LOG(WARNING) << "Failed to fetch the access token";
     controller_->StopInteraction(BloomInteractionResolution::kNoAccessToken);
     return;
   }
 
+  DVLOG(2) << "Received access token";
   access_token_future_->SetValue(std::move(access_token_info.token));
 }
 
 void BloomInteraction::OnScreenshotReady(
-    base::Optional<Screenshot> screenshot) {
+    base::Optional<gfx::Image> screenshot) {
   if (!screenshot) {
+    LOG(WARNING) << "Failed to take the screenshot";
     controller_->StopInteraction(BloomInteractionResolution::kNoScreenshot);
     return;
   }
 
+  DVLOG(2) << "Received screenshot";
   screenshot_future_->SetValue(std::move(screenshot.value()));
 }
 
diff --git a/chromeos/components/bloom/bloom_interaction.h b/chromeos/components/bloom/bloom_interaction.h
index 99b8a984..5dcbeb9 100644
--- a/chromeos/components/bloom/bloom_interaction.h
+++ b/chromeos/components/bloom/bloom_interaction.h
@@ -9,10 +9,13 @@
 #include "base/bind.h"
 #include "base/callback_forward.h"
 #include "base/optional.h"
-#include "chromeos/components/bloom/screenshot_grabber.h"
 
 class GoogleServiceAuthError;
 
+namespace gfx {
+class Image;
+}
+
 namespace signin {
 struct AccessTokenInfo;
 class PrimaryAccountAccessTokenFetcher;
@@ -26,7 +29,7 @@
 template <typename _Type>
 class FutureValue;
 using AccessTokenFuture = FutureValue<std::string>;
-using ScreenshotFuture = FutureValue<Screenshot>;
+using ScreenshotFuture = FutureValue<gfx::Image>;
 
 // A single Bloom interaction. This will:
 //    * Fetch the access token and screenshot.
@@ -34,7 +37,7 @@
 //    * Fetch the Bloom response and forward it to the Assistant interaction.
 class BloomInteraction {
   using StartCallback = base::OnceCallback<void(const std::string& access_token,
-                                                Screenshot&& screenshot)>;
+                                                gfx::Image&& screenshot)>;
 
  public:
   explicit BloomInteraction(BloomControllerImpl* controller);
@@ -47,7 +50,7 @@
 
  private:
   void StartAssistantInteraction(std::string&& access_token,
-                                 Screenshot&& screenshot);
+                                 gfx::Image&& screenshot);
 
   void OnServerResponse(base::Optional<std::string> html);
 
@@ -56,7 +59,7 @@
 
   void OnAccessTokenRequestCompleted(GoogleServiceAuthError error,
                                      signin::AccessTokenInfo access_token_info);
-  void OnScreenshotReady(base::Optional<Screenshot> screenshot);
+  void OnScreenshotReady(base::Optional<gfx::Image> screenshot);
 
   template <typename _Method, typename... Args>
   auto Bind(_Method method, Args&&... args) {
diff --git a/chromeos/components/bloom/bloom_server_proxy.h b/chromeos/components/bloom/bloom_server_proxy.h
index 58a2ffe..3b3472b 100644
--- a/chromeos/components/bloom/bloom_server_proxy.h
+++ b/chromeos/components/bloom/bloom_server_proxy.h
@@ -7,7 +7,10 @@
 
 #include <string>
 #include "base/callback.h"
-#include "chromeos/components/bloom/screenshot_grabber.h"
+
+namespace gfx {
+class Image;
+}
 
 namespace chromeos {
 namespace bloom {
@@ -26,7 +29,7 @@
   // Send the screenshot to the Bloom server for analysis, and send the response
   // to |callback|.
   virtual void AnalyzeProblem(const std::string& access_token,
-                              const Screenshot screenshot,
+                              const gfx::Image& screenshot,
                               Callback callback) = 0;
 };
 
diff --git a/chromeos/components/bloom/bloom_server_proxy_impl.cc b/chromeos/components/bloom/bloom_server_proxy_impl.cc
index 93adf67..8a36b97 100644
--- a/chromeos/components/bloom/bloom_server_proxy_impl.cc
+++ b/chromeos/components/bloom/bloom_server_proxy_impl.cc
@@ -11,7 +11,7 @@
 BloomServerProxyImpl::~BloomServerProxyImpl() = default;
 
 void BloomServerProxyImpl::AnalyzeProblem(const std::string& access_token,
-                                          const Screenshot screenshot,
+                                          const gfx::Image& screenshot,
                                           Callback callback) {
   // TODO(jeroendh): implement
 }
diff --git a/chromeos/components/bloom/bloom_server_proxy_impl.h b/chromeos/components/bloom/bloom_server_proxy_impl.h
index 876032d4..af6ead3 100644
--- a/chromeos/components/bloom/bloom_server_proxy_impl.h
+++ b/chromeos/components/bloom/bloom_server_proxy_impl.h
@@ -16,7 +16,7 @@
   ~BloomServerProxyImpl() override;
 
   void AnalyzeProblem(const std::string& access_token,
-                      const Screenshot screenshot,
+                      const gfx::Image& screenshot,
                       Callback callback) override;
 };
 
diff --git a/chromeos/components/bloom/public/cpp/BUILD.gn b/chromeos/components/bloom/public/cpp/BUILD.gn
index cbd5bcf2..9262304 100644
--- a/chromeos/components/bloom/public/cpp/BUILD.gn
+++ b/chromeos/components/bloom/public/cpp/BUILD.gn
@@ -10,6 +10,7 @@
     "bloom_controller.h",
     "bloom_interaction_resolution.cc",
     "bloom_interaction_resolution.h",
+    "bloom_screenshot_delegate.h",
   ]
 
   deps = [ "//base" ]
@@ -27,6 +28,7 @@
   ]
 
   deps = [
+    ":cpp",
     "//base",
     "//chromeos/components/bloom",
   ]
diff --git a/chromeos/components/bloom/public/cpp/bloom_controller_factory.cc b/chromeos/components/bloom/public/cpp/bloom_controller_factory.cc
index 69eccdd..a636adf 100644
--- a/chromeos/components/bloom/public/cpp/bloom_controller_factory.cc
+++ b/chromeos/components/bloom/public/cpp/bloom_controller_factory.cc
@@ -10,27 +10,18 @@
 #include "chromeos/components/bloom/bloom_controller_impl.h"
 #include "chromeos/components/bloom/bloom_interaction_observer_impl.h"
 #include "chromeos/components/bloom/bloom_server_proxy_impl.h"
-#include "chromeos/components/bloom/screenshot_grabber.h"
+#include "chromeos/components/bloom/public/cpp/bloom_screenshot_delegate.h"
 
 namespace chromeos {
 namespace bloom {
 
-namespace {
-
-// TODO(jeroendh): Replace with actual working screenshot grabber.
-class FakeScreenshotGrabber : public ScreenshotGrabber {
- public:
-  void TakeScreenshot(Callback callback) override { NOTIMPLEMENTED(); }
-};
-
-}  // namespace
-
 // static
 std::unique_ptr<BloomController> BloomControllerFactory::Create(
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-    signin::IdentityManager* identity_manager) {
+    signin::IdentityManager* identity_manager,
+    std::unique_ptr<BloomScreenshotDelegate> screenshot_delegate) {
   auto result = std::make_unique<BloomControllerImpl>(
-      identity_manager, std::make_unique<FakeScreenshotGrabber>(),
+      identity_manager, std::move(screenshot_delegate),
       std::make_unique<BloomServerProxyImpl>());
 
   result->AddObserver(std::make_unique<BloomInteractionObserverImpl>());
diff --git a/chromeos/components/bloom/public/cpp/bloom_controller_factory.h b/chromeos/components/bloom/public/cpp/bloom_controller_factory.h
index 2dec6ac2..f96f4eb 100644
--- a/chromeos/components/bloom/public/cpp/bloom_controller_factory.h
+++ b/chromeos/components/bloom/public/cpp/bloom_controller_factory.h
@@ -22,13 +22,15 @@
 namespace bloom {
 
 class BloomController;
+class BloomScreenshotDelegate;
 
 class COMPONENT_EXPORT(BLOOM) BloomControllerFactory {
  public:
   // Create the Bloom controller. Can only be invoked once.
   static std::unique_ptr<BloomController> Create(
       scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
-      signin::IdentityManager* identity_manager);
+      signin::IdentityManager* identity_manager,
+      std::unique_ptr<BloomScreenshotDelegate> screenshot_delegate);
 };
 
 }  // namespace bloom
diff --git a/chromeos/components/bloom/public/cpp/bloom_screenshot_delegate.h b/chromeos/components/bloom/public/cpp/bloom_screenshot_delegate.h
new file mode 100644
index 0000000..e8f52c5
--- /dev/null
+++ b/chromeos/components/bloom/public/cpp/bloom_screenshot_delegate.h
@@ -0,0 +1,32 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROMEOS_COMPONENTS_BLOOM_PUBLIC_CPP_BLOOM_SCREENSHOT_DELEGATE_H_
+#define CHROMEOS_COMPONENTS_BLOOM_PUBLIC_CPP_BLOOM_SCREENSHOT_DELEGATE_H_
+
+#include "base/callback_forward.h"
+#include "base/optional.h"
+
+namespace gfx {
+class Image;
+}
+
+namespace chromeos {
+namespace bloom {
+
+// Prompts the user to select a part of the screen, and invokes the callback
+// with a screenshot of the selected area.
+class BloomScreenshotDelegate {
+ public:
+  using Callback = base::OnceCallback<void(base::Optional<gfx::Image>)>;
+
+  virtual ~BloomScreenshotDelegate() = default;
+
+  virtual void TakeScreenshot(Callback ready_callback) = 0;
+};
+
+}  // namespace bloom
+}  // namespace chromeos
+
+#endif  // CHROMEOS_COMPONENTS_BLOOM_PUBLIC_CPP_BLOOM_SCREENSHOT_DELEGATE_H_
diff --git a/chromeos/components/bloom/screenshot_grabber.h b/chromeos/components/bloom/screenshot_grabber.h
deleted file mode 100644
index f6bafc4..0000000
--- a/chromeos/components/bloom/screenshot_grabber.h
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2020 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROMEOS_COMPONENTS_BLOOM_SCREENSHOT_GRABBER_H_
-#define CHROMEOS_COMPONENTS_BLOOM_SCREENSHOT_GRABBER_H_
-
-#include <vector>
-#include "base/callback_forward.h"
-#include "base/optional.h"
-
-namespace chromeos {
-namespace bloom {
-
-using Screenshot = std::vector<uint8_t>;
-
-// Interface to grab a screenshot.
-class ScreenshotGrabber {
- public:
-  using Callback =
-      base::OnceCallback<void(base::Optional<Screenshot> screenshot)>;
-  virtual ~ScreenshotGrabber() = default;
-
-  // Asynchronously takes a screenshot, and passes it to the callback.
-  // If this fails or is aborted, will pass |base::nullopt| to the callback.
-  virtual void TakeScreenshot(Callback callback) = 0;
-};
-
-}  // namespace bloom
-}  // namespace chromeos
-
-#endif  // CHROMEOS_COMPONENTS_BLOOM_SCREENSHOT_GRABBER_H_
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb
index 12245ca..6e76a4b 100644
--- a/chromeos/strings/chromeos_strings_af.xtb
+++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Verander wagwoord</translation>
 <translation id="8208861521865154048">Byvoordele</translation>
 <translation id="8347227221149377169">Druktake</translation>
+<translation id="8352772353338965963">Voeg 'n rekening by meervuldige aanmelding. Daar kan sonder 'n wagwoord by alle aangemelde rekeninge ingegaan word, en daarom moet hierdie kenmerk net met vertroude rekeninge gebruik word.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> bestuur hierdie gebruiker. Dit kan dalk oor 'n afstand instellings bestuur en gebruikeraktiwiteit monitor.</translation>
 <translation id="871560550817059752">Misluk – Ink is op</translation>
 <translation id="8726019395068607495">Gestop – deur is oop</translation>
diff --git a/chromeos/strings/chromeos_strings_am.xtb b/chromeos/strings/chromeos_strings_am.xtb
index 3e58312..128d0496 100644
--- a/chromeos/strings/chromeos_strings_am.xtb
+++ b/chromeos/strings/chromeos_strings_am.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">የይለፍ ቃል ለውጥ</translation>
 <translation id="8208861521865154048">ጥቅማጥቅሞች</translation>
 <translation id="8347227221149377169">የኅትመት ሥራዎች</translation>
+<translation id="8352772353338965963">አንድ መለያ ባለብዙ መለያ መግቢያ ላይ ያክሉ። ሁሉም የተገባባቸው መለያዎች ያለይለፍ ቃል ሊደረስባቸው ይችላሉ፣ ስለዚህ ይህ ባህሪ በታመኑ መለያዎች ላይ ብቻ ነው መጠቀም ያለባቸው።</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> እነኚህን ተጠቃሚ ያስተዳድራል። ቅንብሮችን የተጠቃሚ እንቅስቃሴን በርቀት ሊያስተዳድር እና ሊቆጣጠር ይችላል።</translation>
 <translation id="871560550817059752">አልተሳካም - ቀለም አልቋል</translation>
 <translation id="8726019395068607495">ቆሟል - በር ክፍት ነው</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb
index 91012abb..ff9ee14 100644
--- a/chromeos/strings/chromeos_strings_ar.xtb
+++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">تغيير كلمة المرور</translation>
 <translation id="8208861521865154048">المزايا</translation>
 <translation id="8347227221149377169">مهام الطباعة</translation>
+<translation id="8352772353338965963">يمكنك إضافة حساب إلى الدخول المتعدد. يمكن الدخول إلى جميع الحسابات التي تم تسجيل الدخول إليها بدون كلمة مرور، لذا فإن هذه الميزة لا يجب استخدامها إلا مع الحسابات الموثوق بها.</translation>
 <translation id="8701136875688985581">يُدير <ph name="ENROLLMENT_DOMAIN" /> هذا المستخدِم. وقد يعمل على إدارة الإعدادات ورصد نشاط المستخدِم.</translation>
 <translation id="871560550817059752">تعذَّرت الطباعة - نفد الحبر</translation>
 <translation id="8726019395068607495">توقّفت الطابعة - باب الطابعة مفتوح</translation>
diff --git a/chromeos/strings/chromeos_strings_as.xtb b/chromeos/strings/chromeos_strings_as.xtb
index 257b8aa9..074c216 100644
--- a/chromeos/strings/chromeos_strings_as.xtb
+++ b/chromeos/strings/chromeos_strings_as.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">পাছৱৰ্ড সলনি কৰক</translation>
 <translation id="8208861521865154048">লাভালাভসমূহ</translation>
 <translation id="8347227221149377169">প্ৰিণ্টিঙৰ কামসমূহ</translation>
+<translation id="8352772353338965963">একাধিক ছাইন-ইন কৰিবলৈ এটা একাউণ্ট যোগ কৰক। ছাইন ইন কৰি থোৱা সকলো একাউণ্ট পাছৱৰ্ড অবিহনেই এক্সেছ কৰিব পাৰি, সেয়েহে এই সুবিধাটো কেৱল বিশ্বাসযোগ্য একাউণ্টৰ সৈতেহে ব্যৱহাৰ কৰা উচিত।</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" />এ এই ব্যৱহাৰকাৰী গৰাকীক পৰিচালনা কৰে। এইটোৱে হয়তো দূৰৰ পৰা ছেটিংসমূহ পৰিচালনা কৰিব আৰু ব্যৱহাৰকাৰীৰ কার্যকলাপ নিৰীক্ষণ কৰিব পাৰে।</translation>
 <translation id="871560550817059752">বিফল হৈছে - চিয়াহী শেষ হৈছে</translation>
 <translation id="8726019395068607495">বন্ধ হৈছে - দুৱাৰ খোল খাই আছে</translation>
diff --git a/chromeos/strings/chromeos_strings_az.xtb b/chromeos/strings/chromeos_strings_az.xtb
index 0983369..1d57e3cd 100644
--- a/chromeos/strings/chromeos_strings_az.xtb
+++ b/chromeos/strings/chromeos_strings_az.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">Parolu dəyişin</translation>
 <translation id="8208861521865154048">İmtiyazlar</translation>
 <translation id="8347227221149377169">Çap işləri</translation>
+<translation id="8352772353338965963">Çoxsaylı giriş üçün hesab əlavə edin. Bu hesablara parolsuz daxil olmaq olar, ona görə də bu funksiya yalnız güvənilən hesablar ilə işlədilməlidir.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> bu istifadəçini idarə edir. O, ayarları məsafədən idarə edə və istifadəçi fəaliyyətini izləyə bilər.</translation>
 <translation id="871560550817059752">Alınmadı - Mürəkkəb yoxdur</translation>
 <translation id="8726019395068607495">Dayanıb - Qapı açıqdır</translation>
diff --git a/chromeos/strings/chromeos_strings_be.xtb b/chromeos/strings/chromeos_strings_be.xtb
index 8e4d40ea..8083bfb 100644
--- a/chromeos/strings/chromeos_strings_be.xtb
+++ b/chromeos/strings/chromeos_strings_be.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Змяніць пароль</translation>
 <translation id="8208861521865154048">Бонусы</translation>
 <translation id="8347227221149377169">Заданні друку</translation>
+<translation id="8352772353338965963">Дадайце ўліковы запіс для функцыі ўваходу ў некалькі ўліковых запісаў. Гэта функцыя дае магчымасць пераключацца паміж уліковымі запісамі, у якія выкананы ўваход, без уводу пароля. Таму выкарыстоўвайце яе толькі для ўліковых запісаў, якім давяраеце.</translation>
 <translation id="8701136875688985581">Гэты карыстальнік знаходзіцца пад кіраваннем дамена <ph name="ENROLLMENT_DOMAIN" />. Дамен можа кіраваць наладамі карыстальніка і адсочваць яго дзеянні.</translation>
 <translation id="871560550817059752">Збой: скончылася чарніла</translation>
 <translation id="8726019395068607495">Спынена: дзверцы прынтара адкрыты</translation>
diff --git a/chromeos/strings/chromeos_strings_bg.xtb b/chromeos/strings/chromeos_strings_bg.xtb
index 72a9d90..ce43475a 100644
--- a/chromeos/strings/chromeos_strings_bg.xtb
+++ b/chromeos/strings/chromeos_strings_bg.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Промяна на паролата</translation>
 <translation id="8208861521865154048">Предимства</translation>
 <translation id="8347227221149377169">Задания за отпечатване</translation>
+<translation id="8352772353338965963">Добавете профил към функцията за централизиран вход. Всички профили, в които влезете чрез нея, ще бъдат достъпни без парола, така че трябва да използвате тази функция само с надеждни профили.</translation>
 <translation id="8701136875688985581">Този потребител се управлява от <ph name="ENROLLMENT_DOMAIN" />. Възможно е отдалечено управление на настройките и наблюдение на потребителската активност.</translation>
 <translation id="871560550817059752">Неуспешно – няма мастило</translation>
 <translation id="8726019395068607495">Спряло – вратичката е отворена</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb
index bb5b126..2242033 100644
--- a/chromeos/strings/chromeos_strings_bn.xtb
+++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">পাসওয়ার্ড পরিবর্তন করুন</translation>
 <translation id="8208861521865154048">বিশেষ সুবিধা</translation>
 <translation id="8347227221149377169">প্রিন্ট করার কাজগুলি</translation>
+<translation id="8352772353338965963">একাধিক সাইন-ইন-এ একটি অ্যাকাউন্ট যোগ করুন৷ সমস্ত সাইন-ইন থাকা অ্যাকাউন্টগুলি কোনো পাসওয়ার্ড ছাড়াই অ্যাক্সেস করা যাবে, তাই এই বৈশিষ্ট্যটি শুধুমাত্র বিশ্বস্ত অ্যাকাউন্টগুলির সাথে ব্যবহার করা উচিৎ৷</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> এই ব্যবহারকারীকে ম্যানেজ করে। এটি দূর থেকে সেটিংস ম্যানেজ করতে পারে এবং ব্যবহারকারীর গতিবিধির উপর নজর রাখতে পারে।</translation>
 <translation id="871560550817059752">প্রিন্ট করা যায়নি - প্রিন্টারে কালি নেই</translation>
 <translation id="8726019395068607495">বন্ধ হয়ে গেছে - প্রিন্টার ডোর খোলা আছে</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb
index 15c8fc1..18c8618 100644
--- a/chromeos/strings/chromeos_strings_bs.xtb
+++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Promijenite lozinku</translation>
 <translation id="8208861521865154048">Privilegije</translation>
 <translation id="8347227221149377169">Zadaci štampanja</translation>
+<translation id="8352772353338965963">Dodajte račun za višestruku prijavu. Svim računima na kojima je izvršena prijava je moguće pristupiti bez lozinke. Ovu funkciju treba koristiti isključivo s pouzdanim računima.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> upravlja ovim korisnikom. Može udaljeno upravljati postavkama i pratiti aktivnost korisnika.</translation>
 <translation id="871560550817059752">Nije uspjelo – nema tinte</translation>
 <translation id="8726019395068607495">Zaustavljeno – poklopac je otvoren</translation>
diff --git a/chromeos/strings/chromeos_strings_ca.xtb b/chromeos/strings/chromeos_strings_ca.xtb
index c67033d..adbb7944 100644
--- a/chromeos/strings/chromeos_strings_ca.xtb
+++ b/chromeos/strings/chromeos_strings_ca.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Canvia la contrasenya</translation>
 <translation id="8208861521865154048">Avantatges</translation>
 <translation id="8347227221149377169">Tasques d'impressió</translation>
+<translation id="8352772353338965963">Afegiu un compte per a l'inici de sessió múltiple. Es pot accedir a tots el comptes registrats sense contrasenya, de manera que només hauríeu d'utilitzar aquesta funció en comptes de confiança.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> gestiona aquest usuari. És possible que gestioni la configuració i monitori l'activitat de l'usuari de manera remota.</translation>
 <translation id="871560550817059752">Error: no hi ha tinta</translation>
 <translation id="8726019395068607495">S'ha aturat: porta oberta</translation>
diff --git a/chromeos/strings/chromeos_strings_cs.xtb b/chromeos/strings/chromeos_strings_cs.xtb
index 68f2ba4..d9e3ea5 100644
--- a/chromeos/strings/chromeos_strings_cs.xtb
+++ b/chromeos/strings/chromeos_strings_cs.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Změnit heslo</translation>
 <translation id="8208861521865154048">Výhody</translation>
 <translation id="8347227221149377169">Tiskové úlohy</translation>
+<translation id="8352772353338965963">Přidat účet do vícenásobného přihlášení. Ke všem přihlášeným účtům lze přistupovat bez zadání hesla, proto byste tuto funkci měli používat pouze s důvěryhodnými účty.</translation>
 <translation id="8701136875688985581">Tohoto uživatele spravuje doména <ph name="ENROLLMENT_DOMAIN" />. Může vzdáleně spravovat nastavení a sledovat aktivitu uživatele.</translation>
 <translation id="871560550817059752">Tisk selhal – došel inkoust</translation>
 <translation id="8726019395068607495">Zastaveno – jsou otevřená dvířka</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb
index 6b56c6a3..3a0a016 100644
--- a/chromeos/strings/chromeos_strings_da.xtb
+++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">Skift adgangskode</translation>
 <translation id="8208861521865154048">Fordele</translation>
 <translation id="8347227221149377169">Udskriftsjobs</translation>
+<translation id="8352772353338965963">Føj en konto til samlet login fra flere konti. Det er muligt at få adgang til alle de konti, der er logget ind på, uden en adgangskode, så denne funktion bør kun bruges til de konti, du har tillid til.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> administrerer denne bruger. Det kan administrere indstillinger via fjernadgang og overvåge brugeraktivitet.</translation>
 <translation id="871560550817059752">Handlingen mislykkedes – Mangler blæk</translation>
 <translation id="8726019395068607495">Stoppet – Åben låge</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb
index 2ceb7ffd..1637e47 100644
--- a/chromeos/strings/chromeos_strings_de.xtb
+++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Passwort ändern</translation>
 <translation id="8208861521865154048">Vorteile</translation>
 <translation id="8347227221149377169">Druckaufträge</translation>
+<translation id="8352772353338965963">Fügen Sie ein Konto für die Mehrfachanmeldung hinzu. Sie können auf alle angemeldeten Konten zugreifen, ohne ein Passwort eingeben zu müssen. Verwenden Sie diese Funktion daher nur mit vertrauenswürdigen Konten.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> verwaltet diesen Nutzer. Es werden möglicherweise per Remotezugriff Einstellungen verwaltet und Nutzeraktivitäten überwacht.</translation>
 <translation id="871560550817059752">Fehlgeschlagen – Keine Tinte</translation>
 <translation id="8726019395068607495">Angehalten – Druckerklappe offen</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb
index 4c5fdca5..454a1ab6 100644
--- a/chromeos/strings/chromeos_strings_el.xtb
+++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Αλλαγή κωδικού πρόσβασης</translation>
 <translation id="8208861521865154048">Προνόμια</translation>
 <translation id="8347227221149377169">Εργασίες εκτύπωσης</translation>
+<translation id="8352772353338965963">Προσθέστε έναν λογαριασμό στη σύνδεση σε πολλούς λογαριασμούς. Όλοι οι συνδεδεμένοι λογαριασμοί μπορούν να προσπελαστούν χωρίς κωδικό πρόσβασης, επομένως αυτή η δυνατότητα πρέπει να χρησιμοποιείται μόνο με αξιόπιστους λογαριασμούς.</translation>
 <translation id="8701136875688985581">Ο τομέας <ph name="ENROLLMENT_DOMAIN" /> διαχειρίζεται αυτόν τον χρήστη. Ενδέχεται να διαχειρίζεται απομακρυσμένα τις ρυθμίσεις και να παρακολουθεί τη δραστηριότητα του χρήστη.</translation>
 <translation id="871560550817059752">Σφάλμα - Τελείωσε το μελάνι</translation>
 <translation id="8726019395068607495">Διακοπή - Ανοικτή θύρα</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb
index 50f9696..83f9e65 100644
--- a/chromeos/strings/chromeos_strings_en-GB.xtb
+++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Change password</translation>
 <translation id="8208861521865154048">Perks</translation>
 <translation id="8347227221149377169">Print jobs</translation>
+<translation id="8352772353338965963">Add an account to multiple sign-in. All signed-in accounts can be accessed without a password, so this feature should only be used with trusted accounts.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> manages this user. It may remotely manage settings and monitor user activity.</translation>
 <translation id="871560550817059752">Failed – Out of ink</translation>
 <translation id="8726019395068607495">Stopped – door open</translation>
diff --git a/chromeos/strings/chromeos_strings_es-419.xtb b/chromeos/strings/chromeos_strings_es-419.xtb
index 5908599..71c9366 100644
--- a/chromeos/strings/chromeos_strings_es-419.xtb
+++ b/chromeos/strings/chromeos_strings_es-419.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Cambiar contraseña</translation>
 <translation id="8208861521865154048">Beneficios</translation>
 <translation id="8347227221149377169">Trabajos de impresión</translation>
+<translation id="8352772353338965963">Agrega una cuenta para el acceso múltiple. Puedes acceder a todas las cuentas abiertas sin una contraseña, por lo que esta función solo debe utilizarse con cuentas de confianza.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> administra a este usuario. Puede supervisar la actividad del usuario y cambiar la configuración de forma remota.</translation>
 <translation id="871560550817059752">Error: Sin tinta</translation>
 <translation id="8726019395068607495">Se detuvo: la tapa está abierta</translation>
diff --git a/chromeos/strings/chromeos_strings_es.xtb b/chromeos/strings/chromeos_strings_es.xtb
index 612859c..df54738 100644
--- a/chromeos/strings/chromeos_strings_es.xtb
+++ b/chromeos/strings/chromeos_strings_es.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">Cambiar contraseña</translation>
 <translation id="8208861521865154048">Ventajas</translation>
 <translation id="8347227221149377169">Trabajos de impresión</translation>
+<translation id="8352772353338965963">Se puede añadir una cuenta al inicio de sesión múltiple y acceder a todas las cuentas en las que se haya iniciado sesión sin una contraseña, por lo que esta función solo se debe utilizar con cuentas de confianza.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> gestiona este usuario. Puede gestionar ajustes y supervisar la actividad del usuario de forma remota.</translation>
 <translation id="871560550817059752">No se ha podido imprimir - Sin tinta</translation>
 <translation id="8726019395068607495">Detenido: cubierta abierta</translation>
diff --git a/chromeos/strings/chromeos_strings_et.xtb b/chromeos/strings/chromeos_strings_et.xtb
index 89fbbda08..6be02b9 100644
--- a/chromeos/strings/chromeos_strings_et.xtb
+++ b/chromeos/strings/chromeos_strings_et.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Muuda parooli</translation>
 <translation id="8208861521865154048">Hüved</translation>
 <translation id="8347227221149377169">Prinditööd</translation>
+<translation id="8352772353338965963">Lisage mitmele kontole sisselogimiseks konto. Kõigile kontodele, kuhu on sisse logitud, pääseb juurde ilma paroolita, seega soovitame seda funktsiooni kasutada vaid usaldusväärsete kontodega.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> haldab seda kasutajat. See võib eemalt hallata seadeid ja jälgida kasutaja tegevusi.</translation>
 <translation id="871560550817059752">Ebaõnnestus – tint on otsas</translation>
 <translation id="8726019395068607495">Peatatud – luuk on avatud</translation>
diff --git a/chromeos/strings/chromeos_strings_eu.xtb b/chromeos/strings/chromeos_strings_eu.xtb
index b81637a..354c5a7 100644
--- a/chromeos/strings/chromeos_strings_eu.xtb
+++ b/chromeos/strings/chromeos_strings_eu.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Aldatu pasahitza</translation>
 <translation id="8208861521865154048">Abantailak</translation>
 <translation id="8347227221149377169">Inprimatze-lanak</translation>
+<translation id="8352772353338965963">Gehitu kontu bat saio-hasiera anitzean. Saioa hasita daukaten kontu guztiak pasahitzik gabe atzi daitezkeenez, kontu fidagarriekin soilik erabili behar da eginbide hori.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> domeinuak kudeatzen du erabiltzaile hau. Ezarpenak kudeatu eta erabiltzailearen jarduerak gainbegira ditzake urrunetik.</translation>
 <translation id="871560550817059752">Hutsegitea - Ez dago tintarik</translation>
 <translation id="8726019395068607495">Geldituta: atea irekita dago</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb
index 7a0d6ba..9d9bdff 100644
--- a/chromeos/strings/chromeos_strings_fa.xtb
+++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">تغییر گذرواژه</translation>
 <translation id="8208861521865154048">هدیه‌ها</translation>
 <translation id="8347227221149377169">کارهای چاپی</translation>
+<translation id="8352772353338965963">افزودن یک حساب برای ورود چندگانه به سیستم. کلیه حساب‌هایی که به سیستم وارد شده‌اند بدون گذرواژه قابل دسترسی هستند، بنابراین این قابلیت فقط باید با حساب‌های مورداعتماد استفاده شود.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> این کاربر را مدیریت می‌کند. می‌تواند تنظیمات را ازراه‌دور مدیریت کند و بر فعالیت کاربر نظارت کند.</translation>
 <translation id="871560550817059752">انجام نشد - جوهر تمام شده است</translation>
 <translation id="8726019395068607495">متوقف شد - در باز است</translation>
diff --git a/chromeos/strings/chromeos_strings_fi.xtb b/chromeos/strings/chromeos_strings_fi.xtb
index 8172a33..edd192f44 100644
--- a/chromeos/strings/chromeos_strings_fi.xtb
+++ b/chromeos/strings/chromeos_strings_fi.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Vaihda salasana</translation>
 <translation id="8208861521865154048">Edut</translation>
 <translation id="8347227221149377169">Tulostustyöt</translation>
+<translation id="8352772353338965963">Lisää tili useaan tiliin kirjautumiseen. Kaikkia tilejä, joihin on kirjauduttu sisään, voi käyttää ilman salasanaa. Käytä siis ominaisuutta vain luotetuilla tileillä.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> on tämän käyttäjän ylläpitäjä. Se voi muuttaa asetuksia ja seurata käyttäjän toimia etänä.</translation>
 <translation id="871560550817059752">Epäonnistui – Muste loppu</translation>
 <translation id="8726019395068607495">Pysähtynyt – Luukku auki</translation>
diff --git a/chromeos/strings/chromeos_strings_fil.xtb b/chromeos/strings/chromeos_strings_fil.xtb
index bc49ea7e..35ac239 100644
--- a/chromeos/strings/chromeos_strings_fil.xtb
+++ b/chromeos/strings/chromeos_strings_fil.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Palitan ang password</translation>
 <translation id="8208861521865154048">Mga Perk</translation>
 <translation id="8347227221149377169">Mga pag-print</translation>
+<translation id="8352772353338965963">Magdagdag ng account sa multiple na pag-sign in. Maa-access ang lahat ng naka-sign in na account nang walang password, kaya dapat na gamitin lang ang feature na ito sa mga pinagkakatiwalaang account.</translation>
 <translation id="8701136875688985581">Pinapamahalaan ng <ph name="ENROLLMENT_DOMAIN" /> ang user na ito. Posible nitong pamahalaan ang mga setting at subaybayan ang aktibidad ng user sa remote na paraan.</translation>
 <translation id="871560550817059752">Hindi na-print - Wala nang ink</translation>
 <translation id="8726019395068607495">Huminto - Nakabukas ang door</translation>
diff --git a/chromeos/strings/chromeos_strings_fr-CA.xtb b/chromeos/strings/chromeos_strings_fr-CA.xtb
index 4c205dd..677cc4e 100644
--- a/chromeos/strings/chromeos_strings_fr-CA.xtb
+++ b/chromeos/strings/chromeos_strings_fr-CA.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Changer le mot de passe</translation>
 <translation id="8208861521865154048">Avantages</translation>
 <translation id="8347227221149377169">Tâches d'impression</translation>
+<translation id="8352772353338965963">Ajouter un compte à la connexion multicompte. Tous les comptes connectés sont accessibles sans mot de passe. Nous vous recommandons donc de n'utiliser cette fonctionnalité qu'avec des comptes fiables.</translation>
 <translation id="8701136875688985581">Le domaine <ph name="ENROLLMENT_DOMAIN" /> gère cet utilisateur. Il peut gérer les paramètres et faire le suivi de l'activité de l'utilisateur à distance.</translation>
 <translation id="871560550817059752">Échec : à court d'encre</translation>
 <translation id="8726019395068607495">Tâchez arrêtée : porte de l'imprimante ouverte</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb
index 3fc1479..48dd990 100644
--- a/chromeos/strings/chromeos_strings_fr.xtb
+++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Modifier le mot de passe</translation>
 <translation id="8208861521865154048">Avantages</translation>
 <translation id="8347227221149377169">Tâches d'impression</translation>
+<translation id="8352772353338965963">Ajoutez un compte à la connexion multicompte. Tous les comptes connectés sont accessibles sans mot de passe. Nous vous recommandons donc de n'utiliser cette fonctionnalité qu'avec des comptes fiables.</translation>
 <translation id="8701136875688985581">Cet utilisateur est géré par <ph name="ENROLLMENT_DOMAIN" />, qui peut modifier ses paramètres et surveiller son activité à distance.</translation>
 <translation id="871560550817059752">Échec – À court d'encre</translation>
 <translation id="8726019395068607495">Tâche suspendue - Capot ouvert</translation>
diff --git a/chromeos/strings/chromeos_strings_gl.xtb b/chromeos/strings/chromeos_strings_gl.xtb
index d12bf708..482f7ec 100644
--- a/chromeos/strings/chromeos_strings_gl.xtb
+++ b/chromeos/strings/chromeos_strings_gl.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Cambiar contrasinal</translation>
 <translation id="8208861521865154048">Vantaxes</translation>
 <translation id="8347227221149377169">Traballos de impresión</translation>
+<translation id="8352772353338965963">Engade unha conta ao inicio de sesión múltiple. É posible acceder a todas as contas en que iniciaches sesión sen necesidade de inserir un contrasinal, polo que esta función só se debe utilizar coas contas de confianza.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> xestiona este usuario. Pode xestionar a súa configuración e controlar a súa actividade de forma remota.</translation>
 <translation id="871560550817059752">Produciuse un erro: a impresora quedou sen tinta</translation>
 <translation id="8726019395068607495">Detívose (a tapa está aberta)</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb
index 774b9b0..077c66b4 100644
--- a/chromeos/strings/chromeos_strings_gu.xtb
+++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">પાસવર્ડ બદલો</translation>
 <translation id="8208861521865154048">લાભ</translation>
 <translation id="8347227221149377169">પ્રિન્ટ કરવાના કામો</translation>
+<translation id="8352772353338965963">એકથી વધુ સાઇન ઇન કરવા એક એકાઉન્ટ ઉમેરો. બધા સાઇન ઇન એકાઉન્ટ પાસવર્ડ વગર ઉપયોગ કરી શકાય છે, તેથી આ સુવિધા માત્ર વિશ્વસનીય એકાઉન્ટ સાથે ઉપયોગમાં આવવી જોઇએ.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> આ વપરાશકર્તાને મેનેજ કરે છે. આ કદાચ સેટિંગ અને વપરાશકર્તાની પ્રવૃત્તિને દૂરથી મેનેજ અને તેનું નિરીક્ષણ કરી શકે.</translation>
 <translation id="871560550817059752">નિષ્ફળ થયું - પ્રિન્ટરમાં શાહી પૂરી થઈ ગઈ છે</translation>
 <translation id="8726019395068607495">બંધ - ઢાંકણ ખુલ્લું છે</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb
index 852e0ae..579a853 100644
--- a/chromeos/strings/chromeos_strings_hi.xtb
+++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">पासवर्ड बदलें</translation>
 <translation id="8208861521865154048">फ़ायदे</translation>
 <translation id="8347227221149377169">प्रिंट जॉब</translation>
+<translation id="8352772353338965963">एक से ज़्यादा साइन-इन के लिए कोई खाता जोड़ें. सभी साइन इन किए गए खातों को पासवर्ड के बिना एक्सेस किया जा सकता है, इसलिए इस सुविधा का इस्तेमाल सिर्फ़ विश्वसनीय खातों के साथ किया जाना चाहिए.</translation>
 <translation id="8701136875688985581">इस उपयोगकर्ता को <ph name="ENROLLMENT_DOMAIN" /> प्रबंधित करता है. यह दूर से सेटिंग प्रबंधित कर सकता है. साथ ही, उपयोगकर्ता गतिविधि की निगरानी कर सकता है.</translation>
 <translation id="871560550817059752">प्रिंट नहीं हो पाया - स्याही खत्म हो गई</translation>
 <translation id="8726019395068607495">बंद हो गया - दरवाज़ा खुला है</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb
index 81dab3f..10b966b 100644
--- a/chromeos/strings/chromeos_strings_hr.xtb
+++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Promjena zaporke</translation>
 <translation id="8208861521865154048">Pogodnosti</translation>
 <translation id="8347227221149377169">Zadaci ispisa</translation>
+<translation id="8352772353338965963">Dodajte račun na višestruku prijavu. Svim računima na koje ste prijavljeni može se pristupiti bez zaporke, pa bi se ta značajka trebala upotrebljavati samo s pouzdanim računima.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> upravlja ovim korisnikom. Može daljinski upravljati postavkama i nadzirati aktivnost korisnika.</translation>
 <translation id="871560550817059752">Nije uspjelo – nema tinte</translation>
 <translation id="8726019395068607495">Zaustavljeno – vratašca su otvorena</translation>
diff --git a/chromeos/strings/chromeos_strings_hu.xtb b/chromeos/strings/chromeos_strings_hu.xtb
index 28814cb..fa889575 100644
--- a/chromeos/strings/chromeos_strings_hu.xtb
+++ b/chromeos/strings/chromeos_strings_hu.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Jelszó módosítása</translation>
 <translation id="8208861521865154048">Előnyök</translation>
 <translation id="8347227221149377169">Nyomtatási feladatok</translation>
+<translation id="8352772353338965963">Adjon hozzá egy fiókot a többfiókos bejelentkezéshez. Az összes bejelentkezett fiók elérhető a jelszó megadása nélkül, ezért ezt a funkciót csak megbízható fiókokkal használja.</translation>
 <translation id="8701136875688985581">A(z) <ph name="ENROLLMENT_DOMAIN" /> kezeli ezt a felhasználót. A domain távolról módosíthatja a beállításokat, és figyelheti a felhasználó tevékenységeit.</translation>
 <translation id="871560550817059752">Sikertelen – Kifogyott a tinta</translation>
 <translation id="8726019395068607495">Leállt – Nyitva van a nyomtató fedele</translation>
diff --git a/chromeos/strings/chromeos_strings_hy.xtb b/chromeos/strings/chromeos_strings_hy.xtb
index be390fa3..81f2a18 100644
--- a/chromeos/strings/chromeos_strings_hy.xtb
+++ b/chromeos/strings/chromeos_strings_hy.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Փոխել գաղտնաբառը</translation>
 <translation id="8208861521865154048">Բոնուսներ</translation>
 <translation id="8347227221149377169">Տպելու առաջադրանքներ</translation>
+<translation id="8352772353338965963">Ավելացնել հաշիվ բազմակի մուտքի համակարգում: Բոլոր մուտք գործած հաշիվները մատչելի են առանց գաղտնաբառի մուտքագրման, ուստի այս գործառույթը պետք է միայն օգտագործվի վստահելի հաշիվների հետ:</translation>
 <translation id="8701136875688985581">Այս օգտատերը կառավարվում է <ph name="ENROLLMENT_DOMAIN" /> տիրույթի կողմից։ Այն կարող է հեռակա կառավարել կարգավորումները և վերահսկել օգտատիրոջ գործողությունները։</translation>
 <translation id="871560550817059752">Չհաջողվեց տպել – Թանաքը սպառվել է</translation>
 <translation id="8726019395068607495">Դադարեցվել է – Դռնակը բաց է</translation>
diff --git a/chromeos/strings/chromeos_strings_id.xtb b/chromeos/strings/chromeos_strings_id.xtb
index 5cb7a09..b1c4f49 100644
--- a/chromeos/strings/chromeos_strings_id.xtb
+++ b/chromeos/strings/chromeos_strings_id.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Ubah sandi</translation>
 <translation id="8208861521865154048">Keuntungan</translation>
 <translation id="8347227221149377169">Pekerjaan cetak</translation>
+<translation id="8352772353338965963">Tambahkan akun ke fitur masuk banyak akun. Semua akun yang masuk dapat diakses tanpa menggunakan sandi, sebaiknya hanya gunakan akun ini dengan akun tepercaya.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> mengelola pengguna ini. Domain dapat mengelola setelan dan memantau aktivitas pengguna dari jarak jauh.</translation>
 <translation id="871560550817059752">Gagal - Tinta habis</translation>
 <translation id="8726019395068607495">Dihentikan - Tutup terbuka</translation>
diff --git a/chromeos/strings/chromeos_strings_is.xtb b/chromeos/strings/chromeos_strings_is.xtb
index aeebd89..e6f52bd 100644
--- a/chromeos/strings/chromeos_strings_is.xtb
+++ b/chromeos/strings/chromeos_strings_is.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Breyta aðgangsorði</translation>
 <translation id="8208861521865154048">Fríðindi</translation>
 <translation id="8347227221149377169">Prentverk</translation>
+<translation id="8352772353338965963">Bæta reikningi við innskráningu á marga reikninga. Hægt er að fá aðgang að öllum innskráðum reikningum án aðgangsorðs og því ætti aðeins að nota þennan eiginleika með traustum reikningum.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> stjórnar þessum notanda. Það getur valið stillingar og skoðað notandavirkni með fjartengingu.</translation>
 <translation id="871560550817059752">Mistókst – blekið er búið</translation>
 <translation id="8726019395068607495">Stöðvað – hlíf er opin</translation>
diff --git a/chromeos/strings/chromeos_strings_it.xtb b/chromeos/strings/chromeos_strings_it.xtb
index 4f4d1568..17470bd6 100644
--- a/chromeos/strings/chromeos_strings_it.xtb
+++ b/chromeos/strings/chromeos_strings_it.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Cambia password</translation>
 <translation id="8208861521865154048">Vantaggi</translation>
 <translation id="8347227221149377169">Processi di stampa</translation>
+<translation id="8352772353338965963">Aggiungi un account per l'accesso simultaneo. Poiché gli account che hanno effettuato l'accesso sono tutti accessibili senza password, devi utilizzare questa funzione solo con gli account attendibili.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> gestisce questo utente. Può gestire in remoto le impostazioni e monitorare l'attività utente.</translation>
 <translation id="871560550817059752">Operazione non riuscita - Inchiostro esaurito</translation>
 <translation id="8726019395068607495">Operazione interrotta - Sportello aperto</translation>
diff --git a/chromeos/strings/chromeos_strings_iw.xtb b/chromeos/strings/chromeos_strings_iw.xtb
index e5ac73c..bf108c22 100644
--- a/chromeos/strings/chromeos_strings_iw.xtb
+++ b/chromeos/strings/chromeos_strings_iw.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">שינוי הסיסמה</translation>
 <translation id="8208861521865154048">הטבות</translation>
 <translation id="8347227221149377169">משימות הדפסה</translation>
+<translation id="8352772353338965963">הוסף חשבון לכניסה עם מספר חשבונות. כל החשבונות שאליהם נכנסת נגישים ללא סיסמה, לכן יש להשתמש בתכונה זו עם חשבונות אמינים בלבד.</translation>
 <translation id="8701136875688985581">משתמש זה מנוהל על ידי <ph name="ENROLLMENT_DOMAIN" />. הדומיין עשוי לנהל מרחוק את ההגדרות ולעקוב אחרי פעילות המשתמש.</translation>
 <translation id="871560550817059752">נכשלה – הדיו נגמר</translation>
 <translation id="8726019395068607495">הפסיקה – דלת המדפסת פתוחה</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb
index ed19942..af8c8896b 100644
--- a/chromeos/strings/chromeos_strings_ja.xtb
+++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">パスワードの変更</translation>
 <translation id="8208861521865154048">特典</translation>
 <translation id="8347227221149377169">印刷ジョブ</translation>
+<translation id="8352772353338965963">マルチログインにアカウントを追加します。ログインしているすべてのアカウントにパスワードなしでアクセスできるようになるため、この機能は信頼できるアカウントでのみ使用してください。</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> がこのユーザーを管理しています。設定の管理とユーザー アクティビティの監視がリモートで行われることがあります。</translation>
 <translation id="871560550817059752">失敗 - インクがありません</translation>
 <translation id="8726019395068607495">停止 - 扉が開いています</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb
index 526a207..eb8669c 100644
--- a/chromeos/strings/chromeos_strings_ka.xtb
+++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">პაროლის შეცვლა</translation>
 <translation id="8208861521865154048">ბონუსები</translation>
 <translation id="8347227221149377169">ბეჭდვის დავალებები</translation>
+<translation id="8352772353338965963">დაამატეთ ანგარიში მრავლობითი შესვლისთვის. სისტემაში შესულ ანგარიშზე წვდომის მიღება შესაძლებელია პაროლის შეყვანის გარეშე, ამიტომ ეს ფუნქცია უნდა გამოიყენოთ მხოლოდ სანდო ანგარიშებზე.</translation>
 <translation id="8701136875688985581">ამ მომხმარებელს მართავს <ph name="ENROLLMENT_DOMAIN" />. მას შეუძლია პარამეტრების დისტანციურად მართვა და მომხმარებლის აქტივობის მონიტორინგი.</translation>
 <translation id="871560550817059752">ვერ მოხერხდა — მელანი გაუთავდა</translation>
 <translation id="8726019395068607495">გაჩერდა — პრინტერის კარი ღიაა</translation>
diff --git a/chromeos/strings/chromeos_strings_kk.xtb b/chromeos/strings/chromeos_strings_kk.xtb
index c2d79ef..6345a22c 100644
--- a/chromeos/strings/chromeos_strings_kk.xtb
+++ b/chromeos/strings/chromeos_strings_kk.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">Кұпия сөзді өзгерту</translation>
 <translation id="8208861521865154048">Бонустар</translation>
 <translation id="8347227221149377169">Баспа жұмыстары</translation>
+<translation id="8352772353338965963">Бірнеше есептік жазбаға кіру үшін есептік жазба қосыңыз. Барлық кірілген есептік жазбаларға құпия сөзсіз кіруге болады, сондықтан бұл мүмкіндікті тек сенімді есептік жазбалар пайдалануы тиіс.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> пайдаланушыны басқарады. Сонымен қатар қашықтан параметрлерді басқарады және пайдаланушының әрекетін қадағалайды.</translation>
 <translation id="871560550817059752">Сәтсіз: сия бітіп қалды</translation>
 <translation id="8726019395068607495">Тоқтатылды: есігі ашық</translation>
diff --git a/chromeos/strings/chromeos_strings_km.xtb b/chromeos/strings/chromeos_strings_km.xtb
index 22fae94..9790e19 100644
--- a/chromeos/strings/chromeos_strings_km.xtb
+++ b/chromeos/strings/chromeos_strings_km.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">ប្ដូរ​ពាក្យ​សម្ងាត់</translation>
 <translation id="8208861521865154048">អត្ថប្រយោជន៍</translation>
 <translation id="8347227221149377169">ការងារ​បោះពុម្ព</translation>
+<translation id="8352772353338965963">បន្ថែមគណនីមួយដើម្បីចូលពីគណនីច្រើន។ គណនីដែលចូលទាំងអស់អាចចូលប្រើដោយគ្មានពាក្យសម្ងាត់ ដូច្នេះលក្ខណពិសេសនេះគួរត្រូវបានប្រើជាមួយគណនីដែលគួរជឿជាក់តែប៉ុណ្ណោះ។</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> គ្រប់គ្រង​អ្នកប្រើប្រាស់​នេះ។ ដែននេះអាច​តាមដាន​សកម្មភាព​អ្នកប្រើប្រាស់ និង​គ្រប់គ្រង​ការកំណត់​ពីចម្ងាយ​បាន។</translation>
 <translation id="871560550817059752">មិនបានសម្រេច - ​​អស់ទឹកថ្នាំ</translation>
 <translation id="8726019395068607495">បានឈប់ - ទ្វារចំហ</translation>
diff --git a/chromeos/strings/chromeos_strings_kn.xtb b/chromeos/strings/chromeos_strings_kn.xtb
index c8c7ffd..fe21168 100644
--- a/chromeos/strings/chromeos_strings_kn.xtb
+++ b/chromeos/strings/chromeos_strings_kn.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">ಪಾಸ್‌ವರ್ಡ್ ಬದಲಿಸಿ</translation>
 <translation id="8208861521865154048">ಪರ್ಕ್‌ಗಳು</translation>
 <translation id="8347227221149377169">ಮುದ್ರಣ ಕಾರ್ಯಗಳು</translation>
+<translation id="8352772353338965963">ಬಹು ಸೈನ್‌ಇನ್‌ಗೆ ಖಾತೆಯನ್ನು ಸೇರಿಸಿ. ಎಲ್ಲ ಸೈನ್‌-ಇನ್‌ ಮಾಡಲಾದ ಖಾತೆಗಳನ್ನು ಪಾಸ್‌ವರ್ಡ್‌ ಇಲ್ಲದೆಯೇ ಪ್ರವೇಶಿಸಬಹುದಾಗಿದೆ, ಹಾಗಾಗಿ ಈ ವೈಶಿಷ್ಟ್ಯವನ್ನು ವಿಶ್ವಾಸಾರ್ಹ ಖಾತೆಗಳಿಗಾಗಿ ಮಾತ್ರ ಬಳಸಬೇಕು.</translation>
 <translation id="8701136875688985581">ಈ ಬಳಕೆದಾರರನ್ನು <ph name="ENROLLMENT_DOMAIN" /> ನಿರ್ವಹಿಸುತ್ತದೆ. ಇದು ದೂರದಿಂದಲೇ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಬಹುದು ಮತ್ತು ಬಳಕೆದಾರರ ಚಟುವಟಿಕೆಯ ಮೇಲೆ ಗಮನವಿರಿಸಬಹುದು.</translation>
 <translation id="871560550817059752">ವಿಫಲವಾಗಿದೆ - ಇಂಕ್ ಖಾಲಿಯಾಗಿದೆ</translation>
 <translation id="8726019395068607495">ನಿಲ್ಲಿಸಲಾಗಿದೆ - ಡೋರ್ ಓಪನ್ ಆಗಿದೆ</translation>
diff --git a/chromeos/strings/chromeos_strings_ko.xtb b/chromeos/strings/chromeos_strings_ko.xtb
index 11004d7..e7dea07 100644
--- a/chromeos/strings/chromeos_strings_ko.xtb
+++ b/chromeos/strings/chromeos_strings_ko.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">비밀번호 변경</translation>
 <translation id="8208861521865154048">혜택</translation>
 <translation id="8347227221149377169">인쇄 작업</translation>
+<translation id="8352772353338965963">멀티 로그인에 계정을 추가하세요. 비밀번호를 입력하지 않고 모든 로그인 계정에 액세스할 수 있으므로 이 기능은 신뢰할 수 있는 계정에만 사용해야 합니다.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" />에서 이 사용자를 관리합니다. 원격으로 설정을 관리하고 사용자 활동을 모니터링할 수 있습니다.</translation>
 <translation id="871560550817059752">실패 - 잉크 없음</translation>
 <translation id="8726019395068607495">중지됨 - 덮개 열림</translation>
diff --git a/chromeos/strings/chromeos_strings_ky.xtb b/chromeos/strings/chromeos_strings_ky.xtb
index 3cf5fd53..9fc2d33 100644
--- a/chromeos/strings/chromeos_strings_ky.xtb
+++ b/chromeos/strings/chromeos_strings_ky.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Сызсөздү өзгөртүү</translation>
 <translation id="8208861521865154048">Бонустар</translation>
 <translation id="8347227221149377169">Басып чыгаруу тапшырмалары</translation>
+<translation id="8352772353338965963">Бир нече профиль менен кирүү үчүн каттоо эсебин кошуңуз. Катталган бардык аккаунттарына кирүүдө сырсөз талап кылынбагандыктан, бул мүмкүнчүлүктү ишенимдүү каттоо эсептери гана колдонушу керек.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> бул колдонуучуну башкарат. Ал алыстан жөндөөлөрдү башкарып, колдонуучунун аракеттерин көзөмөлдөй алат.</translation>
 <translation id="871560550817059752">Басылып чыгарылган жок - Сыя түгөнүп калды</translation>
 <translation id="8726019395068607495">Токтоду – Эшик ачык</translation>
diff --git a/chromeos/strings/chromeos_strings_lo.xtb b/chromeos/strings/chromeos_strings_lo.xtb
index 295ee74..29203948 100644
--- a/chromeos/strings/chromeos_strings_lo.xtb
+++ b/chromeos/strings/chromeos_strings_lo.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">ປ່ຽນລະຫັດຜ່ານ</translation>
 <translation id="8208861521865154048">ສິດທິປະໂຫຍດຕ່າງໆ</translation>
 <translation id="8347227221149377169">ວຽກການພິມ</translation>
+<translation id="8352772353338965963">ເພີ່ມບັນຊີໃສ່ຫຼາຍການລົງຊື່ເຂົ້າໃສ່. ສາມາດເຂົ້າ​ຫາທຸກບັນຊີທີ່ລົງຊື່ເຂົ້າ​ໃຊ້ແລ້ວໂດຍບໍ່ຕ້ອງມີລະຫັດຜ່ານ, ດັ່ງນັ້ນຄວນໃຊ້ແຕ່ຄຸນສົມບັດນີ້ກັບແຕ່ບັນຊີທີ່ເຊື່ອຖືໄດ້ເທົ່ານັ້ນ.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> ຈັດການຜູ້ໃຊ້ນີ້. ມັນອາດຈະຈັດການຕັ້ງຄ່າ ແລະ ຕິດຕາມເບິ່ງການເຄື່ອນໄຫວຂອງຜູ້ໃຊ້ຈາກທາງໄກໄດ້.</translation>
 <translation id="871560550817059752">ບໍ່ສຳເລັດ, ນໍ້າໝຶກໝົດ</translation>
 <translation id="8726019395068607495">ຢຸດພິມ, ຝາເປີດຢູ່</translation>
diff --git a/chromeos/strings/chromeos_strings_lt.xtb b/chromeos/strings/chromeos_strings_lt.xtb
index d125636..fa1f947 100644
--- a/chromeos/strings/chromeos_strings_lt.xtb
+++ b/chromeos/strings/chromeos_strings_lt.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Keisti slaptažodį</translation>
 <translation id="8208861521865154048">Privilegijos</translation>
 <translation id="8347227221149377169">Spausdinimo užduotys</translation>
+<translation id="8352772353338965963">Pridėkite paskyrą prie kelių paskyrų. Visos paskyros, prie kurių prisijungta, gali būti pasiekiamos be slaptažodžio, todėl ši funkcija turėtų būti naudojama tik su patikimomis paskyromis.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> valdo šį naudotoją. Jis gali nuotoliniu būdu valdyti nustatymus ir stebėti naudotojo veiklą.</translation>
 <translation id="871560550817059752">Nepavyko – baigėsi rašalas</translation>
 <translation id="8726019395068607495">Sustabdyta – atidarytos durelės</translation>
diff --git a/chromeos/strings/chromeos_strings_lv.xtb b/chromeos/strings/chromeos_strings_lv.xtb
index 5e9c1d0..136f3be 100644
--- a/chromeos/strings/chromeos_strings_lv.xtb
+++ b/chromeos/strings/chromeos_strings_lv.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Mainīt paroli</translation>
 <translation id="8208861521865154048">Priekšrocības</translation>
 <translation id="8347227221149377169">Drukas uzdevumi</translation>
+<translation id="8352772353338965963">Pievienojiet kontu vairākkārtējās pierakstīšanās funkcijai. Visiem kontiem, kuros esat pierakstījies, varēs piekļūt, neievadot paroli, tāpēc šī funkcija ir jāizmanto tikai uzticamiem kontiem.</translation>
 <translation id="8701136875688985581">Šis lietotājs tiek pārvaldīts domēnā<ph name="ENROLLMENT_DOMAIN" />. Šajā domēnā var tikt attālināti pārvaldīti iestatījumi un uzraudzītas lietotāja darbības.</translation>
 <translation id="871560550817059752">Neizdevās — beigusies tinte</translation>
 <translation id="8726019395068607495">Apturēts — durtiņas ir atvērtas</translation>
diff --git a/chromeos/strings/chromeos_strings_mk.xtb b/chromeos/strings/chromeos_strings_mk.xtb
index c4d7fd2..d303aac 100644
--- a/chromeos/strings/chromeos_strings_mk.xtb
+++ b/chromeos/strings/chromeos_strings_mk.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Промени лозинка</translation>
 <translation id="8208861521865154048">Поволности</translation>
 <translation id="8347227221149377169">Налози за печатење</translation>
+<translation id="8352772353338965963">Додајте сметка за повеќекратно најавување. Сите најавени сметки се достапни без лозинка, така што оваа можност треба да се користи само со сметки на кои им се верува.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> управува со корисников. Може далечински да управува со поставките и да ја следи активноста на корисникот.</translation>
 <translation id="871560550817059752">Неуспешно - нема мастило</translation>
 <translation id="8726019395068607495">Запрено - вратата е отворена</translation>
diff --git a/chromeos/strings/chromeos_strings_ml.xtb b/chromeos/strings/chromeos_strings_ml.xtb
index 265917c7..69c01c1 100644
--- a/chromeos/strings/chromeos_strings_ml.xtb
+++ b/chromeos/strings/chromeos_strings_ml.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">പാസ്‌വേഡ് മാറ്റുക</translation>
 <translation id="8208861521865154048">പെർക്കുകൾ</translation>
 <translation id="8347227221149377169">പ്രിന്റ് ജോലികൾ</translation>
+<translation id="8352772353338965963">ഒന്നിലധികം സൈൻ-ഇന്നിനായി ഒരു അക്കൗണ്ട് ചേർക്കുക. സൈൻ-ഇൻ ചെയ്‌ത അക്കൗണ്ടുകളെല്ലാം ഒരു പാസ്‌വേഡില്ലാതെ ആക്‌സസ് ചെയ്യാനാകുമെന്നതിനാൽ ഈ സവിശേഷത പരിചയമുള്ള അക്കൗണ്ടുകളിൽ മാത്രമേ ഉപയോഗിക്കാവൂ.</translation>
 <translation id="8701136875688985581">ഈ ഉപയോക്താവിനെ <ph name="ENROLLMENT_DOMAIN" /> മാനേജ് ചെയ്യുന്നു. ഇത് വിദൂരമായി ക്രമീകരണം മാനേജ് ചെയ്യുകയും ഉപയോക്തൃ ആക്‌റ്റിവിറ്റി നിരീക്ഷിക്കുകയും ചെയ്‌തേക്കാം.</translation>
 <translation id="871560550817059752">പ്രിന്റ് ചെയ്യാനായില്ല - മഷിയില്ല</translation>
 <translation id="8726019395068607495">പ്രിന്റ് ജോലി നിർത്തി - ഡോർ തുറന്നിരിക്കുന്നു</translation>
diff --git a/chromeos/strings/chromeos_strings_mn.xtb b/chromeos/strings/chromeos_strings_mn.xtb
index fec55b7..1a78985 100644
--- a/chromeos/strings/chromeos_strings_mn.xtb
+++ b/chromeos/strings/chromeos_strings_mn.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Нууц үгийг солих</translation>
 <translation id="8208861521865154048">Нэмэлтүүд</translation>
 <translation id="8347227221149377169">Хэвлэх ажлууд</translation>
+<translation id="8352772353338965963">Олон хэрэглэгч бүхий нэвтрэх хэсэгт бүртгэл нэмж оруулах. Бүх нэвтэрсэн бүртгэлүүд нууц үггүйгээр нэвтрэх боломжтой учраас энэ горимыг зөвхөн итгэл хүлээсэн бүртгэлүүдэд ашиглахыг зөвлөж байна.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> энэ хэрэглэгчийг удирддаг. Энэ нь алсаас тохиргоог удирдаж, хэрэглэгчийн үйл ажиллагааг хянаж болзошгүй.</translation>
 <translation id="871560550817059752">Амжилтгүй болсон - Бэх дууссан</translation>
 <translation id="8726019395068607495">Зогссон - Таг нээлттэй</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb
index 7426e31..996bdda 100644
--- a/chromeos/strings/chromeos_strings_mr.xtb
+++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">पासवर्ड बदला</translation>
 <translation id="8208861521865154048">लाभ</translation>
 <translation id="8347227221149377169">प्रिंट कार्ये</translation>
+<translation id="8352772353338965963">मल्टिपल साइन-इन वर खाते जोडा. सर्व साइन इन केलेल्या खात्यांवर पासवर्डशिवाय प्रवेश केला जाऊ शकतो, म्हणून हे वैशिष्ट्य केवळ विश्वसनीय खात्यांसह वापरले जावे.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> हा वापरकर्ता व्यवस्थापित करते. ते रिमोट पद्धतीने सेटिंग्ज व्यवस्थापित करू शकते आणि वापरकर्ता अ‍ॅक्टिव्हिटीचे परीक्षण करू शकते.</translation>
 <translation id="871560550817059752">अयशस्वी झाले - शाई संपली आहे</translation>
 <translation id="8726019395068607495">थांबले - दार उघडे आहे</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb
index 136fc061..596c7230 100644
--- a/chromeos/strings/chromeos_strings_ms.xtb
+++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Tukar kata laluan</translation>
 <translation id="8208861521865154048">Manfaat</translation>
 <translation id="8347227221149377169">Tugas cetak</translation>
+<translation id="8352772353338965963">Tambahkan akaun untuk berbilang log masuk. Semua akaun dilog masuk boleh diakses tanpa kata laluan, jadi ciri ini mesti digunakan dengan akaun yang dipercayai sahaja.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> mengurus pengguna ini. Domain ini mungkin mengurus tetapan dan memantau aktiviti pengguna dari jauh.</translation>
 <translation id="871560550817059752">Gagal - Kehabisan dakwat</translation>
 <translation id="8726019395068607495">Dihentikan - Pintu terbuka</translation>
diff --git a/chromeos/strings/chromeos_strings_my.xtb b/chromeos/strings/chromeos_strings_my.xtb
index 8ff48b2a..795112b 100644
--- a/chromeos/strings/chromeos_strings_my.xtb
+++ b/chromeos/strings/chromeos_strings_my.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">စကားဝှက် ပြောင်းရန်</translation>
 <translation id="8208861521865154048">ခံစားခွင့်များ</translation>
 <translation id="8347227221149377169">ပရင့်ထုတ်ရန် ဖိုင်များ</translation>
+<translation id="8352772353338965963">အရာ အများအပြားထဲသို့ လက်မှတ်ထိုး ဝင်နိုင်ရန် အတွက် အကောင့် တစ်ခုကို ထည့်ပါ။ လက်မှတ်ထိုး ဝင်ထားသည့် အကောင့်များ အားလုံးကို စကားဝှက် မသုံးရဘဲ သုံးနိုင်မည် ဖြစ်ရာ၊ ဒီအင်္ဂါရပ်ကို ယုံကြည်ရသည့် အကောင့်များ အတွက်သာ အသုံးပြသင့်သည်။</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> က ဤအသုံးပြုသူကို စီမံသည်။ ၎င်းက ဆက်တင်များကို အဝေးထိန်းစီမံပြီး အသုံးပြုသူ လုပ်ဆောင်ချက်ကို စောင့်ကြည့်နိုင်သည်။</translation>
 <translation id="871560550817059752">မအောင်မြင်ပါ - မင်ကုန်နေသည်</translation>
 <translation id="8726019395068607495">ရပ်သွားသည် - တံခါးပွင့်နေသည်</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb
index 6bfdae5..7377b62 100644
--- a/chromeos/strings/chromeos_strings_ne.xtb
+++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">पासवर्ड परिवर्तन गर्नुहोस्‌</translation>
 <translation id="8208861521865154048">लाभहरू</translation>
 <translation id="8347227221149377169">प्रिन्टसम्बन्धी कार्यहरू</translation>
+<translation id="8352772353338965963">बहुविध साइन-इन को लागि एउटा खाता थप्नुहोस्। सबै साइन-इन भएका खाताहरू पासवर्ड विना नै पहुँच गर्न सकिन्छ, त्यसैले यो सुविधा विश्वसनीय खाताहरूसँग मात्रै प्रयोग गर्नुपर्छ।</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> ले यो प्रयोगकर्ताको व्यवस्थापन गर्छ। यसले दूरवर्ती रूपमा सेटिङ व्यवस्थापन गर्न र प्रयोगकर्ताले गर्ने क्रियाकलाप निगरानी गर्न सक्छ।</translation>
 <translation id="871560550817059752">प्रिन्ट गर्न सकिएन - मसी सकियो</translation>
 <translation id="8726019395068607495">रोकियो - प्रिन्टरको कभर खुला छ</translation>
diff --git a/chromeos/strings/chromeos_strings_nl.xtb b/chromeos/strings/chromeos_strings_nl.xtb
index 5d354e8b..88c511a4 100644
--- a/chromeos/strings/chromeos_strings_nl.xtb
+++ b/chromeos/strings/chromeos_strings_nl.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Wachtwoord wijzigen</translation>
 <translation id="8208861521865154048">Speciale voordelen</translation>
 <translation id="8347227221149377169">Afdruktaken</translation>
+<translation id="8352772353338965963">Een account toevoegen aan Toegang tot meerdere accounts. Alle ingelogde accounts zijn toegankelijk zonder wachtwoord, dus deze functie moet alleen worden gebruikt voor vertrouwde accounts.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> beheert deze gebruiker. Dit domein kan op afstand instellingen beheren en gebruikersactiviteit in de gaten houden.</translation>
 <translation id="871560550817059752">Mislukt - Geen inkt meer</translation>
 <translation id="8726019395068607495">Gestopt: klep geopend</translation>
diff --git a/chromeos/strings/chromeos_strings_no.xtb b/chromeos/strings/chromeos_strings_no.xtb
index c4f9d16f..205619e 100644
--- a/chromeos/strings/chromeos_strings_no.xtb
+++ b/chromeos/strings/chromeos_strings_no.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Endre passord</translation>
 <translation id="8208861521865154048">Fordeler</translation>
 <translation id="8347227221149377169">Utskriftsjobber</translation>
+<translation id="8352772353338965963">Legg til en konto for multipålogging. Alle påloggede kontoer kan brukes uten passord, så denne funksjonen burde bare brukes med pålitelige kontoer.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> administrerer denne brukeren. Domenet kan administrere innstillinger og overvåke brukeraktivitet eksternt.</translation>
 <translation id="871560550817059752">Mislykket – tom for blekk</translation>
 <translation id="8726019395068607495">Stoppet – luken er åpen</translation>
diff --git a/chromeos/strings/chromeos_strings_or.xtb b/chromeos/strings/chromeos_strings_or.xtb
index 3087fc6..bd4303e 100644
--- a/chromeos/strings/chromeos_strings_or.xtb
+++ b/chromeos/strings/chromeos_strings_or.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">ପାସ୍‌ୱାର୍ଡ ବଦଳାନ୍ତୁ</translation>
 <translation id="8208861521865154048">ପର୍କଗୁଡ଼ିକ</translation>
 <translation id="8347227221149377169">ପ୍ରିଣ୍ଟ ଜବ୍</translation>
+<translation id="8352772353338965963">ଏକାଧିକ ସାଇନ୍-ଇନ୍ କରିବାକୁ ଏକ ଆକାଉଣ୍ଟ ଯୋଗ କରନ୍ତୁ। ସାଇନ୍-ଇନ୍ ହୋଇଥିବା ସମସ୍ତ ଆକାଉଣ୍ଟ ବିନା ପାସ୍‌ୱର୍ଡରେ ଆକ୍ସେସ୍ କରାଯାଇପାରିବ, ତେଣୁ ଏହି ସୁବିଧା କେବଳ ବିଶ୍ୱସ୍ତ ଆକାଉଣ୍ଟ ସହ ବ୍ୟବହାର କରାଯିବା ଉଚିତ୍।</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ପରିଚାଳନା କରେ। ଏହା ରିମୋଟ୍ ଭାବେ ସେଟିଂସ୍ ପରିଚାଳନା ଏବଂ ଉପଯୋଗକର୍ତ୍ତା କାର୍ଯ୍ୟକଳାପ ମନିଟର୍ କରିପାରେ।</translation>
 <translation id="871560550817059752">ବିଫଳ ହୋଇଛି - ସ୍ୟାହି ଶେଷ ହୋଇଯାଇଛି</translation>
 <translation id="8726019395068607495">ବନ୍ଦ ହୋଇଯାଇଛି - ପ୍ରିଣ୍ଟରର କଭର୍ ଖୋଲା ଅଛି</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb
index 8a2c496..fe1a8de 100644
--- a/chromeos/strings/chromeos_strings_pa.xtb
+++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">ਪਾਸਵਰਡ ਬਦਲੋ</translation>
 <translation id="8208861521865154048">ਫ਼ਾਇਦੇ</translation>
 <translation id="8347227221149377169">ਪ੍ਰਿੰਟ ਜੌਬਾਂ</translation>
+<translation id="8352772353338965963">ਬਹੁ-ਗਿਣਤੀ ਸਾਈਨ-ਇਨ ਲਈ ਇੱਕ ਖਾਤਾ ਸ਼ਾਮਲ ਕਰੋ। ਸਾਰੇ ਸਾਈਨ-ਇਨ ਕੀਤੇ ਖਾਤਿਆਂ ਤੱਕ ਬਿਨਾਂ ਕਿਸੇ ਪਾਸਵਰਡ ਦੇ ਪਹੁੰਚਿਆ ਜਾ ਸਕਦਾ ਹੈ, ਇਸਲਈ ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਸਿਰਫ਼ ਭਰੋਸੇਯੋਗ ਖਾਤਿਆਂ ਨਾਲ ਵਰਤੀ ਜਾਣੀ ਚਾਹੀਦੀ ਹੈ।</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> ਇਸ ਵਰਤੋਂਕਾਰ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਦਾ ਹੈ। ਇਹ ਦੂਰ-ਦਰਾਡੇ ਤੋਂ ਸੈਟਿੰਗਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰ ਸਕਦਾ ਹੈ ਅਤੇ ਵਰਤੋਂਕਾਰ ਸਰਗਰਮੀ ਦੀ ਨਿਗਰਾਨੀ ਕਰ ਸਕਦਾ ਹੈ।</translation>
 <translation id="871560550817059752">ਅਸਫਲ ਰਹੀ - ਸਿਆਹੀ ਖਤਮ ਹੋ ਗਈ ਹੈ</translation>
 <translation id="8726019395068607495">ਬੰਦ ਹੋ ਗਿਆ - ਢੱਕਣ ਖੁੱਲ੍ਹਾ ਹੈ</translation>
diff --git a/chromeos/strings/chromeos_strings_pl.xtb b/chromeos/strings/chromeos_strings_pl.xtb
index 34572a8..e55f35b 100644
--- a/chromeos/strings/chromeos_strings_pl.xtb
+++ b/chromeos/strings/chromeos_strings_pl.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Zmień hasło</translation>
 <translation id="8208861521865154048">Korzyści</translation>
 <translation id="8347227221149377169">Zadania drukowania</translation>
+<translation id="8352772353338965963">Tu możesz dodać konto do wielokrotnego logowania. Ponieważ dostęp do wszystkich zalogowanych kont można uzyskać bez podawania hasła, tej funkcji należy używać tylko z zaufanymi kontami.</translation>
 <translation id="8701136875688985581">Tym użytkownikiem zarządza domena <ph name="ENROLLMENT_DOMAIN" />. Może ona zdalnie zarządzać ustawieniami i monitorować aktywność użytkownika.</translation>
 <translation id="871560550817059752">Niepowodzenie – brak tuszu</translation>
 <translation id="8726019395068607495">Zatrzymano – otwarte drzwiczki drukarki</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-BR.xtb b/chromeos/strings/chromeos_strings_pt-BR.xtb
index cc623a4d..0027252 100644
--- a/chromeos/strings/chromeos_strings_pt-BR.xtb
+++ b/chromeos/strings/chromeos_strings_pt-BR.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Alterar senha</translation>
 <translation id="8208861521865154048">Benefícios</translation>
 <translation id="8347227221149377169">Trabalhos de impressão</translation>
+<translation id="8352772353338965963">Adicione uma conta de login múltiplo. Todas as contas conectadas podem ser acessadas sem uma senha; portanto esse recurso só deve ser usado com contas confiáveis.</translation>
 <translation id="8701136875688985581">O domínio <ph name="ENROLLMENT_DOMAIN" /> gerencia esta conta. Ele pode gerenciar configurações e monitorar a atividade do usuário remotamente.</translation>
 <translation id="871560550817059752">Falha - Sem tinta</translation>
 <translation id="8726019395068607495">Parado (porta aberta)</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb
index ca4e38b..34a3905 100644
--- a/chromeos/strings/chromeos_strings_pt-PT.xtb
+++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Alterar palavra-passe</translation>
 <translation id="8208861521865154048">Benefícios</translation>
 <translation id="8347227221149377169">Tarefas de impressão</translation>
+<translation id="8352772353338965963">Adicione uma conta para início de sessão integrado. É possível aceder a todas as contas com a sessão iniciada sem uma palavra-passe, por isso, só deve utilizar esta funcionalidade com contas fidedignas.</translation>
 <translation id="8701136875688985581">Este utilizador é gerido por <ph name="ENROLLMENT_DOMAIN" />. Pode gerir definições e monitorizar remotamente a atividade do utilizador.</translation>
 <translation id="871560550817059752">Falha – Sem tinta</translation>
 <translation id="8726019395068607495">Parada – Porta aberta</translation>
diff --git a/chromeos/strings/chromeos_strings_ro.xtb b/chromeos/strings/chromeos_strings_ro.xtb
index c5515834..e39bbb1 100644
--- a/chromeos/strings/chromeos_strings_ro.xtb
+++ b/chromeos/strings/chromeos_strings_ro.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Schimbă parola</translation>
 <translation id="8208861521865154048">Avantaje</translation>
 <translation id="8347227221149377169">Sarcini de printare</translation>
+<translation id="8352772353338965963">Adăugați un cont pentru conectarea multiplă. Conturile conectate pot fi accesate fără parolă, prin urmare, această funcție trebuie folosită numai cu conturile de încredere.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> gestionează acest utilizator. Poate să gestioneze de la distanță setările și să monitorizeze activitatea utilizatorului.</translation>
 <translation id="871560550817059752">Nereușită – Cerneală epuizată</translation>
 <translation id="8726019395068607495">Oprită – Ușă deschisă</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb
index 0cc657d..11c5fd92 100644
--- a/chromeos/strings/chromeos_strings_ru.xtb
+++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Сменить пароль</translation>
 <translation id="8208861521865154048">Преимущества</translation>
 <translation id="8347227221149377169">Задания печати</translation>
+<translation id="8352772353338965963">Добавить аккаунт в систему множественного входа. Для доступа к аккаунтам, в которые выполнен вход, пароль не требуется, поэтому эту функцию следует использовать только для надежных аккаунтов.</translation>
 <translation id="8701136875688985581">Этот аккаунт находится под управлением домена <ph name="ENROLLMENT_DOMAIN" />, из которого можно отслеживать действия пользователя и удаленно изменять настройки.</translation>
 <translation id="871560550817059752">Сбой: закончились чернила</translation>
 <translation id="8726019395068607495">Печать прервана: открыта крышка</translation>
diff --git a/chromeos/strings/chromeos_strings_si.xtb b/chromeos/strings/chromeos_strings_si.xtb
index bd95252..ad1cf258 100644
--- a/chromeos/strings/chromeos_strings_si.xtb
+++ b/chromeos/strings/chromeos_strings_si.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">මුරපදය වෙනස් කරන්න</translation>
 <translation id="8208861521865154048">අමතර වාසි</translation>
 <translation id="8347227221149377169">මුද්‍රණ වැඩ</translation>
+<translation id="8352772353338965963">බහු පිවිසුම් සඳහා ගිනුමක් එක් කරන්න. සියළු පිවිසි ගිනුම් වෙත මුරපදයක් නොමැතිව පිවිසිය හැක. එම නිසා මෙම විශේෂාංගය භාවිත කළ යුත්තේ විශ්වාසී ගිනුම් සමඟ පමණි.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> මෙම පරිශීලකයා කළමනා කරයි. එය දුරස්ථව සැකසීම් කළමනා කිරීමට සහ පරිශීලක ක්‍රියාකාරකම නිරීක්‍ෂණ කිරීමට හැකිය.</translation>
 <translation id="871560550817059752">අසාර්ථක විය - තීන්ත නැත</translation>
 <translation id="8726019395068607495">නැවතිණි - දොර විවෘතයි</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb
index 207fc2c0..fda20c3 100644
--- a/chromeos/strings/chromeos_strings_sk.xtb
+++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Zmeniť heslo</translation>
 <translation id="8208861521865154048">Výhody</translation>
 <translation id="8347227221149377169">Tlačové úlohy</translation>
+<translation id="8352772353338965963">Pridanie účtu pre viacnásobné prihlásenie. Ku všetkým prihláseným účtom môžete pristupovať bez hesla, takže táto funkcia by mala byť použitá iba s dôveryhodnými účtami.</translation>
 <translation id="8701136875688985581">Tohto používateľa spravuje doména <ph name="ENROLLMENT_DOMAIN" />. Môže vzdialene spravovať nastavenia a monitorovať aktivitu používateľa.</translation>
 <translation id="871560550817059752">Nepodarilo sa – minul sa atrament</translation>
 <translation id="8726019395068607495">Zastavené – dvierka sú otvorené</translation>
diff --git a/chromeos/strings/chromeos_strings_sl.xtb b/chromeos/strings/chromeos_strings_sl.xtb
index eba0b31..1e210b0 100644
--- a/chromeos/strings/chromeos_strings_sl.xtb
+++ b/chromeos/strings/chromeos_strings_sl.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Sprememba gesla</translation>
 <translation id="8208861521865154048">Ugodnosti</translation>
 <translation id="8347227221149377169">Tiskalna opravila</translation>
+<translation id="8352772353338965963">Dodajte račun za prijavo z več računi. Do vseh prijavljenih računov je mogoče dostopati brez gesla, zato to funkcijo uporabljajte samo z zaupanja vrednimi računi.</translation>
 <translation id="8701136875688985581">Domena <ph name="ENROLLMENT_DOMAIN" /> upravlja tega uporabnika. Na daljavo lahko upravlja nastavitve in nadzira dejavnost uporabnika.</translation>
 <translation id="871560550817059752">Napaka – zmanjkalo je črnila</translation>
 <translation id="8726019395068607495">Ustavljeno – vrata so odprta</translation>
diff --git a/chromeos/strings/chromeos_strings_sq.xtb b/chromeos/strings/chromeos_strings_sq.xtb
index a4f99b9..e77f8d1 100644
--- a/chromeos/strings/chromeos_strings_sq.xtb
+++ b/chromeos/strings/chromeos_strings_sq.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">Ndrysho fjalëkalimin</translation>
 <translation id="8208861521865154048">Avantazhet</translation>
 <translation id="8347227221149377169">Printimet</translation>
+<translation id="8352772353338965963">Shto një llogari në identifikimin e shumëfishtë. Të gjitha llogaritë e identifikuara mund të qasen pa fjalëkalim, prandaj ky funksion duhet të përdoret vetëm me llogari të besuara.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> e menaxhon këtë përdorues. Ai domen mund të menaxhojë në distancë cilësimet dhe të monitorojë aktivitetin e përdoruesit.</translation>
 <translation id="871560550817059752">Dështoi - Nuk ka bojë</translation>
 <translation id="8726019395068607495">Ndaloi - Dera e hapur</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb
index 6deb3f4..5cbe44d 100644
--- a/chromeos/strings/chromeos_strings_sr-Latn.xtb
+++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Promeni lozinku</translation>
 <translation id="8208861521865154048">Pogodnosti</translation>
 <translation id="8347227221149377169">Zadaci štampanja</translation>
+<translation id="8352772353338965963">Dodajte nalog za višestruko prijavljivanje. Svim prijavljenim nalozima se može pristupiti bez lozinke, pa ovu funkciju treba koristiti samo sa pouzdanim nalozima.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> upravlja ovim korisnikom. Može daljinski da upravlja podešavanjima i nadgleda aktivnosti korisnika.</translation>
 <translation id="871560550817059752">Nije uspelo – nema više mastila</translation>
 <translation id="8726019395068607495">Zaustavljeno – vrata su otvorena</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb
index 55e7b36a..b8bb93eb 100644
--- a/chromeos/strings/chromeos_strings_sr.xtb
+++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Промени лозинку</translation>
 <translation id="8208861521865154048">Погодности</translation>
 <translation id="8347227221149377169">Задаци штампања</translation>
+<translation id="8352772353338965963">Додајте налог за вишеструко пријављивање. Свим пријављеним налозима се може приступити без лозинке, па ову функцију треба користити само са поузданим налозима.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> управља овим корисником. Може даљински да управља подешавањима и надгледа активности корисника.</translation>
 <translation id="871560550817059752">Није успело – нема више мастила</translation>
 <translation id="8726019395068607495">Заустављено – врата су отворена</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb
index b4b35b8..bcba706c 100644
--- a/chromeos/strings/chromeos_strings_sv.xtb
+++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Ändra lösenord</translation>
 <translation id="8208861521865154048">Förmåner</translation>
 <translation id="8347227221149377169">Utskriftsjobb</translation>
+<translation id="8352772353338965963">Lägg till ett konto för multiinloggning. Alla inloggade konton kan öppnas utan lösenord, så använd bara den här funktionen med konton du litar på.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> hanterar denna användare och kan fjärrhantera inställningar och övervaka användaraktivitet.</translation>
 <translation id="871560550817059752">Misslyckades – slut på bläck</translation>
 <translation id="8726019395068607495">Har stoppats – luckan är öppen</translation>
diff --git a/chromeos/strings/chromeos_strings_sw.xtb b/chromeos/strings/chromeos_strings_sw.xtb
index a506b1ba..780cf1cd 100644
--- a/chromeos/strings/chromeos_strings_sw.xtb
+++ b/chromeos/strings/chromeos_strings_sw.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">Badilisha nenosiri</translation>
 <translation id="8208861521865154048">Manufaa</translation>
 <translation id="8347227221149377169">Kazi za kuchapisha</translation>
+<translation id="8352772353338965963">Ongeza akaunti ya uwezo wa kuingia katika akaunti nyingi kwa wakati mmoja. Akaunti zote zilizoingiwa zinaweza kufikiwa bila nenosiri, hivyo kipengee hiki lazima kitumike kwenye akaunti zinazoaminika pekee.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> inasimamia mtumiaji huyu. Huenda itadhibiti mipangilio kwa mbali na kufuatilia shughuli za mtumiaji.</translation>
 <translation id="871560550817059752">Haijakamilika - Wino umeisha</translation>
 <translation id="8726019395068607495">Imesimama - Mlango umefunguka</translation>
diff --git a/chromeos/strings/chromeos_strings_ta.xtb b/chromeos/strings/chromeos_strings_ta.xtb
index 392d0db..c0466c80 100644
--- a/chromeos/strings/chromeos_strings_ta.xtb
+++ b/chromeos/strings/chromeos_strings_ta.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">கடவுச்சொல்லை மாற்று</translation>
 <translation id="8208861521865154048">சலுகைகள்</translation>
 <translation id="8347227221149377169">அச்சுப் பணிகள்</translation>
+<translation id="8352772353338965963">பல உள்நுழைவுக்குக் கணக்கைச் சேர்க்கவும். உள்நுழைந்த அனைத்து கணக்குகளையும் கடவுச்சொல் இல்லாமலே அணுகலாம் என்பதால் இந்த அம்சத்தை நம்பகமான கணக்குகளுடன் மட்டுமே பயன்படுத்த வேண்டும்.</translation>
 <translation id="8701136875688985581">இந்தப் பயனரை <ph name="ENROLLMENT_DOMAIN" /> நிர்வகிக்கிறது. இது தொலைநிலையிலிருந்து அமைப்புகளை நிர்வகிக்கலாம், அத்துடன் பயனர் செயல்பாட்டையும் கண்காணிக்கலாம்.</translation>
 <translation id="871560550817059752">பிரிண்டரில் மை தீர்ந்துவிட்டதால் அச்சிட முடியவில்லை</translation>
 <translation id="8726019395068607495">மூடி திறந்துள்ளதால் அச்சிட முடியவில்லை</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb
index 40ef331..05883e27 100644
--- a/chromeos/strings/chromeos_strings_te.xtb
+++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">పాస్‌వర్డ్‌ను మార్చు</translation>
 <translation id="8208861521865154048">పెర్క్‌లు</translation>
 <translation id="8347227221149377169">ప్రింట్ టాస్క్‌లు</translation>
+<translation id="8352772353338965963">బహుళ సైన్ ఇన్ కోసం ఖాతాను జోడించండి. అన్ని సైన్ ఇన్ చేసిన ఖాతాలను పాస్‌వర్డ్ లేకుండానే యాక్సెస్‌ చేయవచ్చు. కాబ‌ట్టి ఈ ఫీచ‌ర్‌ను విశ్వసనీయ ఖాతాలతో మాత్రమే ఉపయోగించాలి.</translation>
 <translation id="8701136875688985581">ఈ యూజర్‌ను <ph name="ENROLLMENT_DOMAIN" /> మేనేజ్ చేస్తుంది. అది సెట్టింగ్‌లను రిమోట్‌గా మేనేజ్ చేయవచ్చు, యూజర్ యాక్టివిటీని మానిటర్ చేయవచ్చు.</translation>
 <translation id="871560550817059752">విఫలమైంది - ఇంక్ అయిపోయింది</translation>
 <translation id="8726019395068607495">ఆగిపోయింది - డోర్ తెరిచి ఉంది</translation>
diff --git a/chromeos/strings/chromeos_strings_th.xtb b/chromeos/strings/chromeos_strings_th.xtb
index de2f69a..1320617 100644
--- a/chromeos/strings/chromeos_strings_th.xtb
+++ b/chromeos/strings/chromeos_strings_th.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">เปลี่ยนรหัสผ่าน</translation>
 <translation id="8208861521865154048">สิทธิประโยชน์</translation>
 <translation id="8347227221149377169">งานพิมพ์</translation>
+<translation id="8352772353338965963">เพิ่มบัญชีเพื่อลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี บัญชีที่ลงชื่อเข้าใช้แล้วทั้งหมดสามารถเข้าถึงได้โดยไม่ต้องใช้รหัสผ่าน คุณจึงควรใช้ฟีเจอร์นี้กับบัญชีที่เชื่อถือเท่านั้น</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> จัดการผู้ใช้รายนี้ โดยอาจจัดการการตั้งค่าและตรวจสอบกิจกรรมของผู้ใช้จากระยะไกล</translation>
 <translation id="871560550817059752">ไม่สำเร็จ - หมึกหมด</translation>
 <translation id="8726019395068607495">หยุดพิมพ์ - ฝาเครื่องเปิดอยู่</translation>
diff --git a/chromeos/strings/chromeos_strings_tr.xtb b/chromeos/strings/chromeos_strings_tr.xtb
index d1f7a8d1..20f79102 100644
--- a/chromeos/strings/chromeos_strings_tr.xtb
+++ b/chromeos/strings/chromeos_strings_tr.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Şifreyi değiştir</translation>
 <translation id="8208861521865154048">Avantajlar</translation>
 <translation id="8347227221149377169">Yazdırma işleri</translation>
+<translation id="8352772353338965963">Çoklu oturum açmaya bir hesap ekleyin. Oturum açılmış tüm hesaplara şifresiz erişilebileceği için bu özellik sadece güvenilir hesaplarla kullanılmalıdır.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" />, bu kullanıcıyı yönetiyor. Ayarları uzaktan yönetebilir ve kullanıcı etkinliğini izleyebilir.</translation>
 <translation id="871560550817059752">İşlem başarısız - Mürekkep yok</translation>
 <translation id="8726019395068607495">Durduruldu - Kapak açık</translation>
diff --git a/chromeos/strings/chromeos_strings_uk.xtb b/chromeos/strings/chromeos_strings_uk.xtb
index 668b9bb7..33e4570 100644
--- a/chromeos/strings/chromeos_strings_uk.xtb
+++ b/chromeos/strings/chromeos_strings_uk.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Змінити пароль</translation>
 <translation id="8208861521865154048">Бонуси</translation>
 <translation id="8347227221149377169">Завдання друку</translation>
+<translation id="8352772353338965963">Додайте обліковий запис для паралельного входу. Доступ до всіх облікових записів, у які ви ввійшли, можна отримувати без пароля, тому цю функцію варто використовувати лише з надійними обліковими записами.</translation>
 <translation id="8701136875688985581">Домен <ph name="ENROLLMENT_DOMAIN" /> керує цим користувачем. Він може віддалено змінювати налаштування й відстежувати дії користувача.</translation>
 <translation id="871560550817059752">Не надруковано – закінчилося чорнило</translation>
 <translation id="8726019395068607495">Зупинено – відкрито кришку принтера</translation>
diff --git a/chromeos/strings/chromeos_strings_ur.xtb b/chromeos/strings/chromeos_strings_ur.xtb
index bb81ebc..a340872 100644
--- a/chromeos/strings/chromeos_strings_ur.xtb
+++ b/chromeos/strings/chromeos_strings_ur.xtb
@@ -81,6 +81,7 @@
 <translation id="808894953321890993">پاس ورڈ تبدیل کریں</translation>
 <translation id="8208861521865154048">فوائد</translation>
 <translation id="8347227221149377169">پرنٹ جابز</translation>
+<translation id="8352772353338965963">متعدد سائن ان میں ایک اکاؤنٹ شامل کریں۔ سبھی سائن ان کردہ اکاؤنٹس تک پاس ورڈ کے بغیر رسائی کی جا سکتی ہے لہذا یہ خصوصیت صرف بھروسہ مند اکاؤنٹس کے ساتھ استعمال کی جانی چاہیے۔</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> اس صارف کا نظم کرتا ہے۔ یہ دور سے ترتیبات کا نظم اور صارف کی سرگرمی کو مانیٹر کر سکتا ہے۔</translation>
 <translation id="871560550817059752">ناکام ہو گیا - سیاہی ختم ہو گئی</translation>
 <translation id="8726019395068607495">رک گیا - دروازہ کھلا ہے</translation>
diff --git a/chromeos/strings/chromeos_strings_uz.xtb b/chromeos/strings/chromeos_strings_uz.xtb
index 5790f8f..d765401 100644
--- a/chromeos/strings/chromeos_strings_uz.xtb
+++ b/chromeos/strings/chromeos_strings_uz.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Parolni almashtirish</translation>
 <translation id="8208861521865154048">Imtiyozlar</translation>
 <translation id="8347227221149377169">Chop etish vazifalari</translation>
+<translation id="8352772353338965963">Bir nechta hisobga kirish tizimiga hisob qo‘shish. Kirish bajarilgan hisoblarni ko‘rish uchun parol so‘ralmaydi, shuning uchun bu funksiyadan faqat ishonchli hisoblarda foydalanish kerak.</translation>
 <translation id="8701136875688985581">Bu hisob <ph name="ENROLLMENT_DOMAIN" /> domenida boshqariladi. Bu domenda foydalanuvchilar faoliyati masofadan kuzatilishi va boshqarilishi mumkin.</translation>
 <translation id="871560550817059752">Bajarilmadi - Rang tugadi</translation>
 <translation id="8726019395068607495">Toʻxtatildi – Eshikchasi ochiq</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb
index 0a0d56d..81bb435 100644
--- a/chromeos/strings/chromeos_strings_vi.xtb
+++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Đổi mật khẩu</translation>
 <translation id="8208861521865154048">Đặc quyền</translation>
 <translation id="8347227221149377169">Lệnh in</translation>
+<translation id="8352772353338965963">Thêm một tài khoản để đăng nhập nhiều lần. Tất cả các tài khoản đã đăng nhập đều có thể truy cập được mà không cần mật khẩu, do đó bạn chỉ nên sử dụng tính năng này với các tài khoản đáng tin cậy.</translation>
 <translation id="8701136875688985581"><ph name="ENROLLMENT_DOMAIN" /> quản lý người dùng này. Miền này có thể quản lý từ xa các tùy chọn cài đặt và giám sát hoạt động của người dùng.</translation>
 <translation id="871560550817059752">Không thành công – Hết mực</translation>
 <translation id="8726019395068607495">Đã dừng – Cửa máy in đang mở</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb
index 1f8ed398..71c1922a 100644
--- a/chromeos/strings/chromeos_strings_zh-CN.xtb
+++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">更改密码</translation>
 <translation id="8208861521865154048">福利</translation>
 <translation id="8347227221149377169">打印任务</translation>
+<translation id="8352772353338965963">为多帐号登录添加帐号。用户无需使用密码即可访问所有已登录的帐号,因此您应仅通过受信任的帐号使用此功能。</translation>
 <translation id="8701136875688985581">此用户由 <ph name="ENROLLMENT_DOMAIN" /> 管理。管理方可能会远程管理设置并监控用户活动。</translation>
 <translation id="871560550817059752">失败 - 墨水已用完</translation>
 <translation id="8726019395068607495">已停止 - 机盖未关</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb
index 4fdca2d..08270d9 100644
--- a/chromeos/strings/chromeos_strings_zh-HK.xtb
+++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">變更密碼</translation>
 <translation id="8208861521865154048">獎賞</translation>
 <translation id="8347227221149377169">列印工作</translation>
+<translation id="8352772353338965963">新增可多重登入的帳戶。這些帳戶的使用者不需提供密碼即可存取所有已登入的帳戶。因此,建議您只讓信任的帳戶使用這項功能。</translation>
 <translation id="8701136875688985581">由 <ph name="ENROLLMENT_DOMAIN" /> 管理這位使用者,因此可能會從遠端管理設定並監察用戶活動。</translation>
 <translation id="871560550817059752">失敗 - 墨水已用完</translation>
 <translation id="8726019395068607495">已停止 - 機門未關</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-TW.xtb b/chromeos/strings/chromeos_strings_zh-TW.xtb
index 9e8c3461..38014bfb 100644
--- a/chromeos/strings/chromeos_strings_zh-TW.xtb
+++ b/chromeos/strings/chromeos_strings_zh-TW.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">變更密碼</translation>
 <translation id="8208861521865154048">獎勵</translation>
 <translation id="8347227221149377169">列印工作</translation>
+<translation id="8352772353338965963">新增可多重登入的帳戶。這些帳戶的使用者不需提供密碼即可存取所有已登入的帳戶。因此,建議你只讓信任的帳戶使用這項功能。</translation>
 <translation id="8701136875688985581">由 <ph name="ENROLLMENT_DOMAIN" /> 管理這位使用者,因此可能會從遠端管理設定並監控使用者活動。</translation>
 <translation id="871560550817059752">失敗 - 墨水用盡</translation>
 <translation id="8726019395068607495">已停止 - 蓋子處於開啟狀態</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb
index c924553a..3860473 100644
--- a/chromeos/strings/chromeos_strings_zu.xtb
+++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -82,6 +82,7 @@
 <translation id="808894953321890993">Shintsha iphasiwedi</translation>
 <translation id="8208861521865154048">Izinzuzo</translation>
 <translation id="8347227221149377169">Imisebenzi yokuphrinta</translation>
+<translation id="8352772353338965963">Engeza i-akhawunti ekungeneni ngemvume okuningi. Wonke ama-akhawunti angene ngemvume angafinyelelwa ngaphandle kwephasiwedi, ngakho-ke lesi sici kumele sisetshenziswe kuphela nama-akhawunti athenjiwe.</translation>
 <translation id="8701136875688985581">I-<ph name="ENROLLMENT_DOMAIN" /> ilawula lo msebenzisi. Ingalawula amasethingi isekudeni futhi iqaphe umsebenzi womsebenzisi.</translation>
 <translation id="871560550817059752">Yehlulekile - Uyinki uphelile</translation>
 <translation id="8726019395068607495">Imile - Umnyango uvuliwe</translation>
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 9b52bb0..4bd2c728 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -89,6 +89,8 @@
     "data_model/autofill_profile.h",
     "data_model/autofill_profile_comparator.cc",
     "data_model/autofill_profile_comparator.h",
+    "data_model/autofill_structured_address.cc",
+    "data_model/autofill_structured_address.h",
     "data_model/autofill_structured_address_component.cc",
     "data_model/autofill_structured_address_component.h",
     "data_model/autofill_structured_address_constants.cc",
@@ -593,6 +595,9 @@
     "data_model/autofill_structured_address_component_unittest.cc",
     "data_model/autofill_structured_address_name_unittest.cc",
     "data_model/autofill_structured_address_regex_provider_unittest.cc",
+    "data_model/autofill_structured_address_test_utils.cc",
+    "data_model/autofill_structured_address_test_utils.h",
+    "data_model/autofill_structured_address_unittest.cc",
     "data_model/autofill_structured_address_utils_unittest.cc",
     "data_model/borrowed_transliterator_unittest.cc",
     "data_model/contact_info_unittest.cc",
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index 62f49ee2..1ffde0d 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -29,6 +29,7 @@
 #include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
 #include "base/path_service.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_piece.h"
@@ -360,12 +361,10 @@
 // Some autofill types are detected based on values and not based on form
 // features. We may decide that it's an autofill form after submission.
 bool ContainsAutofillableValue(const autofill::FormStructure& form) {
-  return std::any_of(form.begin(), form.end(),
-                     [](const std::unique_ptr<autofill::AutofillField>& field) {
-                       return base::Contains(field->possible_types(),
-                                             UPI_VPA) ||
-                              IsUPIVirtualPaymentAddress(field->value);
-                     });
+  return base::ranges::any_of(form, [](const auto& field) {
+    return base::Contains(field->possible_types(), UPI_VPA) ||
+           IsUPIVirtualPaymentAddress(field->value);
+  });
 }
 
 #if !defined(OS_ANDROID) && !defined(OS_IOS)
diff --git a/components/autofill/core/browser/autofill_type.cc b/components/autofill/core/browser/autofill_type.cc
index b5d3c5e..2d0f844 100644
--- a/components/autofill/core/browser/autofill_type.cc
+++ b/components/autofill/core/browser/autofill_type.cc
@@ -70,6 +70,7 @@
     case ADDRESS_HOME_OTHER_SUBUNIT:
     case ADDRESS_HOME_ADDRESS:
     case ADDRESS_HOME_ADDRESS_WITH_NAME:
+    case ADDRESS_HOME_FLOOR:
       return ADDRESS_HOME;
 
     case ADDRESS_BILLING_LINE1:
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address.cc b/components/autofill/core/browser/data_model/autofill_structured_address.cc
new file mode 100644
index 0000000..a0b49d1
--- /dev/null
+++ b/components/autofill/core/browser/data_model/autofill_structured_address.cc
@@ -0,0 +1,140 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/data_model/autofill_structured_address.h"
+
+#include <utility>
+
+#include "base/i18n/case_conversion.h"
+#include "base/strings/strcat.h"
+#include "base/strings/string_split.h"
+#include "base/strings/string_util.h"
+#include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/autofill_type.h"
+#include "components/autofill/core/browser/data_model/autofill_structured_address_constants.h"
+#include "components/autofill/core/browser/data_model/autofill_structured_address_regex_provider.h"
+#include "components/autofill/core/browser/data_model/autofill_structured_address_utils.h"
+#include "components/autofill/core/browser/field_types.h"
+
+namespace autofill {
+
+namespace structured_address {
+
+StreetName::StreetName(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_STREET_NAME, parent) {}
+
+StreetName::~StreetName() = default;
+
+DependentStreetName::DependentStreetName(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_DEPENDENT_STREET_NAME, parent) {}
+
+DependentStreetName::~DependentStreetName() = default;
+
+StreetAndDependentStreetName::StreetAndDependentStreetName(
+    AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_STREET_AND_DEPENDENT_STREET_NAME,
+                       parent,
+                       {&thoroughfare_name_, &dependent_thoroughfare_name_}) {}
+
+StreetAndDependentStreetName::~StreetAndDependentStreetName() = default;
+
+HouseNumber::HouseNumber(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_HOUSE_NUMBER, parent) {}
+
+HouseNumber::~HouseNumber() = default;
+
+Premise::Premise(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_PREMISE_NAME, parent) {}
+
+Premise::~Premise() = default;
+
+Floor::Floor(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_FLOOR, parent) {}
+
+Floor::~Floor() = default;
+
+Apartment::Apartment(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_APT_NUM, parent) {}
+
+Apartment::~Apartment() = default;
+
+SubPremise::SubPremise(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_SUBPREMISE,
+                       parent,
+                       {&floor_, &apartment_}) {}
+
+SubPremise::~SubPremise() = default;
+
+StreetAddress::StreetAddress(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_STREET_ADDRESS,
+                       parent,
+                       {&streets_, &number_, &premise_, &sub_premise_}) {}
+
+StreetAddress::~StreetAddress() = default;
+
+std::vector<const re2::RE2*>
+StreetAddress::GetParseRegularExpressionsByRelevance() const {
+  auto* pattern_provider = StructuredAddressesRegExProvider::Instance();
+  DCHECK(pattern_provider);
+  return {pattern_provider->GetRegEx(RegEx::kParseHouseNumberStreetName),
+          pattern_provider->GetRegEx(RegEx::kParseStreetNameHouseNumber),
+          pattern_provider->GetRegEx(
+              RegEx::kParseStreetNameHouseNumberSuffixedFloor)};
+}
+
+base::string16 StreetAddress::GetBestFormatString() const {
+  std::string country_code =
+      base::UTF16ToUTF8(GetRootNode().GetValueForType(ADDRESS_HOME_COUNTRY));
+
+  if (country_code == "BR") {
+    return base::UTF8ToUTF16(
+        "${ADDRESS_HOME_STREET_NAME}${ADDRESS_HOME_HOUSE_NUMBER;, }"
+        "${ADDRESS_HOME_FLOOR;, ;º andar}${ADDRESS_HOME_APT_NUM;, apto ;}");
+  }
+
+  if (country_code == "DE") {
+    return base::ASCIIToUTF16(
+        "${ADDRESS_HOME_STREET_NAME} ${ADDRESS_HOME_HOUSE_NUMBER}"
+        "${ADDRESS_HOME_FLOOR;, ;. Stock}${ADDRESS_HOME_APT_NUM;, ;. Wohnung}");
+  }
+
+  // Use the format for US/UK as the default.
+  return base::ASCIIToUTF16(
+      "${ADDRESS_HOME_HOUSE_NUMBER} ${ADDRESS_HOME_STREET_NAME} "
+      "${ADDRESS_HOME_FLOOR;FL } ${ADDRESS_HOME_APT_NUM;APT }");
+}
+
+CountryCode::CountryCode(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_COUNTRY, parent) {}
+
+CountryCode::~CountryCode() = default;
+
+City::City(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_CITY, parent) {}
+
+City::~City() = default;
+
+State::State(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_STATE, parent) {}
+
+State::~State() = default;
+
+PostalCode::PostalCode(AddressComponent* parent)
+    : AddressComponent(ADDRESS_HOME_ZIP, parent) {}
+
+PostalCode::~PostalCode() = default;
+
+Address::Address() : Address{nullptr} {}
+
+Address::Address(AddressComponent* parent)
+    : AddressComponent(
+          ADDRESS_HOME_ADDRESS,
+          parent,
+          {&street_address_, &postal_code_, &city_, &state_, &country_code_}) {}
+
+Address::~Address() = default;
+
+}  // namespace structured_address
+
+}  // namespace autofill
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address.h b/components/autofill/core/browser/data_model/autofill_structured_address.h
new file mode 100644
index 0000000..a76ad665
--- /dev/null
+++ b/components/autofill/core/browser/data_model/autofill_structured_address.h
@@ -0,0 +1,152 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_STRUCTURED_ADDRESS_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_STRUCTURED_ADDRESS_H_
+
+#include <string>
+#include <vector>
+
+#include "components/autofill/core/browser/data_model/autofill_structured_address_component.h"
+
+using autofill::structured_address::AddressComponent;
+
+namespace autofill {
+namespace structured_address {
+
+// The name of the street.
+class StreetName : public AddressComponent {
+ public:
+  explicit StreetName(AddressComponent* parent);
+  ~StreetName() override;
+};
+
+// In some countries, addresses use the intersection of two streets.
+// The DependentStreetName is represents the second street of the intersections.
+class DependentStreetName : public AddressComponent {
+ public:
+  explicit DependentStreetName(AddressComponent* parent);
+  ~DependentStreetName() override;
+};
+
+// Contains both the StreetName and the DependentStreetName of an address.
+class StreetAndDependentStreetName : public AddressComponent {
+ public:
+  explicit StreetAndDependentStreetName(AddressComponent* parent);
+  ~StreetAndDependentStreetName() override;
+
+ private:
+  StreetName thoroughfare_name_{this};
+  DependentStreetName dependent_thoroughfare_name_{this};
+};
+
+// The house number. It also contains the subunit descriptor, e.g. the 'a' in
+// '73a'.
+class HouseNumber : public AddressComponent {
+ public:
+  explicit HouseNumber(AddressComponent* parent);
+  ~HouseNumber() override;
+};
+
+// The name of the premise.
+class Premise : public AddressComponent {
+ public:
+  explicit Premise(AddressComponent* parent);
+  ~Premise() override;
+};
+
+// The floor the apartment is located in.
+class Floor : public AddressComponent {
+ public:
+  explicit Floor(AddressComponent* parent);
+  ~Floor() override;
+};
+
+// The number of the apartment.
+class Apartment : public AddressComponent {
+ public:
+  explicit Apartment(AddressComponent* parent);
+  ~Apartment() override;
+};
+
+// The SubPremise contains the floor and the apartment number.
+class SubPremise : public AddressComponent {
+ public:
+  explicit SubPremise(AddressComponent* parent);
+  ~SubPremise() override;
+
+ private:
+  Floor floor_{this};
+  Apartment apartment_{this};
+};
+
+// The StreetAddress incorporates the StreetAndDependentStreetName, the
+// HouseNumber, the PremiseName and SubPremise.
+class StreetAddress : public AddressComponent {
+ public:
+  explicit StreetAddress(AddressComponent* parent);
+  ~StreetAddress() override;
+
+ protected:
+  std::vector<const re2::RE2*> GetParseRegularExpressionsByRelevance()
+      const override;
+
+  // Returns the format string to create the full name from its subcomponents.
+  base::string16 GetBestFormatString() const override;
+
+ private:
+  StreetAndDependentStreetName streets_{this};
+  HouseNumber number_{this};
+  Premise premise_{this};
+  SubPremise sub_premise_{this};
+};
+
+// Stores the country code of an address profile.
+class CountryCode : public AddressComponent {
+ public:
+  explicit CountryCode(AddressComponent* parent);
+  ~CountryCode() override;
+};
+
+// Stores the city of an address.
+class City : public AddressComponent {
+ public:
+  explicit City(AddressComponent* parent);
+  ~City() override;
+};
+
+// Stores the state of an address.
+class State : public AddressComponent {
+ public:
+  explicit State(AddressComponent* parent);
+  ~State() override;
+};
+
+// Stores the postal code of an address.
+class PostalCode : public AddressComponent {
+ public:
+  explicit PostalCode(AddressComponent* parent);
+  ~PostalCode() override;
+};
+
+// Stores the overall Address that contains the StreetAddress, the PostalCode
+// the City, the State and the CountryCode.
+class Address : public AddressComponent {
+ public:
+  Address();
+  explicit Address(AddressComponent* parent);
+  ~Address() override;
+
+ private:
+  StreetAddress street_address_{this};
+  PostalCode postal_code_{this};
+  City city_{this};
+  State state_{this};
+  CountryCode country_code_{this};
+};
+
+}  // namespace structured_address
+
+}  // namespace autofill
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_STRUCTURED_ADDRESS_H_
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_component.cc b/components/autofill/core/browser/data_model/autofill_structured_address_component.cc
index 4f50c572..807e9e86 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_component.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_component.cc
@@ -5,6 +5,7 @@
 #include "components/autofill/core/browser/data_model/autofill_structured_address_component.h"
 
 #include <algorithm>
+#include <iostream>
 #include <map>
 #include <string>
 #include <utility>
@@ -437,6 +438,10 @@
   // Assumptions: Placeholder values are not nested.
   //
   // * Search for a substring of the form "{$[^}]*}".
+  // The substring can contain semicolon-separated tokens. The first token is
+  // always the type name. If present, the second token is a prefix that is only
+  // inserted if the corresponding value is not empty. Accordingly, the third
+  // token is a suffix.
   //
   // * Check if this substring is a supported type of this component.
   //
@@ -450,12 +455,10 @@
 
   // Create a result vector for the tokens that are joined in the end.
   std::vector<base::StringPiece16> result_pieces;
-  // Reserve space for 10 tokens. This should be sufficient for most cases.
-  result_pieces.reserve(10);
 
-  // Store the inserted values to allow the used StringPieces to stay valid.
+  // Store the token pieces that are joined in the end.
   std::vector<base::string16> inserted_values;
-  inserted_values.reserve(4);
+  inserted_values.reserve(20);
 
   // Use a StringPiece rather than the string since this allows for getting
   // cheap views onto substrings.
@@ -473,7 +476,7 @@
       started_control_sequence = true;
       // Append the preceding string since it can't be a valid placeholder.
       if (i > 0) {
-        result_pieces.emplace_back(format_piece.substr(
+        inserted_values.emplace_back(format_piece.substr(
             processed_until_index, i - processed_until_index));
       }
       processed_until_index = i;
@@ -483,29 +486,55 @@
       // The control sequence came to an end.
       started_control_sequence = false;
       size_t placeholder_start = processed_until_index + 2;
-      base::string16 type_name(
+      base::string16 placeholder(
           format_piece.substr(placeholder_start, i - placeholder_start));
+
+      std::vector<base::string16> placeholder_tokens =
+          base::SplitString(placeholder, base::ASCIIToUTF16(";"),
+                            base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+      DCHECK(placeholder_tokens.size() > 0);
+
+      // By convention, the first token is the type of the placeholder.
+      base::string16 type_name = placeholder_tokens.at(0);
+      // If present, the second token is the prefix.
+      base::string16 prefix = placeholder_tokens.size() > 1
+                                  ? placeholder_tokens.at(1)
+                                  : base::string16();
+      // And the third token the suffix.
+      base::string16 suffix = placeholder_tokens.size() > 2
+                                  ? placeholder_tokens.at(2)
+                                  : base::string16();
+
       base::string16 value;
       if (GetValueAndStatusForTypeIfPossible(base::UTF16ToASCII(type_name),
                                              &value, nullptr)) {
         // The type is valid and should be substituted.
-        inserted_values.emplace_back(std::move(value));
-        result_pieces.emplace_back(base::StringPiece16(inserted_values.back()));
+        if (!value.empty()) {
+          // Add the prefix if present.
+          if (!prefix.empty())
+            inserted_values.emplace_back(std::move(prefix));
+
+          // Add the substituted value.
+          inserted_values.emplace_back(std::move(value));
+          // Add the suffix if present.
+          if (!suffix.empty())
+            inserted_values.emplace_back(std::move(suffix));
+        }
       } else {
         // Append the control sequence as it is, because the type is not
         // supported by the component tree.
-        result_pieces.emplace_back(format_piece.substr(
+        inserted_values.emplace_back(format_piece.substr(
             processed_until_index, i - processed_until_index + 1));
       }
       processed_until_index = i + 1;
     }
   }
   // Append the rest of the string.
-  result_pieces.emplace_back(
+  inserted_values.emplace_back(
       format_piece.substr(processed_until_index, base::string16::npos));
 
   // Build the final result.
-  return base::JoinString(result_pieces, base::ASCIIToUTF16(""));
+  return base::JoinString(inserted_values, base::ASCIIToUTF16(""));
 }
 
 bool AddressComponent::CompleteFullTree() {
@@ -531,7 +560,8 @@
     return;
 
   // If the value is assigned, parse the subcomponents from the value.
-  if (!GetValue().empty())
+  if (!GetValue().empty() &&
+      MaximumNumberOfAssignedAddressComponentsOnNodeToLeafPaths() == 1)
     ParseValueAndAssignSubcomponents();
 
   // First call completion on all subcomponents.
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_component.h b/components/autofill/core/browser/data_model/autofill_structured_address_component.h
index 8f3bce9..98e1c63 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_component.h
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_component.h
@@ -373,13 +373,13 @@
   // If no empty node is available, it appends the value to the first node.
   virtual void ConsumeAdditionalToken(const base::string16& token_value);
 
- private:
-  // Returns a reference to the constant root node of the tree.
-  const AddressComponent& GetRootNode() const;
-
   // Returns a reference to the root node of the tree.
   AddressComponent& GetRootNode();
 
+  // Returns a reference to the root node of the tree.
+  const AddressComponent& GetRootNode() const;
+
+ private:
   // Unsets the node and all of its children.
   void UnsetAddressComponentAndItsSubcomponents();
 
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_component_unittest.cc b/components/autofill/core/browser/data_model/autofill_structured_address_component_unittest.cc
index eee071e..c6627976 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_component_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_component_unittest.cc
@@ -171,6 +171,29 @@
   TestAtomicLastNameAddressComponent last_name{this};
 };
 
+// Creates a compound name with a custom format for testing purposes.
+class TestCompoundNameCustomAffixedFormatAddressComponent
+    : public AddressComponent {
+ public:
+  TestCompoundNameCustomAffixedFormatAddressComponent()
+      : TestCompoundNameCustomAffixedFormatAddressComponent(nullptr) {}
+  explicit TestCompoundNameCustomAffixedFormatAddressComponent(
+      AddressComponent* parent)
+      : AddressComponent(NAME_FULL,
+                         parent,
+                         {&first_name, &middle_name, &last_name}) {}
+
+  // Introduces a custom format with a leading last name.
+  base::string16 GetBestFormatString() const override {
+    return ASCIIToUTF16("${NAME_LAST;Dr. ; MD}, ${NAME_FIRST}");
+  }
+
+ private:
+  TestAtomicFirstNameAddressComponent first_name{this};
+  TestAtomicMiddleNameAddressComponent middle_name{this};
+  TestAtomicLastNameAddressComponent last_name{this};
+};
+
 // Creates a compound name with a custom format with unsupported token.
 class TestCompoundNameCustomFormatWithUnsupportedTokenAddressComponent
     : public AddressComponent {
@@ -725,6 +748,32 @@
   EXPECT_EQ(expected_value, actual_value);
 }
 
+// Tests the formatting of the unstructured value from the components with a
+// type-specific format string containing a prefix and a suffix.
+TEST(AutofillStructuredAddressAddressComponent,
+     FormatValueFromSubcomponentsWithTypeSpecificAffixedFormat) {
+  base::string16 first_name = ASCIIToUTF16("Winston");
+  base::string16 middle_name = ASCIIToUTF16("O'Brien");
+  base::string16 last_name = ASCIIToUTF16("Smith");
+  // Create a compound component.
+  TestCompoundNameCustomAffixedFormatAddressComponent compound_component;
+
+  // Set the values of the subcomponents.
+  compound_component.SetValueForTypeIfPossible(
+      NAME_FIRST, first_name, VerificationStatus::kUserVerified);
+  compound_component.SetValueForTypeIfPossible(
+      NAME_MIDDLE, middle_name, VerificationStatus::kUserVerified);
+  compound_component.SetValueForTypeIfPossible(
+      NAME_LAST, last_name, VerificationStatus::kUserVerified);
+
+  // Format the compound and verify the expectation.
+  compound_component.FormatValueFromSubcomponentsForTesting();
+  base::string16 expected_value = ASCIIToUTF16("Dr. Smith MD, Winston");
+  base::string16 actual_value = compound_component.GetValue();
+
+  EXPECT_EQ(expected_value, actual_value);
+}
+
 // Tests parsing of an empty value. Because, that's why.
 TEST(AutofillStructuredAddressAddressComponent,
      TestParseValueAndAssignSubcomponentsByFallbackMethod_EmptyString) {
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_name.cc b/components/autofill/core/browser/data_model/autofill_structured_address_name.cc
index bd46e9d..21182070 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_name.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_name.cc
@@ -39,22 +39,16 @@
   return base::i18n::ToUpper(result);
 }
 
-NameHonorific::NameHonorific() : NameHonorific(nullptr) {}
-
 NameHonorific::NameHonorific(AddressComponent* parent)
     : AddressComponent(NAME_HONORIFIC_PREFIX, parent) {}
 
 NameHonorific::~NameHonorific() = default;
 
-NameFirst::NameFirst() : NameFirst(nullptr) {}
-
 NameFirst::NameFirst(AddressComponent* parent)
     : AddressComponent(NAME_FIRST, parent) {}
 
 NameFirst::~NameFirst() = default;
 
-NameMiddle::NameMiddle() : NameMiddle(nullptr) {}
-
 NameMiddle::NameMiddle(AddressComponent* parent)
     : AddressComponent(NAME_MIDDLE, parent) {}
 
@@ -96,15 +90,11 @@
   return false;
 }
 
-NameLastFirst::NameLastFirst() : NameLastFirst(nullptr) {}
-
 NameLastFirst::NameLastFirst(AddressComponent* parent)
     : AddressComponent(NAME_LAST_FIRST, parent) {}
 
 NameLastFirst::~NameLastFirst() = default;
 
-NameLastConjunction::NameLastConjunction() : NameLastConjunction(nullptr) {}
-
 NameLastConjunction::NameLastConjunction(AddressComponent* parent)
     : AddressComponent(NAME_LAST_CONJUNCTION, parent) {}
 
@@ -120,15 +110,11 @@
   return {pattern_provider->GetRegEx(RegEx::kParseLastNameIntoSecondLastName)};
 }
 
-NameLastSecond::NameLastSecond() : NameLastSecond(nullptr) {}
-
 NameLastSecond::NameLastSecond(AddressComponent* parent)
     : AddressComponent(NAME_LAST_SECOND, parent) {}
 
 NameLastSecond::~NameLastSecond() = default;
 
-NameLast::NameLast() : NameLast(nullptr) {}
-
 NameLast::NameLast(AddressComponent* parent)
     : AddressComponent(NAME_LAST, parent, {&first_, &conjunction_, &second_}) {}
 
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_name.h b/components/autofill/core/browser/data_model/autofill_structured_address_name.h
index 4c925f50..46e8104 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_name.h
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_name.h
@@ -22,7 +22,6 @@
 // Atomic component that represents the honorific prefix of a name.
 class NameHonorific : public AddressComponent {
  public:
-  NameHonorific();
   explicit NameHonorific(AddressComponent* parent);
   ~NameHonorific() override;
 };
@@ -30,7 +29,6 @@
 // Atomic components that represents the first name.
 class NameFirst : public AddressComponent {
  public:
-  NameFirst();
   explicit NameFirst(AddressComponent* parent);
   ~NameFirst() override;
 };
@@ -38,7 +36,6 @@
 // Atomic component that represents the middle name.
 class NameMiddle : public AddressComponent {
  public:
-  NameMiddle();
   explicit NameMiddle(AddressComponent* parent);
   ~NameMiddle() override;
 
@@ -62,7 +59,6 @@
 // Atomic component that represents the first part of a last name.
 class NameLastFirst : public AddressComponent {
  public:
-  NameLastFirst();
   explicit NameLastFirst(AddressComponent* parent);
   ~NameLastFirst() override;
 };
@@ -71,7 +67,6 @@
 // surname.
 class NameLastConjunction : public AddressComponent {
  public:
-  NameLastConjunction();
   explicit NameLastConjunction(AddressComponent* parent);
   ~NameLastConjunction() override;
 };
@@ -79,7 +74,6 @@
 // Atomic component that represents the second part of a surname.
 class NameLastSecond : public AddressComponent {
  public:
-  NameLastSecond();
   explicit NameLastSecond(AddressComponent* parent);
   ~NameLastSecond() override;
 };
@@ -102,7 +96,6 @@
 //
 class NameLast : public AddressComponent {
  public:
-  NameLast();
   explicit NameLast(AddressComponent* parent);
   ~NameLast() override;
 
@@ -113,9 +106,9 @@
   // As the fallback, write everything to the second last name.
   void ParseValueAndAssignSubcomponentsByFallbackMethod() override;
 
-  NameLastFirst first_;
-  NameLastConjunction conjunction_;
-  NameLastSecond second_;
+  NameLastFirst first_{this};
+  NameLastConjunction conjunction_{this};
+  NameLastSecond second_{this};
 };
 
 // Compound that represents a full name. It contains a honorific, a first
@@ -146,22 +139,23 @@
   NameFull(const NameFull& other);
   ~NameFull() override;
 
+  // Migrates from a legacy structure in which name tokens are imported without
+  // a status.
+  void MigrateLegacyStructure(bool is_verified_profile);
+
+ protected:
   std::vector<const re2::RE2*> GetParseRegularExpressionsByRelevance()
       const override;
 
   // Returns the format string to create the full name from its subcomponents.
   base::string16 GetBestFormatString() const override;
 
-  // Migrates from a legacy structure in which name tokens are imported without
-  // a status.
-  void MigrateLegacyStructure(bool is_verified_profile);
-
  private:
   // TODO(crbug.com/1113617): Honorifics are temporally disabled.
   // NameHonorific name_honorific_;
-  NameFirst name_first_;
-  NameMiddle name_middle_;
-  NameLast name_last_;
+  NameFirst name_first_{this};
+  NameMiddle name_middle_{this};
+  NameLast name_last_{this};
 };
 
 }  // namespace structured_address
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_name_unittest.cc b/components/autofill/core/browser/data_model/autofill_structured_address_name_unittest.cc
index 566a689..d2c478bd 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_name_unittest.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_name_unittest.cc
@@ -12,6 +12,7 @@
 #include "base/feature_list.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/scoped_feature_list.h"
+#include "components/autofill/core/browser/data_model/autofill_structured_address_test_utils.h"
 #include "components/autofill/core/browser/data_model/autofill_structured_address_utils.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -21,40 +22,10 @@
 namespace autofill {
 namespace structured_address {
 
+using AddressComponentTestValues = std::vector<AddressComponentTestValue>;
+
 namespace {
 
-struct AddressComponentTestValue {
-  ServerFieldType type;
-  std::string value;
-  VerificationStatus status;
-};
-
-struct AddressComponentTestValues {
-  std::vector<AddressComponentTestValue> values;
-};
-
-void SetTestValues(AddressComponent* component,
-                   const AddressComponentTestValues& test_values,
-                   bool finalize = true) {
-  for (const auto& test_value : test_values.values) {
-    component->SetValueForTypeIfPossible(test_value.type,
-                                         base::UTF8ToUTF16(test_value.value),
-                                         test_value.status);
-  }
-  if (finalize)
-    component->CompleteFullTree();
-}
-
-void VerifyTestValues(AddressComponent* component,
-                      const AddressComponentTestValues test_values) {
-  for (const auto& test_value : test_values.values) {
-    EXPECT_EQ(component->GetValueForType(test_value.type),
-              base::UTF8ToUTF16(test_value.value));
-    EXPECT_EQ(component->GetVerificationStatusForType(test_value.type),
-              test_value.status);
-  }
-}
-
 // A test record that contains all entries of the hybrid-structure name tree.
 struct NameParserTestRecord {
   std::string full;
@@ -110,7 +81,7 @@
                          const base::string16& target_second) {
   SCOPED_TRACE(last_name);
 
-  NameLast last_name_component;
+  NameLast last_name_component(nullptr);
   last_name_component.SetValueForTypeIfPossible(NAME_LAST, last_name,
                                                 VerificationStatus::kObserved);
 
@@ -709,8 +680,6 @@
   NameFull subset_name;
 
   AddressComponentTestValues name_values = {
-      .values =
-          {
               {.type = NAME_FIRST,
                .value = "Thomas",
                .status = VerificationStatus::kObserved},
@@ -720,12 +689,9 @@
               {.type = NAME_LAST,
                .value = "Anderson y Smith",
                .status = VerificationStatus::kObserved},
-          },
   };
 
   AddressComponentTestValues subset_name_values = {
-      .values =
-          {
               {.type = NAME_FIRST,
                .value = "Thomas",
                .status = VerificationStatus::kObserved},
@@ -738,12 +704,9 @@
               {.type = NAME_LAST_SECOND,
                .value = "Smith",
                .status = VerificationStatus::kObserved},
-          },
   };
 
   AddressComponentTestValues expectation = {
-      .values =
-          {
               {.type = NAME_FIRST,
                .value = "Thomas",
                .status = VerificationStatus::kObserved},
@@ -759,7 +722,6 @@
               {.type = NAME_LAST_SECOND,
                .value = "Smith",
                .status = VerificationStatus::kObserved},
-          },
   };
 
   SetTestValues(&name, name_values);
@@ -779,45 +741,36 @@
   NameFull subset_name;
 
   AddressComponentTestValues name_values = {
-      .values =
-          {
-              {.type = NAME_FIRST,
-               .value = "Thomas",
-               .status = VerificationStatus::kObserved},
-              {.type = NAME_MIDDLE,
-               .value = "Neo",
-               .status = VerificationStatus::kObserved},
-              {.type = NAME_LAST,
-               .value = "Anderson",
-               .status = VerificationStatus::kObserved},
-          },
+      {.type = NAME_FIRST,
+       .value = "Thomas",
+       .status = VerificationStatus::kObserved},
+      {.type = NAME_MIDDLE,
+       .value = "Neo",
+       .status = VerificationStatus::kObserved},
+      {.type = NAME_LAST,
+       .value = "Anderson",
+       .status = VerificationStatus::kObserved},
   };
 
   AddressComponentTestValues subset_name_values = {
-      .values =
-          {
-              {.type = NAME_FIRST,
-               .value = "Thomas",
-               .status = VerificationStatus::kObserved},
-              {.type = NAME_LAST,
-               .value = "Anderson",
-               .status = VerificationStatus::kObserved},
-          },
+      {.type = NAME_FIRST,
+       .value = "Thomas",
+       .status = VerificationStatus::kObserved},
+      {.type = NAME_LAST,
+       .value = "Anderson",
+       .status = VerificationStatus::kObserved},
   };
 
   AddressComponentTestValues expectation = {
-      .values =
-          {
-              {.type = NAME_FIRST,
-               .value = "Thomas",
-               .status = VerificationStatus::kObserved},
-              {.type = NAME_MIDDLE,
-               .value = "Neo",
-               .status = VerificationStatus::kObserved},
-              {.type = NAME_LAST,
-               .value = "Anderson",
-               .status = VerificationStatus::kObserved},
-          },
+      {.type = NAME_FIRST,
+       .value = "Thomas",
+       .status = VerificationStatus::kObserved},
+      {.type = NAME_MIDDLE,
+       .value = "Neo",
+       .status = VerificationStatus::kObserved},
+      {.type = NAME_LAST,
+       .value = "Anderson",
+       .status = VerificationStatus::kObserved},
   };
 
   SetTestValues(&name, name_values);
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_regex_provider.cc b/components/autofill/core/browser/data_model/autofill_structured_address_regex_provider.cc
index 48c41ce..5e9ca09 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_regex_provider.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_regex_provider.cc
@@ -156,6 +156,19 @@
     "tre|van|van der|väst|väster|verch|erch|vest|vestre|vesle|vetle|von|zu|von "
     "und zu)\\s)?";
 
+// Regular expression to match the affixes that indicate the floor an
+// apartment is located in.
+const char kFloorAffixRe[] =
+    "((°|º|\\.|\\s)*"
+    "(floor|flur|fl|og|obergeschoss|ug|untergeschoss|geschoss|andar)"
+    "(\\.|\\s|-)*)";
+
+const char kApartmentNumberPrefix[] =
+    "((apt|apartment|wohnung|apto)(\\.|\\s|-)*)";
+
+// Regular expression to match the prefixes that indicate a house number.
+const char kHouseNumberOptionalPrefixRe[] = "(((no|°|º|number)(\\.|-|\\s)*)?)";
+
 // Regular expressions to characterize if a string contains initials by
 // checking that:
 // * The string contains only upper case letters that may be preceded by a
@@ -325,6 +338,82 @@
       {CaptureTypeWithPattern(NAME_LAST_SECOND, kMultipleLazyWordsRe)});
 }
 
+// Returns an expression to parse a street address into the street name, the
+// house number and the subpremise. The latter is parsed into the floor and
+// apartment number. The expression is applicable, if the street name comes
+// before the house number, followed by the floor and the apartment.
+// Both the floor and the apartment must be indicated by a prefix.
+// Example: Erika-Mann-Str. 44, Floor 2, Apartment 12
+std::string ParseStreetNameHouseNumberExpression() {
+  return CaptureTypeWithPattern(
+      ADDRESS_HOME_STREET_ADDRESS,
+      {CaptureTypeWithPattern(ADDRESS_HOME_STREET_NAME, kMultipleLazyWordsRe),
+       CaptureTypeWithPrefixedPattern(ADDRESS_HOME_HOUSE_NUMBER,
+                                      kHouseNumberOptionalPrefixRe,
+                                      "(?:\\d+\\w?)"),
+       CaptureTypeWithPattern(
+           ADDRESS_HOME_SUBPREMISE,
+           {
+               CaptureTypeWithPrefixedPattern(ADDRESS_HOME_FLOOR, kFloorAffixRe,
+                                              "(?:(\\d{0,3}\\w?))",
+                                              {.quantifier = MATCH_OPTIONAL}),
+               CaptureTypeWithPrefixedPattern(
+                   ADDRESS_HOME_APT_NUM, kApartmentNumberPrefix,
+                   "(?:(\\d{0,3}\\w?))", {.quantifier = MATCH_OPTIONAL}),
+           },
+           {.quantifier = MATCH_OPTIONAL})});
+}
+
+// Returns an expression to parse a street address into the street name, the
+// house number and the subpremise. The latter is parsed into the floor and
+// apartment number. The expression is applicable, if the house number comes
+// before the street name, followed by the floor which is indicated by a suffix
+// and the apartment.
+// Example Av. Paulista, 1098, 1º andar, apto. 101
+std::string ParseStreetNameHouseNumberExpressionSuffixedFloor() {
+  return CaptureTypeWithPattern(
+      ADDRESS_HOME_STREET_ADDRESS,
+      {CaptureTypeWithPattern(ADDRESS_HOME_STREET_NAME, kMultipleLazyWordsRe),
+       CaptureTypeWithPrefixedPattern(ADDRESS_HOME_HOUSE_NUMBER,
+                                      kHouseNumberOptionalPrefixRe,
+                                      "(?:\\d+\\w?)"),
+       CaptureTypeWithPattern(
+           ADDRESS_HOME_SUBPREMISE,
+           {
+               CaptureTypeWithSuffixedPattern(
+                   ADDRESS_HOME_FLOOR, "(?:(\\d{0,3}\\w?))", kFloorAffixRe,
+                   {.quantifier = MATCH_OPTIONAL}),
+               CaptureTypeWithPrefixedPattern(
+                   ADDRESS_HOME_APT_NUM, kApartmentNumberPrefix,
+                   "(?:(\\d{0,3}\\w?))", {.quantifier = MATCH_OPTIONAL}),
+           },
+           {.quantifier = MATCH_OPTIONAL})});
+}
+
+// Returns an expression to parse a street address into the street name, the
+// house number and the subpremise. The latter is parsed into the floor and
+// apartment number. The expression is applicable, if the house number comes
+// before the street name, followed by the floor and the apartment.
+// Both the floor and the apartment must be indicated by a prefix.
+// Example: 1600 Main Avenue, Floor 2, Apartment 12
+std::string ParseHouseNumberStreetNameExpression() {
+  return CaptureTypeWithPattern(
+      ADDRESS_HOME_STREET_ADDRESS,
+      {CaptureTypeWithPattern(ADDRESS_HOME_HOUSE_NUMBER, "(?:\\d+\\w{0,3})"),
+       CaptureTypeWithPattern(ADDRESS_HOME_STREET_NAME, kMultipleLazyWordsRe),
+       CaptureTypeWithPattern(
+           ADDRESS_HOME_SUBPREMISE,
+           {
+               CaptureTypeWithPrefixedPattern(ADDRESS_HOME_FLOOR, kFloorAffixRe,
+                                              "(?:(\\d{0,3}\\w?))",
+                                              {.quantifier = MATCH_OPTIONAL}),
+               CaptureTypeWithPrefixedPattern(
+                   ADDRESS_HOME_APT_NUM, kApartmentNumberPrefix,
+                   "(?:(\\d{0,3}\\w?))", {.quantifier = MATCH_OPTIONAL}),
+           },
+           {.quantifier = MATCH_OPTIONAL})});
+}
+
 }  // namespace
 
 StructuredAddressesRegExProvider::StructuredAddressesRegExProvider() = default;
@@ -369,6 +458,12 @@
       return kMiddleNameInitialsCharacteristicsRe;
     case RegEx::kParseLastNameIntoSecondLastName:
       return ParseLastNameIntoSecondLastNameExpression();
+    case RegEx::kParseHouseNumberStreetName:
+      return ParseHouseNumberStreetNameExpression();
+    case RegEx::kParseStreetNameHouseNumberSuffixedFloor:
+      return ParseStreetNameHouseNumberExpressionSuffixedFloor();
+    case RegEx::kParseStreetNameHouseNumber:
+      return ParseStreetNameHouseNumberExpression();
   }
   NOTREACHED();
 }
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_regex_provider.h b/components/autofill/core/browser/data_model/autofill_structured_address_regex_provider.h
index ce40fa5d..ce94af3c 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_regex_provider.h
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_regex_provider.h
@@ -34,6 +34,9 @@
   kParseHispanicFullName,
   kParseLastNameIntoSecondLastName,
   kMatchMiddleNameInitialsCharacteristics,
+  kParseStreetNameHouseNumber,
+  kParseStreetNameHouseNumberSuffixedFloor,
+  kParseHouseNumberStreetName,
   kLastRegEx = kParseLastNameIntoSecondLastName,
 };
 
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_test_utils.cc b/components/autofill/core/browser/data_model/autofill_structured_address_test_utils.cc
new file mode 100644
index 0000000..aa76ca7
--- /dev/null
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_test_utils.cc
@@ -0,0 +1,60 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/data_model/autofill_structured_address_test_utils.h"
+
+#include <ostream>
+#include "base/strings/stringprintf.h"
+#include "base/strings/utf_string_conversions.h"
+#include "components/autofill/core/browser/autofill_type.h"
+
+namespace autofill {
+namespace structured_address {
+
+std::ostream& operator<<(std::ostream& out, const AddressComponent& component) {
+  out << "type=" << component.GetStorageTypeName()
+      << ", value=" << base::UTF16ToUTF8(component.GetValue())
+      << ", status=" << static_cast<int>(component.GetVerificationStatus())
+      << std::endl;
+  for (const auto* sub_component : component.Subcomponents()) {
+    out << "\t" << *sub_component;
+  }
+  return out;
+}
+
+using AddressComponentTestValues = std::vector<AddressComponentTestValue>;
+
+void SetTestValues(AddressComponent* component,
+                   const AddressComponentTestValues& test_values,
+                   bool finalize) {
+  for (const auto& test_value : test_values) {
+    component->SetValueForTypeIfPossible(test_value.type,
+                                         base::UTF8ToUTF16(test_value.value),
+                                         test_value.status);
+  }
+  if (finalize)
+    component->CompleteFullTree();
+}
+
+void VerifyTestValues(AddressComponent* component,
+                      const AddressComponentTestValues test_values) {
+  for (const auto& test_value : test_values) {
+    SCOPED_TRACE(base::StringPrintf(
+        "Failed type=%s, value=%s, status=%d",
+        AutofillType(test_value.type).ToString().c_str(),
+        test_value.value.c_str(), static_cast<int>(test_value.status)));
+
+    EXPECT_EQ(component->GetValueForType(test_value.type),
+              base::UTF8ToUTF16(test_value.value));
+
+    // Omit testing the status if the value is empty.
+    if (!test_value.value.empty()) {
+      EXPECT_EQ(component->GetVerificationStatusForType(test_value.type),
+                test_value.status);
+    }
+  }
+}
+
+}  // namespace structured_address
+}  // namespace autofill
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_test_utils.h b/components/autofill/core/browser/data_model/autofill_structured_address_test_utils.h
new file mode 100644
index 0000000..93e626c1
--- /dev/null
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_test_utils.h
@@ -0,0 +1,38 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_STRUCTURED_ADDRESS_TEST_UTILS_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_STRUCTURED_ADDRESS_TEST_UTILS_H_
+
+#include <string>
+
+#include "components/autofill/core/browser/data_model/autofill_structured_address_component.h"
+#include "components/autofill/core/browser/data_model/autofill_structured_address_utils.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace autofill {
+namespace structured_address {
+
+// Defines the type, value and verification status of a structured address
+// component for testing.
+struct AddressComponentTestValue {
+  ServerFieldType type;
+  std::string value;
+  VerificationStatus status;
+};
+
+// Sets the supplied test values.
+void SetTestValues(AddressComponent* component,
+                   const std::vector<AddressComponentTestValue>& test_values,
+                   bool finalize = true);
+
+// Verifies that all values and verification statuses in |test_values| match
+// the values of the structured |component|.
+void VerifyTestValues(AddressComponent* component,
+                      const std::vector<AddressComponentTestValue> test_values);
+
+}  // namespace structured_address
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_DATA_MODEL_AUTOFILL_STRUCTURED_ADDRESS_TEST_UTILS_H_
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_unittest.cc b/components/autofill/core/browser/data_model/autofill_structured_address_unittest.cc
new file mode 100644
index 0000000..a8bb69cb
--- /dev/null
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_unittest.cc
@@ -0,0 +1,212 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/data_model/autofill_structured_address.h"
+
+#include <stddef.h>
+#include <map>
+#include <ostream>
+#include <string>
+#include <vector>
+
+#include "base/feature_list.h"
+#include "base/strings/utf_string_conversions.h"
+#include "base/test/scoped_feature_list.h"
+#include "components/autofill/core/browser/data_model/autofill_structured_address_test_utils.h"
+#include "components/autofill/core/browser/data_model/autofill_structured_address_utils.h"
+#include "components/autofill/core/common/autofill_features.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using base::ASCIIToUTF16;
+
+namespace autofill {
+namespace structured_address {
+
+using AddressComponentTestValues = std::vector<AddressComponentTestValue>;
+
+struct AddressLineParsingTestCase {
+  std::string country_code = "";
+  std::string street_address = "";
+  std::string street_name = "";
+  std::string house_number = "";
+  std::string floor = "";
+  std::string apartment = "";
+};
+
+std::ostream& operator<<(std::ostream& out,
+                         const AddressLineParsingTestCase& test_case) {
+  out << "Country: " << test_case.country_code << std::endl;
+  out << "Street address: " << test_case.street_address << std::endl;
+  out << "Street name: " << test_case.street_name << std::endl;
+  out << "House number: " << test_case.house_number << std::endl;
+  out << "Floor: " << test_case.floor << std::endl;
+  out << "Apartment: " << test_case.apartment << std::endl;
+  return out;
+}
+
+void TestAddressLineParsing(const AddressLineParsingTestCase& test_case) {
+  Address address(nullptr);
+  const AddressComponentTestValues test_value = {
+      {.type = ADDRESS_HOME_STREET_ADDRESS,
+       .value = test_case.street_address,
+       .status = VerificationStatus::kObserved}};
+
+  SetTestValues(&address, test_value);
+
+  SCOPED_TRACE(test_case);
+
+  const AddressComponentTestValues expectation = {
+      {.type = ADDRESS_HOME_COUNTRY,
+       .value = test_case.country_code,
+       .status = VerificationStatus::kObserved},
+      {.type = ADDRESS_HOME_STREET_ADDRESS,
+       .value = test_case.street_address,
+       .status = VerificationStatus::kObserved},
+      {.type = ADDRESS_HOME_STREET_NAME,
+       .value = test_case.street_name,
+       .status = VerificationStatus::kParsed},
+      {.type = ADDRESS_HOME_HOUSE_NUMBER,
+       .value = test_case.house_number,
+       .status = VerificationStatus::kParsed},
+      {.type = ADDRESS_HOME_APT_NUM,
+       .value = test_case.apartment,
+       .status = VerificationStatus::kParsed},
+      {.type = ADDRESS_HOME_FLOOR,
+       .value = test_case.floor,
+       .status = VerificationStatus::kParsed}};
+  VerifyTestValues(&address, expectation);
+}
+
+void TestAddressLineFormatting(const AddressLineParsingTestCase& test_case) {
+  Address address;
+  const AddressComponentTestValues test_value = {
+      {.type = ADDRESS_HOME_COUNTRY,
+       .value = test_case.country_code,
+       .status = VerificationStatus::kObserved},
+      {.type = ADDRESS_HOME_STREET_NAME,
+       .value = test_case.street_name,
+       .status = VerificationStatus::kObserved},
+      {.type = ADDRESS_HOME_HOUSE_NUMBER,
+       .value = test_case.house_number,
+       .status = VerificationStatus::kObserved},
+      {.type = ADDRESS_HOME_FLOOR,
+       .value = test_case.floor,
+       .status = VerificationStatus::kObserved},
+      {.type = ADDRESS_HOME_APT_NUM,
+       .value = test_case.apartment,
+       .status = VerificationStatus::kObserved}};
+
+  SetTestValues(&address, test_value);
+
+  SCOPED_TRACE(test_case);
+
+  const AddressComponentTestValues expectation = {
+      {.type = ADDRESS_HOME_COUNTRY,
+       .value = test_case.country_code,
+       .status = VerificationStatus::kObserved},
+      {.type = ADDRESS_HOME_STREET_ADDRESS,
+       .value = test_case.street_address,
+       .status = VerificationStatus::kFormatted},
+      {.type = ADDRESS_HOME_STREET_NAME,
+       .value = test_case.street_name,
+       .status = VerificationStatus::kObserved},
+      {.type = ADDRESS_HOME_HOUSE_NUMBER,
+       .value = test_case.house_number,
+       .status = VerificationStatus::kObserved},
+      {.type = ADDRESS_HOME_APT_NUM,
+       .value = test_case.apartment,
+       .status = VerificationStatus::kObserved},
+      {.type = ADDRESS_HOME_FLOOR,
+       .value = test_case.floor,
+       .status = VerificationStatus::kObserved}};
+  VerifyTestValues(&address, expectation);
+}
+
+using AddressComponentTestValues = std::vector<AddressComponentTestValue>;
+
+namespace {
+
+TEST(AutofillStructuredAddress, ParseStreetAddress) {
+  std::vector<AddressLineParsingTestCase> test_cases = {
+      {.street_address = "Erika-Mann-Str. 33",
+       .street_name = "Erika-Mann-Str.",
+       .house_number = "33"},
+      {.street_address = "Implerstr. 73a",
+       .street_name = "Implerstr.",
+       .house_number = "73a"},
+      {.street_address = "Implerstr. 73a Obergeschoss 2 Wohnung 3",
+       .street_name = "Implerstr.",
+       .house_number = "73a",
+       .floor = "2",
+       .apartment = "3"},
+      {.street_address = "Implerstr. 73a OG 2",
+       .street_name = "Implerstr.",
+       .house_number = "73a",
+       .floor = "2"},
+      {.street_address = "Implerstr. 73a 2. OG",
+       .street_name = "Implerstr.",
+       .house_number = "73a",
+       .floor = "2"},
+      {.street_address = "Implerstr. no 73a",
+       .street_name = "Implerstr.",
+       .house_number = "73a"},
+      {.street_address = "Implerstr. °73a",
+       .street_name = "Implerstr.",
+       .house_number = "73a"},
+      {.street_address = "Implerstr. number 73a",
+       .street_name = "Implerstr.",
+       .house_number = "73a"},
+      {.street_address = "1600 Amphitheatre Parkway",
+       .street_name = "Amphitheatre Parkway",
+       .house_number = "1600"},
+      {.street_address = "1600 Amphitheatre Parkway, Floor 6 Apt 12",
+       .street_name = "Amphitheatre Parkway",
+       .house_number = "1600",
+       .floor = "6",
+       .apartment = "12"},
+      {.street_address = "Av. Paulista, 1098, 1º andar, apto. 101",
+       .street_name = "Av. Paulista",
+       .house_number = "1098",
+       .floor = "1",
+       .apartment = "101"}};
+
+  for (const auto& test_case : test_cases)
+    TestAddressLineParsing(test_case);
+}
+
+TEST(AutofillStructuredAddress, TestStreetAddressFormatting) {
+  Address address;
+
+  std::vector<AddressLineParsingTestCase> test_cases = {
+      {
+          .country_code = "BR",
+          .street_address = "Av. Brigadeiro Faria Lima, 3477, 1º andar, apto 2",
+          .street_name = "Av. Brigadeiro Faria Lima",
+          .house_number = "3477",
+          .floor = "1",
+          .apartment = "2",
+      },
+      {.country_code = "DE",
+       .street_address = "Erika-Mann-Str. 33",
+       .street_name = "Erika-Mann-Str.",
+       .house_number = "33"},
+      {.country_code = "DE",
+       .street_address = "Erika-Mann-Str. 33, 2. Stock, 12. Wohnung",
+       .street_name = "Erika-Mann-Str.",
+       .house_number = "33",
+       .floor = "2",
+       .apartment = "12"},
+      {.street_address = "1600 Amphitheatre Parkway FL 6 APT 12",
+       .street_name = "Amphitheatre Parkway",
+       .house_number = "1600",
+       .floor = "6",
+       .apartment = "12"}};
+
+  for (const auto& test_case : test_cases)
+    TestAddressLineFormatting(test_case);
+}
+
+}  // namespace
+}  // namespace structured_address
+}  // namespace autofill
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_utils.cc b/components/autofill/core/browser/data_model/autofill_structured_address_utils.cc
index 29e99f5..04fee0b 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_utils.cc
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_utils.cc
@@ -212,9 +212,11 @@
       options);
 }
 
-std::string CaptureTypeWithPattern(const ServerFieldType& type,
-                                   const std::string& pattern,
-                                   const CaptureOptions& options) {
+std::string CaptureTypeWithAffixedPattern(const ServerFieldType& type,
+                                          const std::string& prefix,
+                                          const std::string& pattern,
+                                          const std::string& suffix,
+                                          const CaptureOptions& options) {
   std::string quantifier;
   switch (options.quantifier) {
     // Makes the match optional.
@@ -232,13 +234,32 @@
 
   // By adding an "i" in the first group, the capturing is case insensitive.
   // Allow multiple separators to support the ", " case.
-  return base::StrCat({"(?i:(?P<", AutofillType(type).ToString(), ">", pattern,
-                       ")(?:", options.separator, ")+)", quantifier});
+  return base::StrCat({"(?i:", prefix, "(?P<", AutofillType(type).ToString(),
+                       ">", pattern, ")", suffix, "(?:", options.separator,
+                       ")+)", quantifier});
+}
+
+std::string CaptureTypeWithSuffixedPattern(const ServerFieldType& type,
+                                           const std::string& pattern,
+                                           const std::string& suffix_pattern,
+                                           const CaptureOptions& options) {
+  return CaptureTypeWithAffixedPattern(type, std::string(), pattern,
+                                       suffix_pattern, options);
+}
+
+std::string CaptureTypeWithPrefixedPattern(const ServerFieldType& type,
+                                           const std::string& prefix_pattern,
+                                           const std::string& pattern,
+                                           const CaptureOptions& options) {
+  return CaptureTypeWithAffixedPattern(type, prefix_pattern, pattern,
+                                       std::string(), options);
 }
 
 std::string CaptureTypeWithPattern(const ServerFieldType& type,
-                                   const std::string& pattern) {
-  return CaptureTypeWithPattern(type, pattern, CaptureOptions());
+                                   const std::string& pattern,
+                                   CaptureOptions options) {
+  return CaptureTypeWithAffixedPattern(type, std::string(), pattern,
+                                       std::string(), options);
 }
 
 base::string16 NormalizeValue(const base::string16& value) {
diff --git a/components/autofill/core/browser/data_model/autofill_structured_address_utils.h b/components/autofill/core/browser/data_model/autofill_structured_address_utils.h
index cad351f6..0afdc5e 100644
--- a/components/autofill/core/browser/data_model/autofill_structured_address_utils.h
+++ b/components/autofill/core/browser/data_model/autofill_structured_address_utils.h
@@ -204,15 +204,37 @@
     std::initializer_list<base::StringPiece> pattern_span_initializer_list);
 
 // Returns a capture group named by the string representation of |type| that
-// matches |pattern|.
-std::string CaptureTypeWithPattern(const ServerFieldType& type,
-                                   const std::string& pattern,
-                                   const CaptureOptions& options);
+// matches |pattern| with an additional uncaptured |prefix_pattern| and
+// |suffix_pattern|.
+std::string CaptureTypeWithAffixedPattern(
+    const ServerFieldType& type,
+    const std::string& prefix_pattern,
+    const std::string& pattern,
+    const std::string& suffix_pattern,
+    const CaptureOptions& options = CaptureOptions());
 
-// Same as |CaptureTypeWithPattern(type, pattern, options)| but uses default
-// options.
-std::string CaptureTypeWithPattern(const ServerFieldType& type,
-                                   const std::string& pattern);
+// Convenience wrapper for |CaptureTypeWithAffixedPattern()| with an empty
+// |suffix_pattern|.
+std::string CaptureTypeWithPrefixedPattern(
+    const ServerFieldType& type,
+    const std::string& prefix_pattern,
+    const std::string& pattern,
+    const CaptureOptions& options = CaptureOptions());
+
+// Convenience wrapper for |CaptureTypeWithAffixedPattern()| with an empty
+// |prefix_pattern|.
+std::string CaptureTypeWithSuffixedPattern(
+    const ServerFieldType& type,
+    const std::string& pattern,
+    const std::string& suffix_pattern,
+    const CaptureOptions& options = CaptureOptions());
+
+// Convenience wrapper for |CaptureTypeWithAffixedPattern()| with an empty
+// |prefix_pattern| and |suffix_pattern|.
+std::string CaptureTypeWithPattern(
+    const ServerFieldType& type,
+    const std::string& pattern,
+    const CaptureOptions options = CaptureOptions());
 
 // Collapses white spaces and line breaks, converts the string to lower case and
 // removes diacritics.
diff --git a/components/autofill/core/browser/field_types.cc b/components/autofill/core/browser/field_types.cc
index de4fd51e..8e98827 100644
--- a/components/autofill/core/browser/field_types.cc
+++ b/components/autofill/core/browser/field_types.cc
@@ -50,6 +50,7 @@
     case ADDRESS_HOME_OTHER_SUBUNIT:
     case ADDRESS_HOME_ADDRESS:
     case ADDRESS_HOME_ADDRESS_WITH_NAME:
+    case ADDRESS_HOME_FLOOR:
       return true;
 
     // Billing address types that should not be returned by GetStorableType().
@@ -209,6 +210,8 @@
       return "ADDRESS_HOME_ADDRESS";
     case ADDRESS_HOME_ADDRESS_WITH_NAME:
       return "ADDRESS_HOME_ADDRESS_WITH_NAME";
+    case ADDRESS_HOME_FLOOR:
+      return "ADDRESS_HOME_FLOOR";
     case ADDRESS_HOME_LINE1:
       return "ADDRESS_HOME_LINE1";
     case ADDRESS_HOME_LINE2:
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h
index dc66556..7af166b 100644
--- a/components/autofill/core/browser/field_types.h
+++ b/components/autofill/core/browser/field_types.h
@@ -230,9 +230,12 @@
   // The complete formatted address including the name.
   ADDRESS_HOME_ADDRESS_WITH_NAME = 115,
 
+  // The floor number within a building.
+  ADDRESS_HOME_FLOOR = 116,
+
   // No new types can be added without a corresponding change to the Autofill
   // server.
-  MAX_VALID_FIELD_TYPE = 116,
+  MAX_VALID_FIELD_TYPE = 117,
 };
 
 // The list of all HTML autocomplete field type hints supported by Chrome.
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc
index d60138c..f8c3ba0a 100644
--- a/components/autofill/core/browser/personal_data_manager.cc
+++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -19,6 +19,7 @@
 #include "base/i18n/case_conversion.h"
 #include "base/i18n/timezone.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/ranges/algorithm.h"
 #include "base/stl_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
@@ -111,9 +112,9 @@
 
 template <typename C, typename T>
 bool FindByContents(const C& container, const T& needle) {
-  return std::any_of(
-      std::begin(container), std::end(container),
-      [&needle](const auto& element) { return element->Compare(needle) == 0; });
+  return base::ranges::any_of(container, [&needle](const auto& element) {
+    return element->Compare(needle) == 0;
+  });
 }
 
 bool IsSyncEnabledFor(const syncer::SyncService* sync_service,
diff --git a/components/autofill/core/browser/ui/label_formatter_utils.cc b/components/autofill/core/browser/ui/label_formatter_utils.cc
index 4c86a30..91f1a6e 100644
--- a/components/autofill/core/browser/ui/label_formatter_utils.cc
+++ b/components/autofill/core/browser/ui/label_formatter_utils.cc
@@ -10,6 +10,7 @@
 
 #include "base/bind.h"
 #include "base/callback.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/autofill/core/browser/autofill_data_util.h"
@@ -121,11 +122,11 @@
 }
 
 bool HasNonStreetAddress(const std::vector<ServerFieldType>& types) {
-  return std::any_of(types.begin(), types.end(), IsNonStreetAddressPart);
+  return base::ranges::any_of(types, IsNonStreetAddressPart);
 }
 
 bool HasStreetAddress(const std::vector<ServerFieldType>& types) {
-  return std::any_of(types.begin(), types.end(), IsStreetAddressPart);
+  return base::ranges::any_of(types, IsStreetAddressPart);
 }
 
 std::vector<ServerFieldType> ExtractSpecifiedAddressFieldTypes(
diff --git a/components/autofill/core/browser/ui/mobile_label_formatter.cc b/components/autofill/core/browser/ui/mobile_label_formatter.cc
index 6d5bb31..f9f3030 100644
--- a/components/autofill/core/browser/ui/mobile_label_formatter.cc
+++ b/components/autofill/core/browser/ui/mobile_label_formatter.cc
@@ -8,6 +8,7 @@
 
 #include "base/metrics/field_trial_params.h"
 #include "base/notreached.h"
+#include "base/ranges/algorithm.h"
 #include "components/autofill/core/browser/autofill_data_util.h"
 #include "components/autofill/core/browser/ui/label_formatter_utils.h"
 #include "components/autofill/core/common/autofill_features.h"
@@ -142,11 +143,9 @@
   if (could_show_name_) {
     // Due to mobile platforms' space constraints, only the first name is shown
     // if the form contains a first name field or a full name field.
-    std::any_of(field_types_for_labels().begin(),
-                field_types_for_labels().end(),
-                [](ServerFieldType type) {
-                  return type == NAME_FIRST || type == NAME_FULL;
-                })
+    base::ranges::any_of(
+        field_types_for_labels(),
+        [](auto type) { return type == NAME_FIRST || type == NAME_FULL; })
         ? AddLabelPartIfNotEmpty(GetLabelFirstName(profile, app_locale()),
                                  &label_parts)
         : AddLabelPartIfNotEmpty(
diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd
index 0180188..8914372 100644
--- a/components/browser_ui/strings/android/browser_ui_strings.grd
+++ b/components/browser_ui/strings/android/browser_ui_strings.grd
@@ -438,6 +438,33 @@
       <message name="IDS_PAGE_INFO_PERMISSIONS_TITLE" desc="Label used in the Page Info dialog above the permissions list.">
         Permissions
       </message>
+      <message name="IDS_PAGE_INFO_PERMISSIONS_OS_WARNING" desc="Text to show an OS-level permission warning.">
+        <ph name="PERMISSION">%1$s<ex>Location</ex></ph> - <ph name="WARNING_MESSAGE">%2$s<ex>Turned off for this device</ex></ph>
+      </message>
+      <message name="IDS_PAGE_INFO_PERMISSIONS_SUMMARY_1_ALLOWED" desc="Summary page info permissions string for one allowed permission.">
+        <ph name="PERMISSION_1">%1$s<ex>Location</ex></ph> allowed
+      </message>
+      <message name="IDS_PAGE_INFO_PERMISSIONS_SUMMARY_1_BLOCKED" desc="Summary page info permissions string for for one blocked permission.">
+        <ph name="PERMISSION_1">%1$s<ex>Location</ex></ph> blocked
+      </message>
+      <message name="IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_MIXED" desc="Summary page info permissions string for 2 permissions, with a mix of allowed/blocked.">
+        <ph name="PERMISSION_1">%1$s<ex>Location</ex></ph> allowed, <ph name="PERMISSION_2">%2$s<ex>Sound</ex></ph> blocked
+      </message>
+      <message name="IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_ALLOWED" desc="Summary page info permissions string for 2 permissions, all allowed.">
+        <ph name="PERMISSION_1">%1$s<ex>Location</ex></ph> and <ph name="PERMISSION_2">%2$s<ex>Sound</ex></ph> allowed
+      </message>
+      <message name="IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_BLOCKED" desc="Summary page info permissions string for 2 permissions, all blocked.">
+        <ph name="PERMISSION_1">%1$s<ex>Location</ex></ph> and <ph name="PERMISSION_2">%2$s<ex>Sound</ex></ph> blocked
+      </message>
+      <message name="IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_MIXED" desc="Summary page info permissions string for more than 2 permissions, with a mix of allowed/blocked.">
+        <ph name="PERMISSION_1">%1$s<ex>Location</ex></ph>, <ph name="PERMISSION_2">%2$s<ex>Sound</ex></ph> and <ph name="NUM_MORE">%3$s<ex>2</ex></ph> more
+      </message>
+      <message name="IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_ALLOWED" desc="Summary page info permissions string for more than 2 permissions, all allowed.">
+        <ph name="PERMISSION_1">%1$s<ex>Location</ex></ph>, <ph name="PERMISSION_2">%2$s<ex>Sound</ex></ph> and <ph name="NUM_MORE">%3$s<ex>2</ex></ph> more allowed
+      </message>
+      <message name="IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_BLOCKED" desc="Summary page info permissions string for more than 2 permissions, all blocked.">
+        <ph name="PERMISSION_1">%1$s<ex>Location</ex></ph>, <ph name="PERMISSION_2">%2$s<ex>Sound</ex></ph> and <ph name="NUM_MORE">%3$s<ex>2</ex></ph> more blocked
+      </message>
       <message name="IDS_PAGE_INFO_INSTANT_APP_BUTTON" desc="Text in the button that opens an Android Instant app that is associated with the website's URL.">
         Open Instant App
       </message>
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_OS_WARNING.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_OS_WARNING.png.sha1
new file mode 100644
index 0000000..aa40c8fe
--- /dev/null
+++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_OS_WARNING.png.sha1
@@ -0,0 +1 @@
+1ebae81df7e79f4728af7e5a39fe8775cccc0e68
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_1_ALLOWED.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_1_ALLOWED.png.sha1
new file mode 100644
index 0000000..7ed39fe
--- /dev/null
+++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_1_ALLOWED.png.sha1
@@ -0,0 +1 @@
+5f554c570505d64ac3b3e0ead2eb805eea0491b1
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_1_BLOCKED.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_1_BLOCKED.png.sha1
new file mode 100644
index 0000000..0471ffef
--- /dev/null
+++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_1_BLOCKED.png.sha1
@@ -0,0 +1 @@
+92d8cb9536bf4cd96afaed1a879de8039378fc15
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_ALLOWED.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_ALLOWED.png.sha1
new file mode 100644
index 0000000..3f5fb88
--- /dev/null
+++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_ALLOWED.png.sha1
@@ -0,0 +1 @@
+e132ef9679ec930f454cdefbb3a83ca87ddf4df3
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_BLOCKED.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_BLOCKED.png.sha1
new file mode 100644
index 0000000..ffd6f92
--- /dev/null
+++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_BLOCKED.png.sha1
@@ -0,0 +1 @@
+44ee17c678e39313b212a53b88cca35d1ed463ac
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_MIXED.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_MIXED.png.sha1
new file mode 100644
index 0000000..3a1bbe8
--- /dev/null
+++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_2_MIXED.png.sha1
@@ -0,0 +1 @@
+7ac5b2b9e52a561be7f884e1ca7a87f310c7023a
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_ALLOWED.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_ALLOWED.png.sha1
new file mode 100644
index 0000000..b818bf1
--- /dev/null
+++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_ALLOWED.png.sha1
@@ -0,0 +1 @@
+922c3132a13820a2a43e2ba5f762d3b6abdf7df7
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_BLOCKED.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_BLOCKED.png.sha1
new file mode 100644
index 0000000..28a5520
--- /dev/null
+++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_BLOCKED.png.sha1
@@ -0,0 +1 @@
+9706763ffee06d9bd4ba8d79f0ebd89f4927ec3d
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_MIXED.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_MIXED.png.sha1
new file mode 100644
index 0000000..d0718f79
--- /dev/null
+++ b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_PAGE_INFO_PERMISSIONS_SUMMARY_MORE_MIXED.png.sha1
@@ -0,0 +1 @@
+4bd3ee74502fcdd9cc2358b91c3ae0b9d4dec5fc
\ No newline at end of file
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
index 7868b766..761fab0 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Versteek inligting</translation>
 <translation id="3333961966071413176">Alle kontakte</translation>
 <translation id="3386292677130313581">Vra voordat werwe toegelaat word om jou ligging te ken (aanbeveel)</translation>
-<translation id="3479552764303398839">Nie nou nie</translation>
 <translation id="3538390592868664640">Verhoed werwe om 'n 3D-kaart van jou omgewing te skep of kameraposisie na te spoor</translation>
 <translation id="3586500876634962664">Kamera- en mikrofoongebruik</translation>
 <translation id="358794129225322306">Laat 'n werf toe om outomaties veelvuldige lêers af te laai</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
index bdb57aa5..c3d3de4c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">መረጃ ደብቅ</translation>
 <translation id="3333961966071413176">ሁሉም እውቂያዎች</translation>
 <translation id="3386292677130313581">ጣቢያዎች አካባቢዎን እንዲያውቁ ከመፍቀድዎ በፊት ይጠይቅ (የሚመከር)</translation>
-<translation id="3479552764303398839">አሁን አይደለም</translation>
 <translation id="3538390592868664640">ጣቢያዎች የዙሪያዎ የ3ል ካርታ እንዳይፈጥሩ ወይም የካሜራ ቦታን እንዳይከታተሉ ያግዷቸው</translation>
 <translation id="3586500876634962664">የካሜራ እና ማይክሮፎን ጥቅም</translation>
 <translation id="358794129225322306">አንድ ጣቢያ በራስ-ሰር በርካታ ፋይሎችን እንዲያወርድ ይፍቀዱ።</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
index b06088a9..dad1c92 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">إخفاء المعلومات</translation>
 <translation id="3333961966071413176">جميع جهات الاتصال</translation>
 <translation id="3386292677130313581">السؤال قبل السماح للمواقع الإلكترونية بمعرفة الموقع الجغرافي (موصى به)</translation>
-<translation id="3479552764303398839">ليس الآن</translation>
 <translation id="3538390592868664640">منع المواقع الإلكترونية من إنشاء خريطة ثلاثية الأبعاد للبيئة المحيطة بك أو تتبُّع موضع الكاميرا</translation>
 <translation id="3586500876634962664">الكاميرا والميكروفون قيد التشغيل</translation>
 <translation id="358794129225322306">السماح لموقع إلكتروني بتنزيل عدة ملفات تلقائيًا.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
index bbda81f..2fc03cd 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">তথ্য লুকুৱাওক</translation>
 <translation id="3333961966071413176">সকলো সম্পৰ্ক</translation>
 <translation id="3386292677130313581">ছাইটসমূহে আপোনাৰ অৱস্থান জনাৰ অনুমতি দিয়াৰ পূৰ্বে সোধক (চুপাৰিছ কৰা হয়)</translation>
-<translation id="3479552764303398839">এতিয়া নহয়</translation>
 <translation id="3538390592868664640">ছাইটসমূহক আপোনাৰ চৌপাশৰ এখন 3D মেপ সৃষ্টি কৰাৰ পৰা অথবা কেমেৰাৰ স্থান ট্ৰেক কৰাৰ পৰা অৱৰোধ কৰক</translation>
 <translation id="3586500876634962664">কেমেৰা আৰু মাইক্ৰ’ফ’নৰ ব্যৱহাৰ</translation>
 <translation id="358794129225322306">এটা ছাইটক একাধিক ফাইল স্বয়ংক্ৰিয়ভাৱে ডাউনল’ড কৰাৰ অনুমতি দিয়ক।</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
index 92f30e4..a84e83c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Məlumatı gizlədin</translation>
 <translation id="3333961966071413176">Bütün kontaktar</translation>
 <translation id="3386292677130313581">Saytlara məkanınızı bilmək icazəsi verməmişdən əvvəl soruşun (tövsiyə olunur)</translation>
-<translation id="3479552764303398839">İndi yox</translation>
 <translation id="3538390592868664640">Saytların ətrafınızdakı sahələrin 3D xəritəsini yaratmasına və ya kamera mövqeyini izləməsinə qarşı blok qoyun</translation>
 <translation id="3586500876634962664">Kamera və mikrofondan istifadə</translation>
 <translation id="358794129225322306">Sayta çoxsaylı faylları avtomatik endirmək icazəsi verin.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
index 343153ce..7f64be9 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Схаваць інфармацыю</translation>
 <translation id="3333961966071413176">Усе кантакты</translation>
 <translation id="3386292677130313581">Пытацца, перш чым дазволіць сайтам атрымліваць інфармацыю пра ваша месцазнаходжанне (рэкамендуецца)</translation>
-<translation id="3479552764303398839">Не зараз</translation>
 <translation id="3538390592868664640">Забараніць сайтам ствараць 3D-карту вашага асяроддзя і адсочваць становішча камеры</translation>
 <translation id="3586500876634962664">Выкарыстанне камеры і мікрафона</translation>
 <translation id="358794129225322306">Дазволіць сайту аўтаматычна спампоўваць некалькі файлаў.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
index afa2366..870b0f6 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Скриване на информацията</translation>
 <translation id="3333961966071413176">Всички контакти</translation>
 <translation id="3386292677130313581">Извеждане на запитване, преди на сайтовете да се разреши достъп до местоположението ви (препоръчително)</translation>
-<translation id="3479552764303398839">Не сега</translation>
 <translation id="3538390592868664640">Блокиране на сайтовете, така че да не могат да създават триизмерна карта на заобикалящата ви среда или да следят позицията на камерата</translation>
 <translation id="3586500876634962664">Ползване на камерата и микрофона</translation>
 <translation id="358794129225322306">Разрешаване на сайт автоматично да изтегля няколко файла.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
index 84ddf0e0..24e805f2 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">তথ্য লুকান</translation>
 <translation id="3333961966071413176">সব পরিচিতি</translation>
 <translation id="3386292677130313581">সাইটগুলিকে আপনার লোকেশন জানতে দিতে মঞ্জুরি দেওয়ার আগে জিজ্ঞাসা করুন (প্রস্তাবিত)</translation>
-<translation id="3479552764303398839">এখনই নয়</translation>
 <translation id="3538390592868664640">আপনার আশেপাশের এলাকার একটি 3D ম্যাপ তৈরি করা বা ক্যামেরার অবস্থান ট্র্যাক করার কাজে নিযুক্ত সাইটগুলিকে ব্লক করে দিন</translation>
 <translation id="3586500876634962664">ক্যামেরা ও মাইক্রোফোনের ব্যবহার</translation>
 <translation id="358794129225322306">একটি সাইটকে একাধিক ফাইল অটোমেটিক ডাউনলোড করার অনুমতি দিন।</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
index 8d9609e..118516c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bs.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Sakrij informacije</translation>
 <translation id="3333961966071413176">Svi kontakti</translation>
 <translation id="3386292677130313581">Web lokacije moraju tražiti dozvolu za pristup lokaciji (preporučeno)</translation>
-<translation id="3479552764303398839">Ne sada</translation>
 <translation id="3538390592868664640">Web lokacijama je blokirano kreiranje 3D mape vašeg okruženja ili praćenje položaja kamere</translation>
 <translation id="3586500876634962664">Korištenje kamere i mikrofona</translation>
 <translation id="358794129225322306">Dozvolite web lokaciji automatsko preuzimanje više fajlova.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
index c3d707fd..0bcdc95 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Amaga la informació</translation>
 <translation id="3333961966071413176">Tots els contactes</translation>
 <translation id="3386292677130313581">Pregunta abans de permetre que els llocs web sàpiguen la teva ubicació (opció recomanada)</translation>
-<translation id="3479552764303398839">Ara no</translation>
 <translation id="3538390592868664640">Impedeix que els llocs web creïn un mapa en 3D del teu entorn o que facin un seguiment de la posició de la càmera</translation>
 <translation id="3586500876634962664">Ús de la càmera i el micròfon</translation>
 <translation id="358794129225322306">Permet que un lloc web baixi diversos fitxers automàticament.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
index 3261cd1..98df7570 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Skrýt informace</translation>
 <translation id="3333961966071413176">Všechny kontakty</translation>
 <translation id="3386292677130313581">Pokud web bude chtít znát vaši polohu, zobrazit dotaz (doporučeno)</translation>
-<translation id="3479552764303398839">Teď ne</translation>
 <translation id="3538390592868664640">Bránit webům ve vytváření 3D mapy okolí a ve sledování polohy kamery</translation>
 <translation id="3586500876634962664">Využití fotoaparátu a mikrofonu</translation>
 <translation id="358794129225322306">Povolit webu automaticky stáhnout několik souborů.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
index f28d3ac..dca64b4 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_da.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Skjul oplysninger</translation>
 <translation id="3333961966071413176">Alle kontakter</translation>
 <translation id="3386292677130313581">Spørg, om websites må få adgang til din placering (anbefales)</translation>
-<translation id="3479552764303398839">Ikke nu</translation>
 <translation id="3538390592868664640">Bloker oprettelsen af 3D-kort over dine omgivelser eller registrering af kamerapositionen for websites</translation>
 <translation id="3586500876634962664">Brug af kamera og mikrofon</translation>
 <translation id="358794129225322306">Tillad, at et website kan downloade flere filer automatisk.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
index fa564d7..fbf61c75 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Informationen ausblenden</translation>
 <translation id="3333961966071413176">Alle Kontakte</translation>
 <translation id="3386292677130313581">Nachfragen, bevor Websites mein Standort angezeigt wird (empfohlen)</translation>
-<translation id="3479552764303398839">Jetzt nicht</translation>
 <translation id="3538390592868664640">Websites daran hindern, eine 3D-Karte meiner Umgebung zu erstellen oder die Kameraposition zu verfolgen</translation>
 <translation id="3586500876634962664">Kamera- und Mikrofonnutzung</translation>
 <translation id="358794129225322306">Einer Website erlauben, automatisch mehrere Dateien herunterzuladen.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
index 2094fc1..9134844 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Απόκρυψη πληροφοριών</translation>
 <translation id="3333961966071413176">Όλες οι επαφές</translation>
 <translation id="3386292677130313581">Να γίνεται ερώτηση προτού επιτραπεί η κοινοποίηση της τοποθεσίας σας σε ιστότοπους (συνιστάται)</translation>
-<translation id="3479552764303398839">Όχι τώρα</translation>
 <translation id="3538390592868664640">Αποκλείστε ιστοτόπους από τη δημιουργία ενός τρισδιάστατου χάρτη του περιβάλλοντα χώρου σας ή την παρακολούθηση της θέσης της κάμερας.</translation>
 <translation id="3586500876634962664">Χρήση κάμερας και μικροφώνου</translation>
 <translation id="358794129225322306">Να επιτρέπεται σε έναν ιστότοπο να κατεβάζει αυτόματα πολλά αρχεία.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
index e2b115d..031e7acd 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Hide info</translation>
 <translation id="3333961966071413176">All contacts</translation>
 <translation id="3386292677130313581">Ask before allowing sites to know your location (recommended)</translation>
-<translation id="3479552764303398839">Not now</translation>
 <translation id="3538390592868664640">Block sites from creating a 3D map of your surroundings or tracking camera position</translation>
 <translation id="3586500876634962664">Camera and microphone use</translation>
 <translation id="358794129225322306">Allow a site to download multiple files automatically.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
index 8816b0e..44d3cbd 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ocultar información</translation>
 <translation id="3333961966071413176">Todos los contactos</translation>
 <translation id="3386292677130313581">Preguntar antes de permitir que los sitios conozcan tu ubicación (recomendado)</translation>
-<translation id="3479552764303398839">Ahora no</translation>
 <translation id="3538390592868664640">No permitir que los sitios creen un mapa 3D de tu entorno ni hagan un seguimiento de la posición de la cámara</translation>
 <translation id="3586500876634962664">Uso de la cámara y el micrófono</translation>
 <translation id="358794129225322306">Permite que un sitio descargue varios archivos automáticamente.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
index 05dfd5d..6218abd 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ocultar información</translation>
 <translation id="3333961966071413176">Todos los contactos</translation>
 <translation id="3386292677130313581">Preguntar antes de permitir que los sitios web detecten tu ubicación (recomendado)</translation>
-<translation id="3479552764303398839">Ahora no</translation>
 <translation id="3538390592868664640">Impide que los sitios web creen un mapa 3D de tu entorno o hagan un seguimiento de la posición de la cámara</translation>
 <translation id="3586500876634962664">Uso de cámara y micrófono</translation>
 <translation id="358794129225322306">Permitir que un sitio web descargue varios archivos automáticamente.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
index acb7a38..34292973 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Peida teave</translation>
 <translation id="3333961966071413176">Kõik kontaktid</translation>
 <translation id="3386292677130313581">Küsi enne saitidele minu asukoha avaldamist (soovitatav)</translation>
-<translation id="3479552764303398839">Mitte praegu</translation>
 <translation id="3538390592868664640">Saitide jaoks blokeeritakse teid ümbritsevast 3D-kaardi loomine või kaamera asendi jälgimine</translation>
 <translation id="3586500876634962664">Kaamera ja mikrofoni kasutamine</translation>
 <translation id="358794129225322306">Lubab saidil automaatselt mitut faili alla laadida.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
index 28db5a9..1c5d3b4 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ezkutatu informazioa</translation>
 <translation id="3333961966071413176">Kontaktu guztiak</translation>
 <translation id="3386292677130313581">Webguneei zure kokapena erakusteko baimena eman aurretik, eskatu onespena (gomendatua)</translation>
-<translation id="3479552764303398839">Orain ez</translation>
 <translation id="3538390592868664640">Ez utzi inongo webguneri inguruaren 3D-ko mapa bat sortzen edo kameraren posizioaren jarraipena egiten</translation>
 <translation id="3586500876634962664">Kamera- eta mikrofono-erabilera</translation>
 <translation id="358794129225322306">Eman hainbat fitxategi automatikoki deskargatzeko baimena webgune bati.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
index 14aca10..636701a 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">پنهان کردن اطلاعات</translation>
 <translation id="3333961966071413176">همه مخاطبین</translation>
 <translation id="3386292677130313581">قبل از اجازه به سایت‌ها برای اطلاع از مکانتان، ابتدا سؤال شود (توصیه می‌شود)</translation>
-<translation id="3479552764303398839">اکنون نه</translation>
 <translation id="3538390592868664640">قابلیت سایت‌ها برای ایجاد نقشه سه‌بعدی از محیط یا ردیابی موقعیت دوربین مسدود می‌شود</translation>
 <translation id="3586500876634962664">استفاده از دوربین و میکروفون</translation>
 <translation id="358794129225322306">به سایت اجازه داده شود چند فایل را به‌طور خودکار بارگیری کند.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
index e50b161..3e48294 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Piilota tiedot</translation>
 <translation id="3333961966071413176">Kaikki yhteystiedot</translation>
 <translation id="3386292677130313581">Pyydä lupaa, kun sivustot yrittävät käyttää sijaintiasi (suositus).</translation>
-<translation id="3479552764303398839">Ei nyt</translation>
 <translation id="3538390592868664640">Estä sivustoja luomasta 3D-karttaa ympäristöstäsi tai seuraamasta kameran asentoa</translation>
 <translation id="3586500876634962664">Kameran ja mikrofonin käyttö</translation>
 <translation id="358794129225322306">Anna sivuston ladata useita tiedostoja automaattisesti.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
index 309186e1..78535ce 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fil.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Itago ang Impormasyon</translation>
 <translation id="3333961966071413176">Lahat ng contact</translation>
 <translation id="3386292677130313581">Magtanong bago payagan ang mga site na malaman ang iyong lokasyon (inirerekomenda)</translation>
-<translation id="3479552764303398839">Hindi ngayon</translation>
 <translation id="3538390592868664640">I-block ang mga site sa paggawa ng 3D na mapa ng iyong kapaligiran o pagsubaybay sa posisyon ng camera</translation>
 <translation id="3586500876634962664">Paggamit ng camera at mikropono</translation>
 <translation id="358794129225322306">Payagan ang isang site na awtomatikong mag-download ng maraming file.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
index 9e54d9c3..f4bcc14 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Masquer les renseignements</translation>
 <translation id="3333961966071413176">Tous les contacts</translation>
 <translation id="3386292677130313581">Demander avant d'autoriser des sites à connaître votre emplacement (recommandé)</translation>
-<translation id="3479552764303398839">Pas maintenant</translation>
 <translation id="3538390592868664640">Empêcher les sites de créer une carte 3D de votre environnement et de faire le suivi de la position de l'appareil photo</translation>
 <translation id="3586500876634962664">Util. de la caméra et du micro</translation>
 <translation id="358794129225322306">Permet au site de télécharger plusieurs fichiers automatiquement.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
index c9365db..d108213 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Masquer les informations</translation>
 <translation id="3333961966071413176">Tous les contacts</translation>
 <translation id="3386292677130313581">Demander avant d'autoriser des sites à accéder à ma position (recommandé)</translation>
-<translation id="3479552764303398839">Pas maintenant</translation>
 <translation id="3538390592868664640">Empêcher les sites de créer un plan 3D de votre environnement ou de suivre la position de la caméra</translation>
 <translation id="3586500876634962664">Utilisation de la caméra et du micro</translation>
 <translation id="358794129225322306">Autoriser un site à télécharger automatiquement plusieurs fichiers</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
index d7b91a2..fe7962a 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ocultar información</translation>
 <translation id="3333961966071413176">Todos os contactos</translation>
 <translation id="3386292677130313581">Pregunta antes de permitir que os sitios coñezan a túa localización (recomendado)</translation>
-<translation id="3479552764303398839">Agora non</translation>
 <translation id="3538390592868664640">Impide que os sitios creen un mapa 3D do que te rodea e fagan un seguimento da posición da cámara</translation>
 <translation id="3586500876634962664">Uso da cámara e do micrófono</translation>
 <translation id="358794129225322306">Permite que un sitio descargue varios ficheiros automaticamente.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
index e42c073a..f4d15bd 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">માહિતી છુપાવો</translation>
 <translation id="3333961966071413176">બધા સંપર્કો</translation>
 <translation id="3386292677130313581">સાઇટ્સને તમારા સ્થાનને જાણવાની મંજૂરી આપતાં પહેલાં પૂછો (ભલામણ કરેલ)</translation>
-<translation id="3479552764303398839">હમણાં નહીં</translation>
 <translation id="3538390592868664640">કોઈ સાઇટને તમારી આજુબાજુનો 3D નકશો બનાવવા અથવા કૅમેરાની સ્થિતિને ટ્રૅક કરી શકવા માટે બ્લૉક કરો</translation>
 <translation id="3586500876634962664">કૅમેરા અને માઇક્રોફોનનો ઉપયોગ</translation>
 <translation id="358794129225322306">એકથી વધુ ફાઇલો ઑટોમૅટિક રીતે ડાઉનલોડ કરવાની મંજૂરી સાઇટને આપો.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
index 1ed2cab..6bbed993 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">जानकारी छिपाएं</translation>
 <translation id="3333961966071413176">सभी संपर्क</translation>
 <translation id="3386292677130313581">साइटों को अपनी जगह की जानकारी देने से पहले अनुमति लेना ज़रूरी बनाएं (सुझाया गया)</translation>
-<translation id="3479552764303398839">अभी नहीं</translation>
 <translation id="3538390592868664640">साइटों को अपने आस-पास की जगह का 3D मैप बनाने या कैमरे की स्थिति ट्रैक करने से रोकें</translation>
 <translation id="3586500876634962664">कैमरा और माइक्रोफ़ोन का इस्तेमाल</translation>
 <translation id="358794129225322306">किसी साइट को अपने आप एक से ज़्यादा फ़ाइलें लोड करने की मंज़ूरी दें.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
index d51987b..37bca65 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hr.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Sakrij informacije</translation>
 <translation id="3333961966071413176">Svi kontakti</translation>
 <translation id="3386292677130313581">Web-lokacije moraju tražiti dopuštenje za pristup lokaciji (preporučeno)</translation>
-<translation id="3479552764303398839">Ne sada</translation>
 <translation id="3538390592868664640">Blokirajte web-lokacije da izrađuju 3D kartu vašeg okruženja ili prate položaj kamere</translation>
 <translation id="3586500876634962664">Upotreba kamere i mikrofona</translation>
 <translation id="358794129225322306">Dopusti web-lokaciji automatsko preuzimanje više datoteka.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
index 07ad295..9ae3e1e 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Információk elrejtése…</translation>
 <translation id="3333961966071413176">Összes névjegy</translation>
 <translation id="3386292677130313581">Kérdezzen rá, mielőtt engedélyezné a webhelyek számára a tartózkodási helyhez való hozzáférést (ajánlott)</translation>
-<translation id="3479552764303398839">Ne most</translation>
 <translation id="3538390592868664640">Az Ön környezetéről készített 3D-s térkép létrehozásának, valamint a kamerapozíció követésének letiltása a webhelyek számára</translation>
 <translation id="3586500876634962664">Kamera- és mikrofonhasználat</translation>
 <translation id="358794129225322306">Engedély webhelynek több fájl automatikus letöltésére.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
index 93391991..cdc5f571 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Թաքցնել տեղեկությունները</translation>
 <translation id="3333961966071413176">Բոլոր կոնտակտները</translation>
 <translation id="3386292677130313581">Հարցնել՝ նախքան ձեր տեղադրությունը կայքերին հասանելի դարձնելը (խորհուրդ է տրվում)</translation>
-<translation id="3479552764303398839">Հիմա չէ</translation>
 <translation id="3538390592868664640">Արգելել կայքերին ստեղծել շրջակայքի եռաչափ քարտեզը և հետագծել տեսախցիկի դիրքը</translation>
 <translation id="3586500876634962664">Տեսախցիկի և խոսափողի օգտագործում</translation>
 <translation id="358794129225322306">Թույլ տալ կայքին ավտոմատ ներբեռնել մեկից ավել ֆայլեր։</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
index ae267c3..7756710275 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Sembunyikan Info</translation>
 <translation id="3333961966071413176">Semua kontak</translation>
 <translation id="3386292677130313581">Minta izin sebelum memungkinkan situs mengetahui lokasi Anda (disarankan)</translation>
-<translation id="3479552764303398839">Jangan sekarang</translation>
 <translation id="3538390592868664640">Blokir situs agar tidak membuat peta 3D untuk area di sekeliling Anda atau melacak posisi kamera</translation>
 <translation id="3586500876634962664">Kamera dan mikrofon aktif</translation>
 <translation id="358794129225322306">Izinkan situs untuk otomatis mendownload beberapa file.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
index a309949..c5728b2 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Fela upplýsingar</translation>
 <translation id="3333961966071413176">Allir tengiliðir</translation>
 <translation id="3386292677130313581">Spyrja áður en vefsvæðum er veitt heimild til að sjá staðsetningu þína (ráðlagt)</translation>
-<translation id="3479552764303398839">Ekki núna</translation>
 <translation id="3538390592868664640">Komdu í veg fyrir að vefsvæði búi til þrívíddarkort af umhverfinu eða reki staðsetningu myndavélarinnar</translation>
 <translation id="3586500876634962664">Notkun myndavélar og hljóðnema</translation>
 <translation id="358794129225322306">Leyfa vefsvæði að sækja margar skrár sjálfkrafa.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
index 12ddb7f..e4142fe 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Nascondi informazioni</translation>
 <translation id="3333961966071413176">Tutti i contatti</translation>
 <translation id="3386292677130313581">Chiedi conferma prima di consentire ai siti di conoscere la tua posizione (opzione consigliata)</translation>
-<translation id="3479552764303398839">Non adesso</translation>
 <translation id="3538390592868664640">Impedisci ai siti di creare una mappa 3D dell'ambiente circostante o di monitorare la posizione della fotocamera</translation>
 <translation id="3586500876634962664">Uso di videocamera e microfono</translation>
 <translation id="358794129225322306">Consenti a un sito di scaricare automaticamente più file.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
index 7e172921..6ba6eb2ed 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">הסתר פרטים</translation>
 <translation id="3333961966071413176">כל אנשי הקשר</translation>
 <translation id="3386292677130313581">יש לשאול לפני שמאפשרים לאתרים לדעת מה המיקום שלך (מומלץ)</translation>
-<translation id="3479552764303398839">לא עכשיו</translation>
 <translation id="3538390592868664640">חסימה של יצירת מפה בתלת ממד של הסביבה שלך או של מעקב אחר מיקום המצלמה על ידי אתרים.</translation>
 <translation id="3586500876634962664">שימוש במצלמה ובמיקרופון</translation>
 <translation id="358794129225322306">מתן הרשאה לאתר להוריד קבצים מרובים באופן אוטומטי.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
index fd27346..d62366b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">情報を表示しない</translation>
 <translation id="3333961966071413176">すべての連絡先</translation>
 <translation id="3386292677130313581">サイトに現在地の認識を許可する前に確認する(推奨)</translation>
-<translation id="3479552764303398839">後で</translation>
 <translation id="3538390592868664640">サイトによる周囲の 3D マップの作成またはカメラ位置の追跡をブロックします</translation>
 <translation id="3586500876634962664">カメラとマイクの使用</translation>
 <translation id="358794129225322306">複数ファイルの自動ダウンロードをサイトに許可します。</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
index 5e48181e..448eb3b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ka.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">ინფორმაციის დამალვა</translation>
 <translation id="3333961966071413176">ყველა კონტაქტი</translation>
 <translation id="3386292677130313581">შეკითხვა საიტებისთვის თქვენი მდებარეობის დადგენის დაშვებამდე (რეკომენდებული)</translation>
-<translation id="3479552764303398839">ახლა არა</translation>
 <translation id="3538390592868664640">საიტებისთვის თქვენი გარემოს 3-განზომილებიანი რუკის შექმნის ან კამერის პოზიციისთვის თვალის მიდევნების დაბლოკვა</translation>
 <translation id="3586500876634962664">კამერის/მიკროფონის გამოყენება</translation>
 <translation id="358794129225322306">საიტისთვის რამდენიმე ფაილის ავტომატურად ჩამოტვირთვის დაშვება.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
index 363d76a0..1b783ec0 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ақпаратты жасыру</translation>
 <translation id="3333961966071413176">Барлық контакт</translation>
 <translation id="3386292677130313581">Сайттар орналасқан орныңызды анықтау үшін рұқсат сұрайды (ұсынылады)</translation>
-<translation id="3479552764303398839">Қазір емес</translation>
 <translation id="3538390592868664640">Сайттарға айналаңыздың 3D картасын жасауға немесе камера орнын бақылауға тыйым салу</translation>
 <translation id="3586500876634962664">Камера мен микрофонды пайдалану</translation>
 <translation id="358794129225322306">Сайтқа бірнеше файлды автоматты түрде жүктеу рұқсатын беру.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
index 466167e..6d63e30 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">លាក់ព័ត៌មាន</translation>
 <translation id="3333961966071413176">ទំនាក់​ទំនង​ទាំងអស់</translation>
 <translation id="3386292677130313581">សួរមុនពេលអនុញ្ញាតឲ្យគេហទំព័រស្គាល់ទីតាំងរបស់អ្នក (បានណែនាំ)</translation>
-<translation id="3479552764303398839">មិនមែនឥឡូវនេះទេ</translation>
 <translation id="3538390592868664640">ទប់ស្កាត់គេហទំព័រមិនឱ្យបង្កើតផែនទី 3D នៃមជ្ឈដ្ឋានជុំវិញរបស់អ្នក ឬតាមដានទីតាំងកាមេរ៉ា</translation>
 <translation id="3586500876634962664">ការប្រើមីក្រូហ្វូន និងកាមេរ៉ា</translation>
 <translation id="358794129225322306">អនុញ្ញាតឱ្យ​គេហទំព័រទាញយក​ឯកសារជាច្រើន​ដោយស្វ័យប្រវត្តិ។</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
index 263c0ae..9436057 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">ಮಾಹಿತಿಯನ್ನು ಮರೆಮಾಡಿ</translation>
 <translation id="3333961966071413176">ಎಲ್ಲಾ ಸಂಪರ್ಕಗಳು</translation>
 <translation id="3386292677130313581">ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ತಿಳಿಯಲು ಸೈಟ್‌ಗಳಿಗೆ ಅನುಮತಿಸುವ ಮೊದಲು ಕೇಳಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation>
-<translation id="3479552764303398839">ಈಗ ಬೇಡ</translation>
 <translation id="3538390592868664640">ನಿಮ್ಮ ಸುತ್ತಮುತ್ತಲಿನ 3D ನಕ್ಷೆಗಳನ್ನು ರಚಿಸುವುದರಿಂದ ಅಥವಾ ಕ್ಯಾಮರಾ ಸ್ಥಿತಿಯನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡುವುದರಿಂದ ಸೈಟ್‌ಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation>
 <translation id="3586500876634962664">ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೋಫೋನ್ ಬಳಕೆ</translation>
 <translation id="358794129225322306">ಬಹು ಫೈಲ್‌ಗಳನ್ನು ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಡೌನ್‌ಲೋಡ್‌ ಮಾಡಲು ಸೈಟ್‌ ಒಂದಕ್ಕೆ ಅನುಮತಿಸುವುದು.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
index 30be523..1c0a56bc 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">정보 숨기기</translation>
 <translation id="3333961966071413176">모든 연락처</translation>
 <translation id="3386292677130313581">사이트에서 내 위치를 파악하도록 허용하기 전에 확인(권장)</translation>
-<translation id="3479552764303398839">나중에</translation>
 <translation id="3538390592868664640">사이트에서 주변 환경의 3D 지도를 생성하거나 카메라 위치를 추적하지 못하도록 차단</translation>
 <translation id="3586500876634962664">카메라 및 마이크 사용</translation>
 <translation id="358794129225322306">사이트에서 여러 파일을 자동으로 다운로드하도록 허용합니다.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
index 9358422..c1e9263 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Маалыматты жашыруу</translation>
 <translation id="3333961966071413176">Бардык байланыштар</translation>
 <translation id="3386292677130313581">Сайттарга жайгашкан жериңиз тууралуу маалымат берүүдөн мурун уруксат суралсын (сунушталат)</translation>
-<translation id="3479552764303398839">Азыр эмес</translation>
 <translation id="3538390592868664640">Сайттарга айланаңыздын 3D картасын түзүүгө же камераңыздын абалына көз салууга бөгөт коюуңуз</translation>
 <translation id="3586500876634962664">Камера менен микрофонду колдонуу</translation>
 <translation id="358794129225322306">Сайтка бир нече файлды автоматтык түрдө жүктөп алууга уруксат берүү.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
index 72387de..ed5448ee 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">ເຊື່ອງຂໍ້ມູນ</translation>
 <translation id="3333961966071413176">ລາຍຊື່ຜູ້ຕິດຕໍ່ທັງໝົດ</translation>
 <translation id="3386292677130313581">ຖາມກ່ອນທີ່ຈະອະນຸຍາດໃຫ້ເວັບໄຊຮູ້ສະຖານທີ່ຂອງທ່ານ (ແນະນຳ)</translation>
-<translation id="3479552764303398839">ບໍ່ແມ່ນດຽວນີ້</translation>
 <translation id="3538390592868664640">ບລັອກເວັບໄຊບໍ່ໃຫ້ສ້າງແຜນທີ່ 3 ມິຕິຂອງສິ່ງທີ່ຢູ່ອ້ອມຂ້າງຕົວທ່ານ ຫຼື ຕິດຕາມຕຳແໜ່ງກ້ອງ</translation>
 <translation id="3586500876634962664">ການນຳໃຊ້ກ້ອງ ແລະ ໄມໂຄຣໂຟນ</translation>
 <translation id="358794129225322306">ອະນຸຍາດໃຫ້ເວັບໄຊດາວໂຫຼດຫຼາຍໄຟລ໌ໂດຍອັດຕະໂນມັດ.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
index 0e67f648..3f02cab 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Slėpti informaciją</translation>
 <translation id="3333961966071413176">Visi kontaktai</translation>
 <translation id="3386292677130313581">Klausti prieš leidžiant svetainėms žinoti vietą (rekomenduojama)</translation>
-<translation id="3479552764303398839">Ne dabar</translation>
 <translation id="3538390592868664640">Blokuoti, kad svetainės nekurtų jūsų aplinkos 3D žemėlapio ir nestebėtų kameros padėties</translation>
 <translation id="3586500876634962664">Kameros ir mikrofono naudojimas</translation>
 <translation id="358794129225322306">Leisti svetainei automatiškai atsisiųsti kelis failus.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
index b818fad..cd8c982e 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Slēpt informāciju</translation>
 <translation id="3333961966071413176">Visas kontaktpersonas</translation>
 <translation id="3386292677130313581">Jautāt, pirms atļaut vietnēm uzzināt jūsu atrašanās vietu (ieteicams)</translation>
-<translation id="3479552764303398839">Vēlāk</translation>
 <translation id="3538390592868664640">Neļaut vietnēm izveidot jūsu apkārtnes 3D karti vai izsekot kameras pozīciju</translation>
 <translation id="3586500876634962664">Kameras un mikrofona izmantošana</translation>
 <translation id="358794129225322306">Atļaut vietnei automātiski lejupielādēt vairākus failus.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
index 9e5ba44..1c33ca60 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Сокриј ги информациите</translation>
 <translation id="3333961966071413176">Сите контакти</translation>
 <translation id="3386292677130313581">Прашај пред да дозволиш сајтовите да ја дознаат локацијата (се препорачува)</translation>
-<translation id="3479552764303398839">Не сега</translation>
 <translation id="3538390592868664640">Не дозволувај им на сајтовите да создаваат 3D-карта на опкружувањето или да ја следат позицијата на камерата</translation>
 <translation id="3586500876634962664">Користење камера и микрофон</translation>
 <translation id="358794129225322306">Дозволете сајтот автоматски да презема повеќе датотеки.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
index 4f1dbc6..1920e2c5 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">വിവരങ്ങൾ മറയ്‌ക്കുക</translation>
 <translation id="3333961966071413176">എല്ലാ കോൺടാക്റ്റുകളും</translation>
 <translation id="3386292677130313581">നിങ്ങളുടെ ലൊക്കേഷൻ അറിയാൻ സൈറ്റുകളെ അനുവദിക്കുന്നതിന് മുമ്പ് ചോദിക്കുക (ശുപാർശചെയ്‌തിരിക്കുന്നു)</translation>
-<translation id="3479552764303398839">ഇപ്പോഴല്ല</translation>
 <translation id="3538390592868664640">നിങ്ങളുടെ ചുറ്റുപാടുകളുടെ 3D മാപ്പ് സൃഷ്ടിക്കുന്നതിൽ നിന്നോ ക്യാമറയുടെ സ്ഥാനം ട്രാക്ക് ചെയ്യുന്നതിൽ നിന്നോ സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുക</translation>
 <translation id="3586500876634962664">ക്യാമറ, മൈക്രോഫോൺ ഉപയോഗം</translation>
 <translation id="358794129225322306">ഒന്നിലേറെ ഫയലുകള്‍ സ്വമേധയാ ഡൗണ്‍‌ലോഡ് ചെയ്യാന്‍ സൈറ്റിനെ അനുവദിക്കുക.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
index 014eb14..dd2e1be 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mn.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Мэдээллийг нуух</translation>
 <translation id="3333961966071413176">Бүх харилцагч</translation>
 <translation id="3386292677130313581">Сайтууд байршил мэдэх зөвшөөрөл авах (санал болгосон)</translation>
-<translation id="3479552764303398839">Одоо биш</translation>
 <translation id="3538390592868664640">Сайтуудад таны эргэн тойрны 3D газрын зургийг үүсгэх эсвэл камерын хөдөлгөөнийг хянахыг хориглох</translation>
 <translation id="3586500876634962664">Камер болон микрофоны ашиглалт</translation>
 <translation id="358794129225322306">Сайтад олон файлыг автоматаар татахыг зөвшөөрнө үү.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
index 9c7b3de..80d26c3 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">माहिती लपवा</translation>
 <translation id="3333961966071413176">सर्व संपर्क</translation>
 <translation id="3386292677130313581">साइटना तुमचे स्थान जाणून घेण्याची अनुमती देण्यापूर्वी विचारा (शिफारस केलेले)</translation>
-<translation id="3479552764303398839">सध्या नाही</translation>
 <translation id="3538390592868664640">तुमच्या आसपासच्या परिसराचा 3D नकाशा तयार करण्यापासून किंवा कॅमेर्‍याचे स्थान ट्रॅक करण्यापासून साइट ब्लॉक करा</translation>
 <translation id="3586500876634962664">कॅमेरा आणि मायक्रोफोन वापरा</translation>
 <translation id="358794129225322306">साइटला एकाहून अधिक फाइल आपोआप डाउनलोड करू द्या.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
index ef194d0..3cfb64fb 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Sembunyikan Maklumat</translation>
 <translation id="3333961966071413176">Semua kenalan</translation>
 <translation id="3386292677130313581">Tanya sebelum membenarkan tapak mengetahui lokasi anda (disyorkan)</translation>
-<translation id="3479552764303398839">Bukan sekarang</translation>
 <translation id="3538390592868664640">Sekat tapak daripada membuat peta 3D bagi persekitaran anda atau menjejaki kedudukan kamera</translation>
 <translation id="3586500876634962664">Penggunaan kamera dan mikrofon</translation>
 <translation id="358794129225322306">Benarkan tapak memuat turun berbilang fail secara automatik.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
index 4915ddf..42e4121 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_my.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">အချက်အလက်များကို ဖျောက်ထားရန်</translation>
 <translation id="3333961966071413176">အဆက်အသွယ်အားလုံး</translation>
 <translation id="3386292677130313581">သင့်တည်နေရာကို ဆိုက်များအား အသိမပေးမီ မေးပါ (အကြံပြုထားသည်)</translation>
-<translation id="3479552764303398839">ယခု မလို</translation>
 <translation id="3538390592868664640">သင့်ပတ်ဝန်းကျင်၏ 3D မြေပုံဆွဲခြင်း သို့မဟုတ် ကင်မရာအနေအထား ခြေရာခံခြင်းတို့ မပြုလုပ်ရန် ဝဘ်ဆိုက်များကို ပိတ်ထားသည်</translation>
 <translation id="3586500876634962664">ကင်မရာနှင့် မိုက် အသုံးပြုသည်</translation>
 <translation id="358794129225322306">ဝဘ်ဆိုက်အား ဖိုင်အမြောက်အမြား အလိုအလျောက်ဒေါင်းလုဒ်လုပ်ခြင်းကို ခွင့်ပြုသည်</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
index 74a5873..a0f19f7 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">जानकारी लुकाउनुहोस्</translation>
 <translation id="3333961966071413176">सबै सम्पर्कहरू</translation>
 <translation id="3386292677130313581">साइटहरूलाई तपाईँको स्थान थाहा पाउने अनुमति दिनु भन्दा पहिले तपाईँलाई सोध्ने (सिफारिस गरिएको)</translation>
-<translation id="3479552764303398839">अहिले होइन</translation>
 <translation id="3538390592868664640">साइटहरूलाई आफू वरपरको ठाउँको 3D नक्सा बनाउन वा क्यामेराको अवस्था पत्ता लगाउन नदिनुहोस्</translation>
 <translation id="3586500876634962664">क्यामेरा र माइक्रोफोनको प्रयोग</translation>
 <translation id="358794129225322306">साइटलाई एकभन्दा बढी फाइलहरू स्वतः डाउनलोड गर्ने अनुमति दिनुहोस्।</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
index e43be951..b078811 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Informatie verbergen</translation>
 <translation id="3333961966071413176">Alle contacten</translation>
 <translation id="3386292677130313581">Vragen of je sites toegang wilt verlenen tot je locatie (aanbevolen)</translation>
-<translation id="3479552764303398839">Niet nu</translation>
 <translation id="3538390592868664640">Voorkomen dat sites een 3D-kaart van je omgeving maken of de camerapositie volgen</translation>
 <translation id="3586500876634962664">Camera- en microfoongebruik</translation>
 <translation id="358794129225322306">Een site toestaan automatisch meerdere bestanden te downloaden.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
index b3b7bf7..46663be 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Skjul informasjonen</translation>
 <translation id="3333961966071413176">Alle kontakter</translation>
 <translation id="3386292677130313581">Spør før nettsteder får vite posisjonen min (anbefales)</translation>
-<translation id="3479552764303398839">Ikke nå</translation>
 <translation id="3538390592868664640">Blokkér nettsteder fra å lage 3D-kart av omgivelsene dine eller spore kameraposisjonen</translation>
 <translation id="3586500876634962664">Kamera- og mikrofonbruk</translation>
 <translation id="358794129225322306">Tillat at et nettsted kan laste ned flere filer automatisk.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
index 5e777d9..936d1c5 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">ସୂଚନା ଲୁଚାନ୍ତୁ</translation>
 <translation id="3333961966071413176">ସମସ୍ତ ଯୋଗାଯୋଗଗୁଡ଼ିକ</translation>
 <translation id="3386292677130313581">ସାଇଟ୍‍ଗୁଡ଼ିକ ଆପଣଙ୍କର ଲୋକେସନ୍‌ ଜାଣିବା ପୂର୍ବରୁ ପଚାରନ୍ତୁ (ସୁପାରିଶ୍‌ କରାଯାଇଛି)</translation>
-<translation id="3479552764303398839">ଏବେ ନୁହେଁ</translation>
 <translation id="3538390592868664640">ଆପଣଙ୍କ ପରିପାର୍ଶ୍ୱର ଏକ 3D ମ୍ୟାପ୍ ତିଆରି କରିବା ଏବଂ କ୍ୟାମେରା ସ୍ଥିତି ଟ୍ରାକ୍ କରିବାକୁ ସାଇଟଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation>
 <translation id="3586500876634962664">କ୍ୟାମେରା ଏବଂ ମାଇକ୍ରୋଫୋନର ବ୍ୟବହାର</translation>
 <translation id="358794129225322306">ସ୍ୱଚାଳିତ ଭାବେ ଏକାଧିକ ଫାଇଲ୍ ଡାଉନ୍‌ଲୋଡ୍ କରିବା ପାଇଁ ଗୋଟିଏ ସାଇଟ୍‌କୁ ଅନୁମତି ଦିଅନ୍ତୁ।</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
index c1186b9..366dad7f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">ਜਾਣਕਾਰੀ ਲੁਕਾਓ</translation>
 <translation id="3333961966071413176">ਸਭ ਸੰਪਰਕ</translation>
 <translation id="3386292677130313581">ਸਾਈਟਾਂ ਨੂੰ ਤੁਹਾਡਾ ਟਿਕਾਣਾ ਜਾਣਨ ਤੋਂ ਪਹਿਲਾਂ ਤੁਹਾਡੀ ਇਜਾਜ਼ਤ ਲੈਣ ਨੂੰ ਜ਼ਰੂਰੀ ਬਣਾਓ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation>
-<translation id="3479552764303398839">ਹੁਣ ਨਹੀਂ</translation>
 <translation id="3538390592868664640">ਸਾਈਟਾਂ ਨੂੰ ਤੁਹਾਡੇ ਆਲੇ-ਦੁਆਲੇ ਦਾ 3D ਨਕਸ਼ਾ ਬਣਾਉਣ ਜਾਂ ਕੈਮਰਾ ਸਥਿਤੀ ਨੂੰ ਟਰੈਕ ਕਰਨ ਤੋਂ ਬਲਾਕ ਕਰੋ</translation>
 <translation id="3586500876634962664">ਕੈਮਰੇ ਅਤੇ ਮਾਈਕ੍ਰੋਫ਼ੋਨ ਦੀ ਵਰਤੋਂ</translation>
 <translation id="358794129225322306">ਕਿਸੇ ਸਾਈਟ ਨੂੰ ਇੱਕ ਤੋਂ ਜ਼ਿਆਦਾ ਫ਼ਾਈਲਾਂ ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਡਾਊਨਲੋਡ ਕਰਨ ਦਿਓ।</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
index fb9f9a8..0f797b57 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ukryj informacje</translation>
 <translation id="3333961966071413176">Wszystkie kontakty</translation>
 <translation id="3386292677130313581">Pytaj, zanim udostępnisz stronom swoją lokalizację (zalecane)</translation>
-<translation id="3479552764303398839">Nie teraz</translation>
 <translation id="3538390592868664640">Nie zezwalaj stronom na tworzenie mapy 3D Twojego otoczenia ani na śledzenie pozycji kamery</translation>
 <translation id="3586500876634962664">Korzystanie z kamery i mikrofonu</translation>
 <translation id="358794129225322306">Zezwól stronie na automatyczne pobieranie wielu plików.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
index 3c157fa..1ffc4483 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ocultar informações</translation>
 <translation id="3333961966071413176">Todos os contatos</translation>
 <translation id="3386292677130313581">Perguntar antes de permitir que sites saibam seu local (recomendado)</translation>
-<translation id="3479552764303398839">Não agora</translation>
 <translation id="3538390592868664640">Impedir sites de criar um mapa 3D dos seus arredores ou acompanhar a posição da câmera</translation>
 <translation id="3586500876634962664">Uso de câmera e microfone</translation>
 <translation id="358794129225322306">Permite que um site faça o download de vários arquivos automaticamente.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
index 55e10bf..5b45d0c 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ocultar informações</translation>
 <translation id="3333961966071413176">Todos os contactos</translation>
 <translation id="3386292677130313581">Perguntar antes de permitir que os sites conheçam a sua localização (recomendado)</translation>
-<translation id="3479552764303398839">Agora não</translation>
 <translation id="3538390592868664640">Impeça que os sites criem um mapa 3D do ambiente à sua volta ou monitorizem a posição da câmara</translation>
 <translation id="3586500876634962664">Utilização da câmara e do microfone</translation>
 <translation id="358794129225322306">Permitir que um site transfira vários ficheiros automaticamente.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
index 157a281b..b22f2ba 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ro.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ascunde informațiile</translation>
 <translation id="3333961966071413176">Toată agenda</translation>
 <translation id="3386292677130313581">Întreabă înainte de a permite site-urilor să afle locația (recomandat)</translation>
-<translation id="3479552764303398839">Nu acum</translation>
 <translation id="3538390592868664640">Împiedică site-urile să creeze o hartă 3D a lucrurilor din jur sau să urmărească poziția camerei video</translation>
 <translation id="3586500876634962664">Folosirea camerei și a microfonului</translation>
 <translation id="358794129225322306">Permite unui site să descarce automat mai multe fișiere.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
index e545dee..12ce578d 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Скрыть информацию</translation>
 <translation id="3333961966071413176">Все контакты</translation>
 <translation id="3386292677130313581">Запрашивать разрешение на доступ к данным о местоположении (рекомендуется)</translation>
-<translation id="3479552764303398839">Не сейчас</translation>
 <translation id="3538390592868664640">Запретить сайтам создавать 3D-карту места, в котором вы находитесь, и отслеживать положение камеры</translation>
 <translation id="3586500876634962664">Использование камеры и микрофона</translation>
 <translation id="358794129225322306">Разрешить сайту автоматически скачивать несколько файлов.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
index 68699827..f8c1bb1 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_si.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">තතු සඟවන්න</translation>
 <translation id="3333961966071413176">සියලු සම්බන්ධතා</translation>
 <translation id="3386292677130313581">අඩවි වලට ඔබගේ ස්ථානය දැන ගැනීමට ඉඩ දීමට පෙර විමසන්න (නිර්දේශිතයි)</translation>
-<translation id="3479552764303398839">දැන් නොවේ</translation>
 <translation id="3538390592868664640">වෙබ් අඩවිය ඔබේ වටපිටාවේ ත්‍රිමාන සිතියමක් සෑදීමෙන් හෝ කැමරා ස්ථානය හඹා යෑමෙන් අවහිර කරන්න</translation>
 <translation id="3586500876634962664">කැමරා සහ මයික්‍රොෆෝන භාවිතය</translation>
 <translation id="358794129225322306">වෙබ් අඩවියකට ගොනු කිහිපයක් ස්වයංක්‍රීයව බාගැනීමට ඉඩ දෙන්න.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
index 84940be0..128350d 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Skryť informácie</translation>
 <translation id="3333961966071413176">Všetky kontakty</translation>
 <translation id="3386292677130313581">Pýtať sa, či chcete povoliť webu zisťovať vašu polohu (odporúčané)</translation>
-<translation id="3479552764303398839">Teraz nie</translation>
 <translation id="3538390592868664640">Zabráňte webom vytvárať 3D mapu vášho okolia či sledovať umiestnenie kamier</translation>
 <translation id="3586500876634962664">Používanie kamery a mikrofónu</translation>
 <translation id="358794129225322306">Povoľuje webu automaticky sťahovať viacero súborov súčasne.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
index 3582a9e7..599421f 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Skrij informacije</translation>
 <translation id="3333961966071413176">Vsi stiki</translation>
 <translation id="3386292677130313581">Prikaži poziv, preden se spletnim mestom razkrije vaša lokacija (priporočeno)</translation>
-<translation id="3479552764303398839">Ne zdaj</translation>
 <translation id="3538390592868664640">Preprečevanje, da bi spletna mesta ustvarila 3D-zemljevid vaše okolice ali spremljala položaj kamere</translation>
 <translation id="3586500876634962664">Uporaba kamere in mikrofona</translation>
 <translation id="358794129225322306">Dovoli spletnemu mestu samodejni prenos več datotek.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
index 5fdfd9c..df8a9f9 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Fshih informacionin</translation>
 <translation id="3333961966071413176">Të gjitha kontaktet</translation>
 <translation id="3386292677130313581">Pyet përpara se sajtet të lejohen të dinë vendndodhjen tënde (rekomandohet)</translation>
-<translation id="3479552764303398839">Jo tani</translation>
 <translation id="3538390592868664640">Blloko krijimin nga sajtet të një harte 3D të ambientit tënd rrethues ose gjurmimin prej tyre të pozicionit të kamerës</translation>
 <translation id="3586500876634962664">Përdorimi i kamerës/mikrofonit</translation>
 <translation id="358794129225322306">Lejo një sajt të shkarkojë shumë skedarë automatikisht.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
index bc922883..02359cef 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Sakrij informacije</translation>
 <translation id="3333961966071413176">Svi kontakti</translation>
 <translation id="3386292677130313581">Pitaj pre nego što dozvoliš sajtovima da znaju lokaciju (preporučeno)</translation>
-<translation id="3479552764303398839">Ne sada</translation>
 <translation id="3538390592868664640">Sprečite sajtove da prave 3D mapu okruženja ili da prate položaj kamere</translation>
 <translation id="3586500876634962664">Korišćenje kamere i mikrofona</translation>
 <translation id="358794129225322306">Dozvolite sajtu da automatski preuzima više datoteka.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
index c3f3f8de..194ec14 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Сакриј информације</translation>
 <translation id="3333961966071413176">Сви контакти</translation>
 <translation id="3386292677130313581">Питај пре него што дозволиш сајтовима да знају локацију (препоручено)</translation>
-<translation id="3479552764303398839">Не сада</translation>
 <translation id="3538390592868664640">Спречите сајтове да праве 3D мапу окружења или да прате положај камере</translation>
 <translation id="3586500876634962664">Коришћење камере и микрофона</translation>
 <translation id="358794129225322306">Дозволите сајту да аутоматски преузима више датотека.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
index 9485e47..262eb6d9 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Dölj info</translation>
 <translation id="3333961966071413176">Alla kontakter</translation>
 <translation id="3386292677130313581">Fråga innan webbplatser tillåts att veta var du befinner dig (rekommenderas)</translation>
-<translation id="3479552764303398839">Inte nu</translation>
 <translation id="3538390592868664640">Blockera webbplatser från att skapa en 3D-karta över dina omgivningar eller registrera kamerans position</translation>
 <translation id="3586500876634962664">Kamera- och mikrofonanvändning</translation>
 <translation id="358794129225322306">Tillåt att en webbplats laddar ned flera filer automatiskt.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
index 91a1e78..5881594 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ficha Maelezo</translation>
 <translation id="3333961966071413176">Anwani zote</translation>
 <translation id="3386292677130313581">Uliza kabla ya kuruhusu tovuti zijue mahali ulipo (inapendekezwa)</translation>
-<translation id="3479552764303398839">Si sasa</translation>
 <translation id="3538390592868664640">Zuia tovuti zisibuni ramani ya 3D ya mazingira yako wala kufuatilia mkao wa kamera</translation>
 <translation id="3586500876634962664">Matumizi ya kamera na maikrofoni</translation>
 <translation id="358794129225322306">Ruhusu tovuti ipakue faili nyingi kiotomatiki.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
index 90f1666..2824ec9 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">தகவலை மறை</translation>
 <translation id="3333961966071413176">எல்லாத் தொடர்புகளும்</translation>
 <translation id="3386292677130313581">எனது இருப்பிடத்தை அறிய தளங்களை அனுமதிக்கும் முன் கேள் (பரிந்துரைக்கப்படுகிறது)</translation>
-<translation id="3479552764303398839">இப்பொழுது இல்லை</translation>
 <translation id="3538390592868664640">தளங்கள், என்னைச் சுற்றியுள்ள இடங்களின் 3D மேப்பை உருவாக்குவதையும் கேமரா நிலையை டிராக் செய்வதையும் தடு</translation>
 <translation id="3586500876634962664">கேமரா &amp; மைக்ரோஃபோன் பயன்பாடு</translation>
 <translation id="358794129225322306">பல கோப்புகளைத் தானாகப் பதிவிறக்க தளத்தை அனுமதிக்கும்.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
index 10fd356..1a5818a9 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">సమాచారాన్ని దాచు</translation>
 <translation id="3333961966071413176">మొత్తం పరిచయాలు</translation>
 <translation id="3386292677130313581">మీ స్థానాన్ని సైట్‌లు తెలుసుకునేలా వాటిని అనుమతించే ముందు, మిమ్మల్ని అడుగుతుంది (సిఫార్సు చేయబడింది)</translation>
-<translation id="3479552764303398839">ఇప్పుడు కాదు</translation>
 <translation id="3538390592868664640">మీ పరిసరాల 3D మ్యాప్‌ను సృష్టించకుండా లేదా కెమెరా పొజిషన్‌ను ట్రాక్ చేయకుండా సైట్‌లను బ్లాక్ చేయండి</translation>
 <translation id="3586500876634962664">కెమెరా, మైక్రోఫోన్‌ల ఉపయోగం</translation>
 <translation id="358794129225322306">పలు ఫైల్‌లను ఆటోమేటిక్‌గా డౌన్‌లోడ్ చేయడం కోసం సైట్‌ని అనుమతించండి.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
index aed1879..e6b91b0 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">ซ่อนข้อมูล</translation>
 <translation id="3333961966071413176">รายชื่อติดต่อทั้งหมด</translation>
 <translation id="3386292677130313581">ถามก่อนอนุญาตให้เว็บไซต์ทราบตำแหน่งของคุณ (แนะนำ)</translation>
-<translation id="3479552764303398839">ไม่ใช่ตอนนี้</translation>
 <translation id="3538390592868664640">บล็อกไม่ให้เว็บไซต์สร้างแผนที่ 3 มิติของสิ่งที่อยู่รอบตัวคุณหรือติดตามตำแหน่งของกล้อง</translation>
 <translation id="3586500876634962664">การใช้กล้องและไมโครโฟน</translation>
 <translation id="358794129225322306">อนุญาตให้เว็บไซต์ดาวน์โหลดไฟล์หลายไฟล์โดยอัตโนมัติ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
index c449fde..5a0a05b 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Bilgileri Gizle</translation>
 <translation id="3333961966071413176">Tüm kişiler</translation>
 <translation id="3386292677130313581">Sitelerin, konumunuzu öğrenmesine izin verilmeden önce size sorulsun (önerilir)</translation>
-<translation id="3479552764303398839">Şimdi değil</translation>
 <translation id="3538390592868664640">Sitelerin çevremin 3D haritasını oluşturmasını veya kamera konumunu takip etmesini engelle</translation>
 <translation id="3586500876634962664">Kamera ve mikrofon kullanımı</translation>
 <translation id="358794129225322306">Bir sitenin otomatik olarak birden fazla dosya indirmesine izin verir.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
index d702c76..a599ecff 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Сховати інформацію</translation>
 <translation id="3333961966071413176">Усі контакти</translation>
 <translation id="3386292677130313581">Запитувати, перш ніж дозволити сайтам визначати ваше місцезнаходження (рекомендується)</translation>
-<translation id="3479552764303398839">Не зараз</translation>
 <translation id="3538390592868664640">Заборонити сайтам створювати 3D-карту вашого оточення або відстежувати положення камери</translation>
 <translation id="3586500876634962664">Використання камери й мікрофона</translation>
 <translation id="358794129225322306">Дозволити сайту автоматично завантажувати декілька файлів.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
index c32a23ad..ac612d0 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">معلومات چھپائیں</translation>
 <translation id="3333961966071413176">تمام رابطے</translation>
 <translation id="3386292677130313581">سائٹس کو آپ کا مقام جاننے کی اجازت دینے سے پہلے پوچھیں (تجویز کردہ)</translation>
-<translation id="3479552764303398839">ابھی نہیں</translation>
 <translation id="3538390592868664640">‏سائٹس کو اپنے اطراف کا 3D نقشہ تخلیق یا کیمرے کی پوزیشن ٹریک کرنے سے مسدود کریں</translation>
 <translation id="3586500876634962664">کیمرا اور مائیکروفون کا استعمال</translation>
 <translation id="358794129225322306">سائٹ کو خودکار طور پر متعدد فائلیں ڈاؤن لوڈ کرنے کی اجازت دیں۔</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
index f307acf..e7e87bb 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ma’lumotlarni yashirish</translation>
 <translation id="3333961966071413176">Barcha kontaktlar</translation>
 <translation id="3386292677130313581">Joylashuv ma’lumotini ko‘rishiga ruxsat so‘ralsin (tavsiya etiladi)</translation>
-<translation id="3479552764303398839">Hozir emas</translation>
 <translation id="3538390592868664640">Saytlarni atrofingizning 3D xaritasini yaratish yoki kamera joylashuvini aniqlashdan bloklash</translation>
 <translation id="3586500876634962664">Kamera va mikrofonni ishlatish</translation>
 <translation id="358794129225322306">Saytga birdaniga bir nechta fayl yuklab olishga ruxsat berish.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
index e78db1f..1f4d98db 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Ẩn thông tin</translation>
 <translation id="3333961966071413176">Tất cả người liên hệ</translation>
 <translation id="3386292677130313581">Hỏi trước khi cho phép các trang web biết vị trí của bạn (được đề xuất)</translation>
-<translation id="3479552764303398839">Không phải bây giờ</translation>
 <translation id="3538390592868664640">Chặn không cho trang web tạo bản đồ 3D về các khu vực xung quanh bạn hoặc theo dõi thông tin vị trí của máy ảnh</translation>
 <translation id="3586500876634962664">Đang sử dụng máy ảnh và micrô</translation>
 <translation id="358794129225322306">Cho phép một trang web tự động tải xuống nhiều tệp.</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
index 6851f80..e0ab7fe 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">隐藏信息</translation>
 <translation id="3333961966071413176">所有联系人</translation>
 <translation id="3386292677130313581">网站需要先询问并得到您的许可才能获取您的位置信息(推荐)</translation>
-<translation id="3479552764303398839">以后再说</translation>
 <translation id="3538390592868664640">禁止网站为您的周边环境创建 3D 地图或跟踪摄像头位置</translation>
 <translation id="3586500876634962664">正在使用摄像头和麦克风</translation>
 <translation id="358794129225322306">允许网站自动下载多个文件。</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
index 2dbe770..a8791f5 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">隱藏資料</translation>
 <translation id="3333961966071413176">所有聯絡人</translation>
 <translation id="3386292677130313581">允許網站存取您的位置前先詢問您 (建議)</translation>
-<translation id="3479552764303398839">略過</translation>
 <translation id="3538390592868664640">禁止網站建立您身處環境的 3D 地圖或追蹤攝錄機位置</translation>
 <translation id="3586500876634962664">使用攝錄機和麥克風</translation>
 <translation id="358794129225322306">允許網站自動下載多個檔案。</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
index f36c103c..ae382e7 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">隱藏資訊</translation>
 <translation id="3333961966071413176">所有聯絡人</translation>
 <translation id="3386292677130313581">允許網站存取你的位置資訊前,必須先詢問你 (建議)</translation>
-<translation id="3479552764303398839">現在不要</translation>
 <translation id="3538390592868664640">禁止網站根據你的周遭環境建立 3D 地圖或追蹤攝影機位置</translation>
 <translation id="3586500876634962664">使用攝影機和麥克風</translation>
 <translation id="358794129225322306">允許網站自動下載多個檔案。</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
index b2ed8c3..e35c9568 100644
--- a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
+++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
@@ -84,7 +84,6 @@
 <translation id="3295602654194328831">Fihla ulwazi</translation>
 <translation id="3333961966071413176">Bonke oxhumana nabo</translation>
 <translation id="3386292677130313581">Buza ngaphambi kokuvumela amasayithi ukuthi azi indawo yakho (kunconyiwe)</translation>
-<translation id="3479552764303398839">Hhayi manje</translation>
 <translation id="3538390592868664640">Vimbela amasayithi ekudaleni imephu ye-3D yendawo ekuzungezile noma ukulandelela indawo yekhamera</translation>
 <translation id="3586500876634962664">Ukusetshenziswa kwekhamera nemakrofoni</translation>
 <translation id="358794129225322306">Vumela isayithi lilande amafayela amaningi ngokuzenzakalela.</translation>
diff --git a/components/cast/named_message_port_connector/BUILD.gn b/components/cast/named_message_port_connector/BUILD.gn
new file mode 100644
index 0000000..6db6a65
--- /dev/null
+++ b/components/cast/named_message_port_connector/BUILD.gn
@@ -0,0 +1,33 @@
+# Copyright 2020 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//tools/grit/grit_rule.gni")
+
+source_set("named_message_port_connector") {
+  sources = [
+    "named_message_port_connector.cc",
+    "named_message_port_connector.h",
+  ]
+
+  deps = [
+    "//base",
+    "//components/cast:export",
+  ]
+
+  public_deps = [
+    ":resources",
+    "//third_party/blink/public/common",
+  ]
+}
+
+grit("resources") {
+  source = "named_message_port_connector_resources.grd"
+  outputs = [
+    "grit/named_message_port_connector_resources.h",
+    "named_message_port_connector_resources.pak",
+  ]
+
+  # Allow GRIT to assign IDs using its default set of base IDs.
+  resource_ids = ""
+}
diff --git a/components/cast/named_message_port_connector/DEPS b/components/cast/named_message_port_connector/DEPS
new file mode 100644
index 0000000..018d44d5
--- /dev/null
+++ b/components/cast/named_message_port_connector/DEPS
@@ -0,0 +1,4 @@
+include_rules = [
+  "+third_party/blink/public/common/messaging",
+  "+ui/base/resource",
+]
diff --git a/components/cast/named_message_port_connector/named_message_port_connector.cc b/components/cast/named_message_port_connector/named_message_port_connector.cc
new file mode 100644
index 0000000..3f5c312
--- /dev/null
+++ b/components/cast/named_message_port_connector/named_message_port_connector.cc
@@ -0,0 +1,59 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/cast/named_message_port_connector/named_message_port_connector.h"
+
+#include <string>
+#include <utility>
+
+#include "base/logging.h"
+#include "base/strings/string16.h"
+#include "base/strings/utf_string_conversions.h"
+
+namespace cast_api_bindings {
+
+NamedMessagePortConnector::NamedMessagePortConnector() = default;
+
+NamedMessagePortConnector::~NamedMessagePortConnector() = default;
+
+void NamedMessagePortConnector::RegisterPortHandler(
+    PortConnectedCallback handler) {
+  handler_ = std::move(handler);
+}
+
+// Receives the MessagePort and forwards ports to their corresponding binding
+// handlers.
+bool NamedMessagePortConnector::OnMessage(
+    blink::WebMessagePort::Message message) {
+  if (message.ports.size() != 1) {
+    DLOG(FATAL) << "Only one control port should be provided";
+    return false;
+  }
+
+  // Read the port ID.
+  base::string16 data_utf16 = std::move(message.data);
+  std::string binding_id;
+  if (!base::UTF16ToUTF8(data_utf16.data(), data_utf16.size(), &binding_id))
+    return false;
+
+  return handler_.Run(binding_id, std::move(message.ports[0]));
+}
+
+blink::WebMessagePort::Message NamedMessagePortConnector::GetConnectMessage() {
+  constexpr char kControlPortConnectMessage[] = "cast.master.connect";
+
+  // Pass the control message port into the page as an HTML5 MessageChannel
+  // message.
+  auto port_pair = blink::WebMessagePort::CreatePair();
+
+  control_port_ = std::move(port_pair.first);
+  control_port_.SetReceiver(this, base::ThreadTaskRunnerHandle::Get());
+
+  blink::WebMessagePort::Message connect_message;
+  connect_message.data = base::UTF8ToUTF16(kControlPortConnectMessage);
+  connect_message.ports.push_back(std::move(port_pair.second));
+  return connect_message;
+}
+
+}  // namespace cast_api_bindings
diff --git a/components/cast/named_message_port_connector/named_message_port_connector.h b/components/cast/named_message_port_connector/named_message_port_connector.h
new file mode 100644
index 0000000..6ebe36e
--- /dev/null
+++ b/components/cast/named_message_port_connector/named_message_port_connector.h
@@ -0,0 +1,54 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_CAST_NAMED_MESSAGE_PORT_CONNECTOR_NAMED_MESSAGE_PORT_CONNECTOR_H_
+#define COMPONENTS_CAST_NAMED_MESSAGE_PORT_CONNECTOR_NAMED_MESSAGE_PORT_CONNECTOR_H_
+
+#include "base/callback.h"
+#include "base/strings/string_piece.h"
+#include "third_party/blink/public/common/messaging/web_message_port.h"
+
+namespace cast_api_bindings {
+
+// Injects an API into |frame| through which it can connect MessagePorts to one
+// or more services registered by the caller.
+// Platform specific details, such as how the script resources are injected, and
+// how the connection message is posted to the page, are delegated to the
+// caller.
+// TODO(crbug.com/1126571): Migrate off Blink::WebMessagePort to a
+// platform-agnostic MessagePort abstraction.
+class NamedMessagePortConnector
+    : public blink::WebMessagePort::MessageReceiver {
+ public:
+  // Signature of callback to be invoked when a port is connected.
+  // The callback should return true if the connection request was valid.
+  using PortConnectedCallback =
+      base::RepeatingCallback<bool(base::StringPiece, blink::WebMessagePort)>;
+
+  NamedMessagePortConnector();
+  ~NamedMessagePortConnector() override;
+
+  NamedMessagePortConnector(const NamedMessagePortConnector&) = delete;
+  NamedMessagePortConnector& operator=(const NamedMessagePortConnector&) =
+      delete;
+
+  // Sets the callback which will be invoked when a port is connected.
+  void RegisterPortHandler(PortConnectedCallback handler);
+
+  // Returns a connection message which should be posted to the page on
+  // every navigation.
+  // Calling this method will drop any preexisting connections made to the page.
+  blink::WebMessagePort::Message GetConnectMessage();
+
+ private:
+  // blink::WebMessagePort::MessageReceiver implementation:
+  bool OnMessage(blink::WebMessagePort::Message message) override;
+
+  PortConnectedCallback handler_;
+  blink::WebMessagePort control_port_;
+};
+
+}  // namespace cast_api_bindings
+
+#endif  // COMPONENTS_CAST_NAMED_MESSAGE_PORT_CONNECTOR_NAMED_MESSAGE_PORT_CONNECTOR_H_
diff --git a/components/cast/named_message_port_connector/named_message_port_connector.js b/components/cast/named_message_port_connector/named_message_port_connector.js
new file mode 100644
index 0000000..6ce9a3e
--- /dev/null
+++ b/components/cast/named_message_port_connector/named_message_port_connector.js
@@ -0,0 +1,78 @@
+// 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.
+
+'use strict';
+
+if (!cast) {
+  // eslint-disable-next-line no-var
+  var cast = new Object;
+}
+
+if (!cast.__platform__) {
+  cast.__platform__ = new Object;
+}
+
+// Creates named HTML5 MessagePorts that are connected to native code.
+cast.__platform__.PortConnector = new class {
+  constructor() {
+    this.controlPort_ = null;
+
+    // A map of ports waiting to be published to the controlPort_, keyed by
+    // string IDs.
+    this.pendingPorts_ = {};
+
+    this.listener = this.onMessageEvent.bind(this);
+    window.addEventListener(
+        'message', this.listener,
+        true  // Let the listener handle events before they hit the DOM tree.
+    );
+  }
+
+  // Returns a MessagePort whose channel will be passed to the native code.
+  // The channel can be used immediately after construction. Outgoing messages
+  // will be automatically buffered until the connection is established.
+  bind(id) {
+    const channel = new MessageChannel();
+    if (this.controlPort_) {
+      this.sendPort(id, channel.port2);
+    } else {
+      this.pendingPorts_[id] = channel.port2;
+    }
+
+    return channel.port1;
+  }
+
+  sendPort(portId, port) {
+    this.controlPort_.postMessage(portId, [port]);
+  }
+
+  // Receives a control port from native code.
+  onMessageEvent(e) {
+    // Only process window.onmessage events which are intended for this class.
+    if (e.data != 'cast.master.connect') {
+      return;
+    }
+
+    if (e.ports.length != 1) {
+      console.error(
+          'Expected only one MessagePort, got ' + e.ports.length + ' instead.');
+      for (const i in e.ports) {
+        e.ports[i].close();
+      }
+      return;
+    }
+
+    this.controlPort_ = e.ports[0];
+    for (const portId in this.pendingPorts_) {
+      this.sendPort(portId, this.pendingPorts_[portId]);
+    }
+    this.pendingPorts_ = null;
+
+    e.stopPropagation();
+
+    // No need to receive more onmessage events.
+    window.removeEventListener('message', this.listener);
+  }
+}
+();
diff --git a/components/cast/named_message_port_connector/named_message_port_connector_resources.grd b/components/cast/named_message_port_connector/named_message_port_connector_resources.grd
new file mode 100644
index 0000000..d70601d5
--- /dev/null
+++ b/components/cast/named_message_port_connector/named_message_port_connector_resources.grd
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<grit latest_public_release="0" current_release="1" output_all_resource_defines="false">
+  <outputs>
+    <output filename="grit/named_message_port_connector_resources.h" type="rc_header">
+      <emit emit_type='prepend'></emit>
+    </output>
+    <output filename="named_message_port_connector_resources.pak" type="data_package" />
+  </outputs>
+  <release seq="1">
+    <includes>
+      <include name="IDR_PORT_CONNECTOR_JS" file="named_message_port_connector.js" type="BINDATA" />
+    </includes>
+  </release>
+</grit>
diff --git a/components/cronet/android/test/url_request_intercepting_job_factory.cc b/components/cronet/android/test/url_request_intercepting_job_factory.cc
index 5d8bc1f..c832bba 100644
--- a/components/cronet/android/test/url_request_intercepting_job_factory.cc
+++ b/components/cronet/android/test/url_request_intercepting_job_factory.cc
@@ -7,7 +7,9 @@
 #include <utility>
 
 #include "base/check_op.h"
+#include "base/memory/ptr_util.h"
 #include "net/url_request/url_request_interceptor.h"
+#include "net/url_request/url_request_job.h"
 
 namespace cronet {
 
@@ -18,12 +20,13 @@
 
 URLRequestInterceptingJobFactory::~URLRequestInterceptingJobFactory() = default;
 
-net::URLRequestJob* URLRequestInterceptingJobFactory::CreateJob(
+std::unique_ptr<net::URLRequestJob> URLRequestInterceptingJobFactory::CreateJob(
     net::URLRequest* request,
     net::NetworkDelegate* network_delegate) const {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
-  net::URLRequestJob* job =
-      interceptor_->MaybeInterceptRequest(request, network_delegate);
+  std::unique_ptr<net::URLRequestJob> job =
+      base::WrapUnique<net::URLRequestJob>(
+          interceptor_->MaybeInterceptRequest(request, network_delegate));
   if (job)
     return job;
   return job_factory_->CreateJob(request, network_delegate);
diff --git a/components/cronet/android/test/url_request_intercepting_job_factory.h b/components/cronet/android/test/url_request_intercepting_job_factory.h
index 24c0832..07645c0 100644
--- a/components/cronet/android/test/url_request_intercepting_job_factory.h
+++ b/components/cronet/android/test/url_request_intercepting_job_factory.h
@@ -38,7 +38,7 @@
   ~URLRequestInterceptingJobFactory() override;
 
   // URLRequestJobFactory implementation
-  net::URLRequestJob* CreateJob(
+  std::unique_ptr<net::URLRequestJob> CreateJob(
       net::URLRequest* request,
       net::NetworkDelegate* network_delegate) const override;
   bool IsSafeRedirectTarget(const GURL& location) const override;
diff --git a/components/dom_distiller/core/BUILD.gn b/components/dom_distiller/core/BUILD.gn
index e4a90fc2..e5d5623 100644
--- a/components/dom_distiller/core/BUILD.gn
+++ b/components/dom_distiller/core/BUILD.gn
@@ -2,6 +2,12 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+# Reset sources_assignment_filter for the BUILD.gn file to prevent
+# regression during the migration of Chromium away from the feature.
+# See docs/no_sources_assignment_filter.md for more information.
+# TODO(crbug.com/1018739): remove this when migration is done.
+set_sources_assignment_filter([])
+
 static_library("core") {
   sources = [
     "article_distillation_update.cc",
@@ -14,8 +20,6 @@
     "distilled_content_store.h",
     "distilled_page_prefs.cc",
     "distilled_page_prefs.h",
-    "distilled_page_prefs_android.cc",
-    "distilled_page_prefs_android.h",
     "distiller.cc",
     "distiller.h",
     "distiller_page.cc",
@@ -45,7 +49,6 @@
     "url_constants.h",
     "url_utils.cc",
     "url_utils.h",
-    "url_utils_android.cc",
     "viewer.cc",
     "viewer.h",
   ]
@@ -73,8 +76,11 @@
 
   if (is_android) {
     sources += [
+      "distilled_page_prefs_android.cc",
+      "distilled_page_prefs_android.h",
       "dom_distiller_service_android.cc",
       "dom_distiller_service_android.h",
+      "url_utils_android.cc",
     ]
     deps += [ ":jni_headers" ]
   }
diff --git a/components/on_load_script_injector/browser/BUILD.gn b/components/on_load_script_injector/browser/BUILD.gn
index c4ce673..247857a3 100644
--- a/components/on_load_script_injector/browser/BUILD.gn
+++ b/components/on_load_script_injector/browser/BUILD.gn
@@ -20,10 +20,4 @@
     "//mojo/public/cpp/bindings",
     "//third_party/blink/public/common",
   ]
-
-  visibility = [
-    "//chromecast/bindings:bindings_manager_cast",
-    "//chromecast/browser:browser",
-    "//fuchsia/engine:web_engine_core",
-  ]
 }
diff --git a/components/on_load_script_injector/renderer/BUILD.gn b/components/on_load_script_injector/renderer/BUILD.gn
index bb9ee65..0676a3e 100644
--- a/components/on_load_script_injector/renderer/BUILD.gn
+++ b/components/on_load_script_injector/renderer/BUILD.gn
@@ -21,9 +21,4 @@
     "//mojo/public/cpp/bindings",
     "//third_party/blink/public/common",
   ]
-
-  visibility = [
-    "//chromecast/renderer/*",
-    "//fuchsia/engine:web_engine_core",
-  ]
 }
diff --git a/components/os_crypt/BUILD.gn b/components/os_crypt/BUILD.gn
index 36fbda0..c32f076b 100644
--- a/components/os_crypt/BUILD.gn
+++ b/components/os_crypt/BUILD.gn
@@ -53,7 +53,7 @@
 
   defines = [ "IS_OS_CRYPT_IMPL" ]
 
-  if ((is_posix || is_fuchsia) && !is_mac && !is_ios &&
+  if ((is_posix || is_fuchsia) && !is_apple &&
       (!is_desktop_linux || is_chromecast)) {
     sources += [ "os_crypt_posix.cc" ]
   }
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
index 459c4db..ace21bd 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
@@ -14,7 +14,6 @@
 import android.text.Spannable;
 import android.text.SpannableString;
 import android.text.SpannableStringBuilder;
-import android.text.TextUtils;
 import android.text.style.ForegroundColorSpan;
 import android.text.style.TextAppearanceSpan;
 import android.view.View;
@@ -406,7 +405,7 @@
         } else if (mDelegate.getOfflinePageConnectionMessage() != null) {
             messageBuilder.append(mDelegate.getOfflinePageConnectionMessage());
         } else {
-            if (!TextUtils.equals(summary, details)) {
+            if (!summary.isEmpty()) {
                 connectionInfoParams.summary = summary;
             }
             messageBuilder.append(details);
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java
index 3bf0d7fb..9daa1b6 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java
@@ -4,15 +4,19 @@
 
 package org.chromium.components.page_info;
 
+import android.content.res.Resources;
 import android.os.Bundle;
 import android.view.View;
 import android.view.ViewGroup;
 
+import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AppCompatActivity;
 import androidx.fragment.app.Fragment;
 
 import org.chromium.components.browser_ui.site_settings.SingleWebsiteSettings;
 
+import java.util.List;
+
 /**
  * Class for controlling the page info permissions section.
  */
@@ -66,15 +70,69 @@
     }
 
     public void setPermissions(PageInfoView.PermissionParams params) {
-        mTitle = mRowView.getContext().getResources().getString(
-                R.string.page_info_permissions_title);
+        Resources resources = mRowView.getContext().getResources();
+        mTitle = resources.getString(R.string.page_info_permissions_title);
         PageInfoRowView.ViewParams rowParams = new PageInfoRowView.ViewParams();
-        rowParams.visible = true;
         rowParams.title = mTitle;
         rowParams.iconResId = R.drawable.ic_tune_24dp;
-        // TODO(crbug.com/1077766): Create a permissions subtitle string that represents
-        // the state, using the PageInfoView.PermissionParams and potentially R.plurals.
         rowParams.clickCallback = this::launchSubpage;
+        rowParams.subtitle = getPermissionSummaryString(params.permissions, resources);
+        rowParams.visible = rowParams.subtitle != null;
         mRowView.setParams(rowParams);
     }
+
+    /**
+     * Returns the most comprehensive subtitle summary string.
+     */
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    public static String getPermissionSummaryString(
+            List<PageInfoView.PermissionRowParams> permissions, Resources resources) {
+        int numPermissions = permissions.size();
+        if (numPermissions == 0) {
+            return null;
+        }
+
+        PageInfoView.PermissionRowParams perm1 = permissions.get(0);
+        boolean same = true;
+        for (PageInfoView.PermissionRowParams perm : permissions) {
+            if (perm.warningTextResource != 0) {
+                // Show the first (most important warning) only, if there is one.
+                return resources.getString(R.string.page_info_permissions_os_warning,
+                        perm.name.toString(), resources.getString(perm.warningTextResource));
+            }
+            // Whether all permissions have had the same status so far.
+            same = same && (perm1.allowed == perm.allowed);
+        }
+
+        if (numPermissions == 1) {
+            int resId = perm1.allowed ? R.string.page_info_permissions_summary_1_allowed
+                                      : R.string.page_info_permissions_summary_1_blocked;
+            return resources.getString(resId, perm1.name.toString());
+        }
+
+        PageInfoView.PermissionRowParams perm2 = permissions.get(1);
+        if (numPermissions == 2) {
+            if (same) {
+                int resId = perm1.allowed ? R.string.page_info_permissions_summary_2_allowed
+                                          : R.string.page_info_permissions_summary_2_blocked;
+                return resources.getString(resId, perm1.name.toString(), perm2.name.toString());
+            }
+            int resId = R.string.page_info_permissions_summary_2_mixed;
+            // Put the allowed permission first.
+            return resources.getString(resId,
+                    perm1.allowed ? perm1.name.toString() : perm2.name.toString(),
+                    perm1.allowed ? perm2.name.toString() : perm1.name.toString());
+        }
+
+        // More than 2 permissions.
+        if (same) {
+            int resId = perm1.allowed ? R.string.page_info_permissions_summary_more_allowed
+                                      : R.string.page_info_permissions_summary_more_blocked;
+            return resources.getString(
+                    resId, perm1.name.toString(), perm2.name.toString(), numPermissions - 2);
+        }
+        int resId = R.string.page_info_permissions_summary_more_mixed;
+        return resources.getString(
+                resId, perm1.name.toString(), perm2.name.toString(), numPermissions - 2);
+    }
 }
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java
index 1c9186a..34413226 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java
@@ -183,6 +183,9 @@
 
     /**  Parameters to configure the view of a permission row. */
     public static class PermissionRowParams {
+        public CharSequence name;
+        public boolean allowed;
+        // TODO(crbug.com/1077766): Remove status text and associations after migration.
         public CharSequence status;
         public @DrawableRes int iconResource;
         public @ColorRes int iconTintColorResource;
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java b/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java
index 5bbe356..461c2c5 100644
--- a/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java
+++ b/components/page_info/android/java/src/org/chromium/components/page_info/PermissionParamsListBuilder.java
@@ -146,6 +146,7 @@
         final TextAppearanceSpan span =
                 new TextAppearanceSpan(mContext, R.style.TextAppearance_TextMediumThick_Primary);
         nameString.setSpan(span, 0, nameString.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
+        permissionParams.name = nameString;
 
         builder.append(nameString);
         builder.append(" – "); // en-dash.
@@ -162,9 +163,11 @@
         } else {
             switch (permission.setting) {
                 case ContentSettingValues.ALLOW:
+                    permissionParams.allowed = true;
                     status_text = mContext.getString(R.string.page_info_permission_allowed);
                     break;
                 case ContentSettingValues.BLOCK:
+                    permissionParams.allowed = false;
                     status_text = mContext.getString(R.string.page_info_permission_blocked);
                     break;
                 default:
diff --git a/components/page_info/page_info_ui.cc b/components/page_info/page_info_ui.cc
index e1f09ff7..a01f50d 100644
--- a/components/page_info/page_info_ui.cc
+++ b/components/page_info/page_info_ui.cc
@@ -12,6 +12,7 @@
 #include "base/stl_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
+#include "components/page_info/features.h"
 #include "components/page_info/page_info_ui_delegate.h"
 #include "components/permissions/permission_manager.h"
 #include "components/permissions/permission_result.h"
@@ -197,19 +198,21 @@
     int summary_id,
     int details_id,
     PageInfoUI::SecurityDescriptionType type) {
-  std::unique_ptr<PageInfoUI::SecurityDescription> security_description(
-      new PageInfoUI::SecurityDescription());
+  auto security_description =
+      std::make_unique<PageInfoUI::SecurityDescription>();
   security_description->summary_style = style;
-  security_description->summary = l10n_util::GetStringUTF16(summary_id);
-  security_description->details = l10n_util::GetStringUTF16(details_id);
+  if (summary_id)
+    security_description->summary = l10n_util::GetStringUTF16(summary_id);
+  if (details_id)
+    security_description->details = l10n_util::GetStringUTF16(details_id);
   security_description->type = type;
   return security_description;
 }
 
 std::unique_ptr<PageInfoUI::SecurityDescription>
 CreateSecurityDescriptionForLookalikeSafetyTip(const GURL& safe_url) {
-  std::unique_ptr<PageInfoUI::SecurityDescription> security_description(
-      new PageInfoUI::SecurityDescription());
+  auto security_description =
+      std::make_unique<PageInfoUI::SecurityDescription>();
   security_description->summary_style = PageInfoUI::SecuritySummaryColor::RED;
 
   const base::string16 safe_host =
@@ -256,7 +259,7 @@
     std::unique_ptr<permissions::ChooserContextBase::Object> chooser_object)
     : ui_info(ui_info), chooser_object(std::move(chooser_object)) {}
 
-PageInfoUI::ChosenObjectInfo::~ChosenObjectInfo() {}
+PageInfoUI::ChosenObjectInfo::~ChosenObjectInfo() = default;
 
 PageInfoUI::IdentityInfo::IdentityInfo()
     : identity_status(PageInfo::SITE_IDENTITY_STATUS_UNKNOWN),
@@ -266,16 +269,13 @@
       show_ssl_decision_revoke_button(false),
       show_change_password_buttons(false) {}
 
-PageInfoUI::IdentityInfo::~IdentityInfo() {}
+PageInfoUI::IdentityInfo::~IdentityInfo() = default;
 
 PageInfoUI::PageFeatureInfo::PageFeatureInfo()
     : is_vr_presentation_in_headset(false) {}
 
 std::unique_ptr<PageInfoUI::SecurityDescription>
 PageInfoUI::GetSecurityDescription(const IdentityInfo& identity_info) const {
-  std::unique_ptr<PageInfoUI::SecurityDescription> security_description(
-      new PageInfoUI::SecurityDescription());
-
   switch (identity_info.safe_browsing_status) {
     case PageInfo::SAFE_BROWSING_STATUS_NONE:
       break;
@@ -319,11 +319,9 @@
   switch (identity_info.identity_status) {
     case PageInfo::SITE_IDENTITY_STATUS_INTERNAL_PAGE:
 #if defined(OS_ANDROID)
-      // We provide identical summary and detail strings for Android, which
-      // deduplicates them in the UI code.
-      return CreateSecurityDescription(
-          SecuritySummaryColor::GREEN, IDS_PAGE_INFO_INTERNAL_PAGE,
-          IDS_PAGE_INFO_INTERNAL_PAGE, SecurityDescriptionType::INTERNAL);
+      return CreateSecurityDescription(SecuritySummaryColor::GREEN, 0,
+                                       IDS_PAGE_INFO_INTERNAL_PAGE,
+                                       SecurityDescriptionType::INTERNAL);
 #else
       // Internal pages on desktop have their own UI implementations which
       // should never call this function.
@@ -357,10 +355,16 @@
                                            IDS_PAGE_INFO_LEGACY_TLS_DETAILS,
                                            SecurityDescriptionType::CONNECTION);
         default:
-          return CreateSecurityDescription(SecuritySummaryColor::GREEN,
-                                           IDS_PAGE_INFO_SECURE_SUMMARY,
-                                           IDS_PAGE_INFO_SECURE_DETAILS,
-                                           SecurityDescriptionType::CONNECTION);
+          int secure_details = IDS_PAGE_INFO_SECURE_DETAILS;
+#if defined(OS_ANDROID)
+          if (base::FeatureList::IsEnabled(page_info::kPageInfoV2)) {
+            // Do not show details for secure connections.
+            secure_details = 0;
+          }
+#endif
+          return CreateSecurityDescription(
+              SecuritySummaryColor::GREEN, IDS_PAGE_INFO_SECURE_SUMMARY,
+              secure_details, SecurityDescriptionType::CONNECTION);
       }
     case PageInfo::SITE_IDENTITY_STATUS_DEPRECATED_SIGNATURE_ALGORITHM:
     case PageInfo::SITE_IDENTITY_STATUS_UNKNOWN:
@@ -373,7 +377,7 @@
   }
 }
 
-PageInfoUI::~PageInfoUI() {}
+PageInfoUI::~PageInfoUI() = default;
 
 // static
 base::string16 PageInfoUI::PermissionTypeToUIString(ContentSettingsType type) {
@@ -394,7 +398,7 @@
     content_settings::SettingSource source) {
   ContentSetting effective_setting =
       GetEffectiveSetting(type, setting, default_setting);
-  const int* button_text_ids = NULL;
+  const int* button_text_ids = nullptr;
   switch (source) {
     case content_settings::SETTING_SOURCE_USER:
       if (setting == CONTENT_SETTING_DEFAULT) {
diff --git a/components/paint_preview/browser/BUILD.gn b/components/paint_preview/browser/BUILD.gn
index 3712dfe..fe905fd1 100644
--- a/components/paint_preview/browser/BUILD.gn
+++ b/components/paint_preview/browser/BUILD.gn
@@ -26,6 +26,8 @@
     "paint_preview_compositor_service_impl.h",
     "paint_preview_policy.h",
     "service_sandbox_type.h",
+    "warm_compositor.cc",
+    "warm_compositor.h",
   ]
 
   deps = [
diff --git a/components/paint_preview/browser/paint_preview_compositor_service_impl.cc b/components/paint_preview/browser/paint_preview_compositor_service_impl.cc
index 9a58136..f1489dd 100644
--- a/components/paint_preview/browser/paint_preview_compositor_service_impl.cc
+++ b/components/paint_preview/browser/paint_preview_compositor_service_impl.cc
@@ -101,6 +101,12 @@
   return !active_clients_.empty();
 }
 
+void PaintPreviewCompositorServiceImpl::SetDisconnectHandler(
+    base::OnceClosure disconnect_handler) {
+  DCHECK(default_task_runner_->RunsTasksInCurrentSequence());
+  user_disconnect_closure_ = std::move(disconnect_handler);
+}
+
 void PaintPreviewCompositorServiceImpl::MarkCompositorAsDeleted(
     const base::UnguessableToken& token) {
   DCHECK(default_task_runner_->RunsTasksInCurrentSequence());
@@ -121,7 +127,8 @@
 
 void PaintPreviewCompositorServiceImpl::DisconnectHandler() {
   DCHECK(default_task_runner_->RunsTasksInCurrentSequence());
-  std::move(user_disconnect_closure_).Run();
+  if (user_disconnect_closure_)
+    std::move(user_disconnect_closure_).Run();
   compositor_service_.reset();
 }
 
diff --git a/components/paint_preview/browser/paint_preview_compositor_service_impl.h b/components/paint_preview/browser/paint_preview_compositor_service_impl.h
index 8ca3b2010..590e6360 100644
--- a/components/paint_preview/browser/paint_preview_compositor_service_impl.h
+++ b/components/paint_preview/browser/paint_preview_compositor_service_impl.h
@@ -38,6 +38,9 @@
   CreateCompositor(base::OnceClosure connected_closure) override;
 
   bool HasActiveClients() const override;
+  // NOTE: this is set by the constructor. However, in some cases it may need to
+  // be changed.
+  void SetDisconnectHandler(base::OnceClosure disconnect_handler) override;
 
   // Marks the compositor associated with |token| as deleted in the
   // |active_clients_| set.
diff --git a/components/paint_preview/browser/warm_compositor.cc b/components/paint_preview/browser/warm_compositor.cc
new file mode 100644
index 0000000..f5c1d22
--- /dev/null
+++ b/components/paint_preview/browser/warm_compositor.cc
@@ -0,0 +1,55 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/paint_preview/browser/warm_compositor.h"
+
+#include <utility>
+
+#include "base/bind.h"
+#include "base/memory/singleton.h"
+#include "components/paint_preview/browser/compositor_utils.h"
+
+namespace paint_preview {
+
+WarmCompositor::WarmCompositor()
+    : compositor_service_(nullptr, base::OnTaskRunnerDeleter(nullptr)) {}
+WarmCompositor::~WarmCompositor() = default;
+
+// static
+WarmCompositor* WarmCompositor::GetInstance() {
+  return base::Singleton<WarmCompositor,
+                         base::LeakySingletonTraits<WarmCompositor>>::get();
+}
+
+void WarmCompositor::WarmupCompositor() {
+  if (compositor_service_)
+    return;
+
+  compositor_service_ = StartCompositorService(base::BindOnce(
+      &WarmCompositor::OnDisconnect, weak_ptr_factory_.GetWeakPtr()));
+}
+
+bool WarmCompositor::StopCompositor() {
+  if (!compositor_service_)
+    return false;
+
+  compositor_service_.reset();
+  return true;
+}
+
+std::unique_ptr<PaintPreviewCompositorService, base::OnTaskRunnerDeleter>
+WarmCompositor::GetOrStartCompositorService(
+    base::OnceClosure disconnect_handler) {
+  if (!compositor_service_)
+    return StartCompositorService(std::move(disconnect_handler));
+
+  compositor_service_->SetDisconnectHandler(std::move(disconnect_handler));
+  return std::move(compositor_service_);
+}
+
+void WarmCompositor::OnDisconnect() {
+  compositor_service_.reset();
+}
+
+}  // namespace paint_preview
diff --git a/components/paint_preview/browser/warm_compositor.h b/components/paint_preview/browser/warm_compositor.h
new file mode 100644
index 0000000..defeebe
--- /dev/null
+++ b/components/paint_preview/browser/warm_compositor.h
@@ -0,0 +1,56 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_PAINT_PREVIEW_BROWSER_WARM_COMPOSITOR_H_
+#define COMPONENTS_PAINT_PREVIEW_BROWSER_WARM_COMPOSITOR_H_
+
+#include <memory>
+
+#include "base/task_runner.h"
+#include "components/paint_preview/public/paint_preview_compositor_service.h"
+
+namespace base {
+template <typename T>
+struct DefaultSingletonTraits;
+}
+
+namespace paint_preview {
+
+// A class that can hold a pre-warmed compositor service for use.
+class WarmCompositor {
+ public:
+  ~WarmCompositor();
+
+  WarmCompositor(const WarmCompositor&) = delete;
+  WarmCompositor& operator=(const WarmCompositor&) = delete;
+
+  static WarmCompositor* GetInstance();
+
+  // Warms up the compositor service.
+  void WarmupCompositor();
+
+  // Releases the warmed compositor service if there is one. Returns true if a
+  // compositor was released.
+  bool StopCompositor();
+
+  // Passes the pre-warmed compositor to the caller if one is present.
+  // Otherwise starts a new compositor.
+  std::unique_ptr<PaintPreviewCompositorService, base::OnTaskRunnerDeleter>
+  GetOrStartCompositorService(base::OnceClosure disconnect_handler);
+
+ private:
+  WarmCompositor();
+  friend struct base::DefaultSingletonTraits<WarmCompositor>;
+
+  void OnDisconnect();
+
+  std::unique_ptr<PaintPreviewCompositorService, base::OnTaskRunnerDeleter>
+      compositor_service_;
+
+  base::WeakPtrFactory<WarmCompositor> weak_ptr_factory_{this};
+};
+
+}  // namespace paint_preview
+
+#endif  // COMPONENTS_PAINT_PREVIEW_BROWSER_WARM_COMPOSITOR_H_
diff --git a/components/paint_preview/player/player_compositor_delegate.cc b/components/paint_preview/player/player_compositor_delegate.cc
index 8ac4e61..3f14d43 100644
--- a/components/paint_preview/player/player_compositor_delegate.cc
+++ b/components/paint_preview/player/player_compositor_delegate.cc
@@ -21,8 +21,8 @@
 #include "base/trace_event/common/trace_event_common.h"
 #include "base/trace_event/trace_event.h"
 #include "base/unguessable_token.h"
-#include "components/paint_preview/browser/compositor_utils.h"
 #include "components/paint_preview/browser/paint_preview_base_service.h"
+#include "components/paint_preview/browser/warm_compositor.h"
 #include "components/paint_preview/common/proto/paint_preview.pb.h"
 #include "components/paint_preview/common/recording_map.h"
 #include "components/paint_preview/common/serialized_recording.h"
@@ -120,9 +120,10 @@
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN0("paint_preview",
                                     "PlayerCompositorDelegate CreateCompositor",
                                     TRACE_ID_LOCAL(this));
-  paint_preview_compositor_service_ = StartCompositorService(
-      base::BindOnce(&PlayerCompositorDelegate::OnCompositorServiceDisconnected,
-                     weak_factory_.GetWeakPtr()));
+  paint_preview_compositor_service_ =
+      WarmCompositor::GetInstance()->GetOrStartCompositorService(base::BindOnce(
+          &PlayerCompositorDelegate::OnCompositorServiceDisconnected,
+          weak_factory_.GetWeakPtr()));
 
   paint_preview_compositor_client_ =
       paint_preview_compositor_service_->CreateCompositor(
diff --git a/components/paint_preview/public/paint_preview_compositor_service.h b/components/paint_preview/public/paint_preview_compositor_service.h
index 10be79ce..ab934d2 100644
--- a/components/paint_preview/public/paint_preview_compositor_service.h
+++ b/components/paint_preview/public/paint_preview_compositor_service.h
@@ -35,6 +35,9 @@
   // check if killing this service is safe (i.e. won't drop messages).
   virtual bool HasActiveClients() const = 0;
 
+  // Sets the disconnect handler for this service.
+  virtual void SetDisconnectHandler(base::OnceClosure disconnect_handler) = 0;
+
   PaintPreviewCompositorService(const PaintPreviewCompositorService&) = delete;
   PaintPreviewCompositorService& operator=(
       const PaintPreviewCompositorService&) = delete;
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn
index 379509e8..8d347a9 100644
--- a/components/password_manager/core/browser/BUILD.gn
+++ b/components/password_manager/core/browser/BUILD.gn
@@ -333,7 +333,7 @@
     ]
   }
 
-  if ((is_posix && !is_mac && !is_ios) || is_fuchsia) {
+  if ((is_posix && !is_apple) || is_fuchsia) {
     sources += [ "login_database_posix.cc" ]
   }
 
diff --git a/components/password_manager/core/browser/android_affiliation/fake_affiliation_api.cc b/components/password_manager/core/browser/android_affiliation/fake_affiliation_api.cc
index a871cd0..cd05d89 100644
--- a/components/password_manager/core/browser/android_affiliation/fake_affiliation_api.cc
+++ b/components/password_manager/core/browser/android_affiliation/fake_affiliation_api.cc
@@ -8,6 +8,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/ranges/algorithm.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace password_manager {
@@ -44,20 +45,13 @@
   FakeAffiliationFetcher* fetcher = fake_fetcher_factory_.PopNextFetcher();
   std::unique_ptr<AffiliationFetcherDelegate::Result> fake_response(
       new AffiliationFetcherDelegate::Result);
-  for (const auto& preset_equivalence_class : preset_equivalence_relation_) {
-    bool had_intersection_with_request = false;
-    for (const auto& requested_facet_uri : fetcher->GetRequestedFacetURIs()) {
-      if (std::any_of(preset_equivalence_class.begin(),
-                      preset_equivalence_class.end(),
-                      [&requested_facet_uri](const Facet& facet) {
-                        return facet.uri == requested_facet_uri;
-                      })) {
-        had_intersection_with_request = true;
-        break;
-      }
-    }
+  for (const auto& facets : preset_equivalence_relation_) {
+    bool had_intersection_with_request = base::ranges::any_of(
+        fetcher->GetRequestedFacetURIs(), [&facets](const auto& uri) {
+          return base::ranges::find(facets, uri, &Facet::uri) != facets.end();
+        });
     if (had_intersection_with_request)
-      fake_response->affiliations.push_back(preset_equivalence_class);
+      fake_response->affiliations.push_back(facets);
   }
   fetcher->SimulateSuccess(std::move(fake_response));
 }
diff --git a/components/password_manager/core/browser/compromised_credentials_observer.cc b/components/password_manager/core/browser/compromised_credentials_observer.cc
index 8422949..b73ded1cc 100644
--- a/components/password_manager/core/browser/compromised_credentials_observer.cc
+++ b/components/password_manager/core/browser/compromised_credentials_observer.cc
@@ -7,6 +7,7 @@
 #include <memory>
 
 #include "base/metrics/histogram_macros.h"
+#include "base/ranges/algorithm.h"
 #include "components/password_manager/core/browser/compromised_credentials_table.h"
 
 namespace password_manager {
@@ -23,7 +24,7 @@
       continue;
     auto reason = RemoveCompromisedCredentialsReason::kUpdate;
     if (change.type() == PasswordStoreChange::REMOVE &&
-        std::none_of(changes.begin(), changes.end(), [](const auto& change) {
+        base::ranges::none_of(changes, [](const auto& change) {
           return change.type() == PasswordStoreChange::ADD;
         })) {
       reason = RemoveCompromisedCredentialsReason::kRemove;
diff --git a/components/password_manager/core/browser/form_parsing/form_parser.cc b/components/password_manager/core/browser/form_parsing/form_parser.cc
index af128f9..4211d1f 100644
--- a/components/password_manager/core/browser/form_parsing/form_parser.cc
+++ b/components/password_manager/core/browser/form_parsing/form_parser.cc
@@ -15,6 +15,7 @@
 
 #include "base/metrics/histogram_functions.h"
 #include "base/no_destructor.h"
+#include "base/ranges/algorithm.h"
 #include "base/stl_util.h"
 #include "base/strings/string16.h"
 #include "base/strings/string_piece.h"
@@ -174,7 +175,7 @@
 }
 
 bool DoesStringContainOnlyDigits(const base::string16& s) {
-  return std::all_of(s.begin(), s.end(), &base::IsAsciiDigit<base::char16>);
+  return base::ranges::all_of(s, &base::IsAsciiDigit<base::char16>);
 }
 
 // Heuristics to determine that a string is very unlikely to be a username.
diff --git a/components/password_manager/core/browser/password_autofill_manager.cc b/components/password_manager/core/browser/password_autofill_manager.cc
index 69efcee9..08f08a42 100644
--- a/components/password_manager/core/browser/password_autofill_manager.cc
+++ b/components/password_manager/core/browser/password_autofill_manager.cc
@@ -180,20 +180,16 @@
 }
 
 void MaybeAppendManualFallback(std::vector<autofill::Suggestion>* suggestions) {
-  bool has_no_fillable_suggestions = std::none_of(
-      suggestions->begin(), suggestions->end(),
-      [](const autofill::Suggestion& suggestion) {
-        return suggestion.frontend_id ==
-                   autofill::POPUP_ITEM_ID_USERNAME_ENTRY ||
-               suggestion.frontend_id ==
-                   autofill::POPUP_ITEM_ID_PASSWORD_ENTRY ||
-               suggestion.frontend_id ==
-                   autofill::POPUP_ITEM_ID_ACCOUNT_STORAGE_USERNAME_ENTRY ||
-               suggestion.frontend_id ==
-                   autofill::POPUP_ITEM_ID_ACCOUNT_STORAGE_PASSWORD_ENTRY ||
-               suggestion.frontend_id ==
-                   autofill::POPUP_ITEM_ID_GENERATE_PASSWORD_ENTRY;
-      });
+  bool has_no_fillable_suggestions = base::ranges::none_of(
+      *suggestions,
+      [](int id) {
+        return id == autofill::POPUP_ITEM_ID_USERNAME_ENTRY ||
+               id == autofill::POPUP_ITEM_ID_PASSWORD_ENTRY ||
+               id == autofill::POPUP_ITEM_ID_ACCOUNT_STORAGE_USERNAME_ENTRY ||
+               id == autofill::POPUP_ITEM_ID_ACCOUNT_STORAGE_PASSWORD_ENTRY ||
+               id == autofill::POPUP_ITEM_ID_GENERATE_PASSWORD_ENTRY;
+      },
+      &autofill::Suggestion::frontend_id);
   if (has_no_fillable_suggestions)
     return;
   autofill::Suggestion suggestion(
@@ -257,30 +253,24 @@
 }
 
 bool ContainsOtherThanManagePasswords(
-    const std::vector<autofill::Suggestion> suggestions) {
-  return std::any_of(suggestions.begin(), suggestions.end(),
-                     [](const auto& suggestion) {
-                       return suggestion.frontend_id !=
-                              autofill::POPUP_ITEM_ID_ALL_SAVED_PASSWORDS_ENTRY;
-                     });
+    base::span<const autofill::Suggestion> suggestions) {
+  return base::ranges::any_of(suggestions, [](const auto& s) {
+    return s.frontend_id != autofill::POPUP_ITEM_ID_ALL_SAVED_PASSWORDS_ENTRY;
+  });
 }
 
 bool AreSuggestionForPasswordField(
     base::span<const autofill::Suggestion> suggestions) {
-  return std::any_of(suggestions.begin(), suggestions.end(),
-                     [](const autofill::Suggestion& suggestion) {
-                       return suggestion.frontend_id ==
-                              autofill::POPUP_ITEM_ID_PASSWORD_ENTRY;
-                     });
+  return base::ranges::any_of(suggestions, [](const auto& suggestion) {
+    return suggestion.frontend_id == autofill::POPUP_ITEM_ID_PASSWORD_ENTRY;
+  });
 }
 
 bool HasLoadingSuggestion(base::span<const autofill::Suggestion> suggestions,
                           autofill::PopupItemId item_id) {
-  return std::any_of(suggestions.begin(), suggestions.end(),
-                     [&item_id](const autofill::Suggestion& suggestion) {
-                       return suggestion.frontend_id == item_id &&
-                              suggestion.is_loading;
-                     });
+  return base::ranges::any_of(suggestions, [&item_id](const auto& suggestion) {
+    return suggestion.frontend_id == item_id && suggestion.is_loading;
+  });
 }
 
 std::vector<autofill::Suggestion> SetUnlockLoadingState(
diff --git a/components/password_manager/core/browser/password_form_manager.cc b/components/password_manager/core/browser/password_form_manager.cc
index a09d1db2..23828b31 100644
--- a/components/password_manager/core/browser/password_form_manager.cc
+++ b/components/password_manager/core/browser/password_form_manager.cc
@@ -16,9 +16,11 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
+#include "base/ranges/algorithm.h"
 #include "base/stl_util.h"
 #include "build/build_config.h"
 #include "components/autofill/core/common/form_data.h"
+#include "components/autofill/core/common/password_form.h"
 #include "components/autofill/core/common/password_form_generation_data.h"
 #include "components/password_manager/core/browser/android_affiliation/affiliation_utils.h"
 #include "components/password_manager/core/browser/browser_save_password_progress_logger.h"
@@ -286,20 +288,14 @@
 
   const base::string16& username = GetPendingCredentials().username_value;
   const base::string16& password = GetPendingCredentials().password_value;
-  const std::vector<const PasswordForm*> matches =
-      form_fetcher_->GetBestMatches();
   // If no match in the profile store with the same username and password exist,
   // then there is nothing to move.
-  if (std::none_of(matches.cbegin(), matches.cend(),
-                   [&](const PasswordForm* match) {
-                     return !match->IsUsingAccountStore() &&
-                            match->username_value == username &&
-                            match->password_value == password;
-                   })) {
-    return false;
-  }
-
-  return !form_fetcher_->IsMovingBlocked(GaiaIdHash::FromGaiaId(gaia_id),
+  auto is_movable = [&](const PasswordForm* match) {
+    return !match->IsUsingAccountStore() && match->username_value == username &&
+           match->password_value == password;
+  };
+  return base::ranges::any_of(form_fetcher_->GetBestMatches(), is_movable) &&
+         !form_fetcher_->IsMovingBlocked(GaiaIdHash::FromGaiaId(gaia_id),
                                          username);
 }
 
diff --git a/components/password_manager/core/browser/password_manager_features_util.cc b/components/password_manager/core/browser/password_manager_features_util.cc
index 7f03692b..8016f82 100644
--- a/components/password_manager/core/browser/password_manager_features_util.cc
+++ b/components/password_manager/core/browser/password_manager_features_util.cc
@@ -8,6 +8,7 @@
 
 #include "base/containers/flat_set.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/ranges/algorithm.h"
 #include "base/values.h"
 #include "components/autofill/core/common/gaia_id_hash.h"
 #include "components/password_manager/core/common/password_manager_features.h"
@@ -223,15 +224,12 @@
     return false;
   }
 
-  const base::DictionaryValue* global_pref =
-      pref_service->GetDictionary(prefs::kAccountStoragePerAccountSettings);
   // Show the opt-in if any known previous user opted into using the account
   // storage before and might want to access it again.
-  return std::any_of(
-      global_pref->begin(), global_pref->end(),
-      [](const std::pair<std::string, std::unique_ptr<base::Value>>& prefs) {
-        return prefs.second->FindBoolKey(kAccountStorageOptedInKey)
-            .value_or(false);
+  return base::ranges::any_of(
+      *pref_service->GetDictionary(prefs::kAccountStoragePerAccountSettings),
+      [](const std::pair<std::string, std::unique_ptr<base::Value>>& p) {
+        return p.second->FindBoolKey(kAccountStorageOptedInKey).value_or(false);
       });
 }
 
diff --git a/components/password_manager/core/browser/password_manager_util.cc b/components/password_manager/core/browser/password_manager_util.cc
index d8fe4ca4..6f3f0ac 100644
--- a/components/password_manager/core/browser/password_manager_util.cc
+++ b/components/password_manager/core/browser/password_manager_util.cc
@@ -12,6 +12,7 @@
 #include "base/bind.h"
 #include "base/feature_list.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/ranges/algorithm.h"
 #include "base/stl_util.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
@@ -219,9 +220,8 @@
     std::vector<const PasswordForm*>* non_federated_same_scheme,
     std::vector<const PasswordForm*>* best_matches,
     const PasswordForm** preferred_match) {
-  DCHECK(std::all_of(
-      non_federated_matches.begin(), non_federated_matches.end(),
-      [](const PasswordForm* match) { return !match->blocked_by_user; }));
+  DCHECK(base::ranges::none_of(non_federated_matches,
+                               &PasswordForm::blocked_by_user));
   DCHECK(non_federated_same_scheme);
   DCHECK(best_matches);
   DCHECK(preferred_match);
diff --git a/components/password_manager/core/browser/site_affiliation/asset_link_data.cc b/components/password_manager/core/browser/site_affiliation/asset_link_data.cc
index 44bc591..bc057677 100644
--- a/components/password_manager/core/browser/site_affiliation/asset_link_data.cc
+++ b/components/password_manager/core/browser/site_affiliation/asset_link_data.cc
@@ -9,6 +9,7 @@
 
 #include "base/json/json_reader.h"
 #include "base/json/json_value_converter.h"
+#include "base/ranges/algorithm.h"
 #include "base/values.h"
 
 namespace password_manager {
@@ -65,11 +66,9 @@
         GURL include(statement.include);
         if (include.is_valid() && include.SchemeIs(url::kHttpsScheme))
           includes_.push_back(std::move(include));
-      } else if (std::any_of(statement.relations.begin(),
-                             statement.relations.end(),
-                             [](const std::unique_ptr<std::string>& relation) {
-                               return *relation == kGetLoginsRelation;
-                             })) {
+      } else if (base::ranges::any_of(statement.relations, [](const auto& rel) {
+                   return *rel == kGetLoginsRelation;
+                 })) {
         // 'get_login_creds' statement. Only web HTTPS targets are interesting.
         if (statement.target.target_namespace == kWebNamespace) {
           GURL site(statement.target.site);
diff --git a/components/password_manager/core/browser/sql_table_builder.cc b/components/password_manager/core/browser/sql_table_builder.cc
index 274789a7b..b413b38 100644
--- a/components/password_manager/core/browser/sql_table_builder.cc
+++ b/components/password_manager/core/browser/sql_table_builder.cc
@@ -9,7 +9,9 @@
 #include <utility>
 
 #include "base/numerics/safe_conversions.h"
+#include "base/ranges/algorithm.h"
 #include "base/stl_util.h"
+#include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
 #include "base/strings/stringprintf.h"
 #include "sql/database.h"
@@ -98,11 +100,10 @@
 
   DCHECK(FindLastColumnByName(new_name) == columns_.rend());
   // Check there is no index in the current version that references |old_name|.
-  DCHECK(std::none_of(indices_.begin(), indices_.end(),
-                      [&old_name](const Index& index) {
-                        return index.max_version == kInvalidVersion &&
-                               base::Contains(index.columns, old_name);
-                      }));
+  DCHECK(base::ranges::none_of(indices_, [&old_name](const Index& index) {
+    return index.max_version == kInvalidVersion &&
+           base::Contains(index.columns, old_name);
+  }));
 
   if (sealed_version_ != kInvalidVersion &&
       old_column->min_version <= sealed_version_) {
@@ -131,11 +132,10 @@
   auto column = FindLastColumnByName(name);
   DCHECK(column != columns_.rend());
   // Check there is no index in the current version that references |old_name|.
-  DCHECK(std::none_of(indices_.begin(), indices_.end(),
-                      [&name](const Index& index) {
-                        return index.max_version == kInvalidVersion &&
-                               base::Contains(index.columns, name);
-                      }));
+  DCHECK(base::ranges::none_of(indices_, [&name](const Index& index) {
+    return index.max_version == kInvalidVersion &&
+           base::Contains(index.columns, name);
+  }));
   if (sealed_version_ != kInvalidVersion &&
       column->min_version <= sealed_version_) {
     // This column exists in the last sealed version. Therefore it cannot be
@@ -159,17 +159,14 @@
   DCHECK(FindLastIndexByName(name) == indices_.rend());
   // Check that all referenced columns are present in the last version by making
   // sure that the inner predicate applies to all columns names in |columns|.
-  DCHECK(std::all_of(
-      columns.begin(), columns.end(), [this](const std::string& column_name) {
-        // Check if there is any column with the required name which is also
-        // present in the latest version. Note that we don't require the last
-        // version to be sealed.
-        return std::any_of(columns_.begin(), columns_.end(),
-                           [&column_name](const Column& column) {
-                             return column.name == column_name &&
-                                    column.max_version == kInvalidVersion;
-                           });
-      }));
+  DCHECK(base::ranges::all_of(columns, [this](const std::string& column_name) {
+    // Check if there is any column with the required name which is also
+    // present in the latest version. Note that we don't require the last
+    // version to be sealed.
+    return base::ranges::any_of(columns_, [&column_name](const Column& col) {
+      return col.name == column_name && col.max_version == kInvalidVersion;
+    });
+  }));
   indices_.push_back({std::move(name), std::move(columns), sealed_version_ + 1,
                       kInvalidVersion});
 }
@@ -218,10 +215,8 @@
     return true;
 
   std::string constraints = ComputeConstraints(sealed_version_);
-  DCHECK(!constraints.empty() || std::any_of(columns_.begin(), columns_.end(),
-                                             [](const Column& column) {
-                                               return column.is_primary_key;
-                                             }));
+  DCHECK(!constraints.empty() ||
+         base::ranges::any_of(columns_, &Column::is_primary_key));
 
   std::string names;  // Names and types of the current columns.
   for (const Column& column : columns_) {
@@ -250,12 +245,10 @@
           : base::StringPrintf("CREATE TABLE %s (%s, %s)", table_name_.c_str(),
                                names.c_str(), constraints.c_str());
 
+  auto execute = [&db](const auto& sql) { return db->Execute(sql.c_str()); };
   sql::Transaction transaction(db);
-  return transaction.Begin() && db->Execute(create_table_statement.c_str()) &&
-         std::all_of(create_index_sqls.begin(), create_index_sqls.end(),
-                     [&db](const std::string& sql) {
-                       return db->Execute(sql.c_str());
-                     }) &&
+  return transaction.Begin() && execute(create_table_statement) &&
+         base::ranges::all_of(create_index_sqls, execute) &&
          transaction.Commit();
 }
 
@@ -436,17 +429,14 @@
   } else if (!names_of_new_columns_list.empty()) {
     // If no new table has been created, we need to add the new columns here if
     // any.
+    auto add_column = [this, &db](const auto& name) {
+      return db->Execute(
+          base::StrCat({"ALTER TABLE ", table_name_, " ADD COLUMN ", name})
+              .c_str());
+    };
     sql::Transaction transaction(db);
     if (!(transaction.Begin() &&
-          std::all_of(names_of_new_columns_list.begin(),
-                      names_of_new_columns_list.end(),
-                      [this, &db](const std::string& name) {
-                        return db->Execute(
-                            base::StringPrintf("ALTER TABLE %s ADD COLUMN %s",
-                                               table_name_.c_str(),
-                                               name.c_str())
-                                .c_str());
-                      }) &&
+          base::ranges::all_of(names_of_new_columns_list, add_column) &&
           transaction.Commit())) {
       return false;
     }
@@ -499,22 +489,16 @@
 }
 
 bool SQLTableBuilder::IsVersionLastAndSealed(unsigned version) const {
-  // Is |version| the last sealed one?
-  if (sealed_version_ != version)
-    return false;
-  // Is the current version the last sealed one? In other words, is there
-  // neither a column or index added past the sealed version (min_version >
-  // sealed) nor deleted one version after the sealed (max_version == sealed)?
-  return std::none_of(columns_.begin(), columns_.end(),
-                      [this](const Column& column) {
-                        return column.min_version > sealed_version_ ||
-                               column.max_version == sealed_version_;
-                      }) &&
-         std::none_of(indices_.begin(), indices_.end(),
-                      [this](const Index& index) {
-                        return index.min_version > sealed_version_ ||
-                               index.max_version == sealed_version_;
-                      });
+  // Is the current version the last sealed one? In other words, are all
+  // columns and indices added before the sealed version (min_version <= sealed)
+  // and not deleted in the sealed version (max_version != sealed)?
+  auto is_last_sealed = [this](const auto& column_or_index) {
+    return column_or_index.min_version <= sealed_version_ &&
+           column_or_index.max_version != sealed_version_;
+  };
+  return sealed_version_ == version &&
+         base::ranges::all_of(columns_, is_last_sealed) &&
+         base::ranges::all_of(indices_, is_last_sealed);
 }
 
 bool SQLTableBuilder::IsColumnInLastVersion(const Column& column) const {
diff --git a/components/password_manager/core/browser/votes_uploader.cc b/components/password_manager/core/browser/votes_uploader.cc
index 622c8a6..1c30e74 100644
--- a/components/password_manager/core/browser/votes_uploader.cc
+++ b/components/password_manager/core/browser/votes_uploader.cc
@@ -14,6 +14,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
 #include "base/rand_util.h"
+#include "base/ranges/algorithm.h"
 #include "base/strings/utf_string_conversions.h"
 #include "components/autofill/core/browser/autofill_download_manager.h"
 #include "components/autofill/core/browser/autofill_field.h"
@@ -656,8 +657,7 @@
   bool respond_randomly = base::RandGenerator(2);
   bool randomized_value_for_character_class =
       respond_randomly ? base::RandGenerator(2)
-                       : std::any_of(password_value.begin(),
-                                     password_value.end(), predicate);
+                       : base::ranges::any_of(password_value, predicate);
   form_structure->set_password_attributes_vote(std::make_pair(
       character_class_attribute, randomized_value_for_character_class));
 
diff --git a/components/password_manager/ios/password_form_helper.mm b/components/password_manager/ios/password_form_helper.mm
index f9d193e58..8ee85f5 100644
--- a/components/password_manager/ios/password_form_helper.mm
+++ b/components/password_manager/ios/password_form_helper.mm
@@ -183,8 +183,6 @@
   NSString* nsFormData = [NSString stringWithUTF8String:formData.c_str()];
   autofill::ExtractFormsData(nsFormData, false, base::string16(), pageURL,
                              pageURL.GetOrigin(), &forms);
-  UMA_HISTOGRAM_EXACT_LINEAR("PasswordManager.NumFormsExtractedIOS",
-                             forms.size(), 50);
   if (forms.size() != 1)
     return;
 
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb
index 93b90df..599c5e3 100644
--- a/components/policy/resources/policy_templates_de.xtb
+++ b/components/policy/resources/policy_templates_de.xtb
@@ -4670,17 +4670,6 @@
 
           Hinweis: Sofern konfiguriert, überschreibt "<ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />" diese Richtlinie.</translation>
 <translation id="7632724434767231364">Name der GSSAPI-Bibliothek</translation>
-<translation id="7642890175637942277">Standardmäßig werden die Nutzungsbedingungen bei der ersten Ausführung von CCT/PWA angezeigt. Wenn diese Richtlinie deaktiviert ist, wird das Dialogfeld mit den Nutzungsbedingungen weder bei der ersten Ausführung noch bei weiteren angezeigt. Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, wird das Dialogfeld mit den Nutzungsbedingungen bei der ersten Ausführung angezeigt. Beachten Sie Folgendes:
-
-     – Diese Richtlinie funktioniert nur bei vollständig verwalteten Android-Geräten, die von Unified Endpoint Management-Anbietern konfiguriert werden können.
-
-      – Wenn die Richtlinie deaktiviert ist, hat die BrowserSignin-Richtlinie keine Auswirkungen.
-
-      – Wenn die Richtlinie deaktiviert ist, werden keine Messwerte an den Server gesendet.
-
-      – Wenn die Richtlinie deaktiviert ist, sind die Browserfunktionen eingeschränkt.
-
-      – Wenn die Richtlinie deaktiviert ist, müssen Administratoren Endnutzer dieses Geräts darüber informieren.</translation>
 <translation id="7643883929273267746">Sichtbarkeit von Konten in <ph name="PRODUCT_NAME" /> einschränken</translation>
 <translation id="7648907905084499629">Verhalten "<ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" />" für alle Cookies auf allen Websites verwenden</translation>
 <translation id="7651739109954974365">Legt fest, ob Daten-Roaming für das Gerät aktiviert werden soll. Bei Einstellung auf "true" ist das Roaming erlaubt. Ist die Richtlinie nicht konfiguriert oder auf "false" gesetzt, ist kein Roaming verfügbar.</translation>
@@ -5714,7 +5703,6 @@
 
       Wenn die Richtlinie nicht festgelegt wird, wird angenommen, dass "<ph name="PRINTERS_ALLOW_ALL" />" ausgewählt ist.
       </translation>
-<translation id="9109086856618439290">Nutzungsbedingungen während der ersten Ausführung für CCT/PWA aktivieren</translation>
 <translation id="9112727953998243860">Unternehmensdrucker-Konfigurationsdatei</translation>
 <translation id="9116740039944096995">Liste der URL-Muster. Anfragen an private Netzwerke, die von unsicheren, von übereinstimmenden Quellen bereitgestellten Websites initiiert werden, sind zulässig.
 
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb
index 0fbe7dd..0300a44 100644
--- a/components/policy/resources/policy_templates_es-419.xtb
+++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -4682,17 +4682,6 @@
 
           Nota: Si se especifica <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />, anulará esta política.</translation>
 <translation id="7632724434767231364">Nombre de la biblioteca GSSAPI</translation>
-<translation id="7642890175637942277">De forma predeterminada, se muestran las Condiciones del Servicio cuando se ejecuta CCT/AWP por primera vez. Si inhabilitas esta política, no se mostrará el diálogo de las Condiciones del Servicio en la primera ejecución ni en las subsiguientes. Si la habilitas o no la estableces, se mostrará el diálogo de las Condiciones del Servicio en la primera ejecución. Ten en cuenta las siguientes salvedades:
-
-      - Esta política solo funciona en dispositivos Android completamente administrados que pueden ser configurados por proveedores de administración unificada de terminales (UEM).
-
-      - Si inhabilitas esta política, la política BrowserSignin no tendrá ningún efecto.
-
-      - Si inhabilitas esta política, no se enviarán métricas al servidor.
-
-      - Si inhabilitas esta política, las funciones del navegador estarán limitadas.
-
-      - Si inhabilitas esta política, los administradores deberán comunicárselo a los usuarios finales del dispositivo.</translation>
 <translation id="7643883929273267746">Restringir las cuentas visibles en <ph name="PRODUCT_NAME" /></translation>
 <translation id="7648907905084499629">Usar el atributo <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> para el comportamiento de las cookies en todos los sitios</translation>
 <translation id="7651739109954974365">Determina si la itinerancia de datos debe activarse en el dispositivo. Si el valor se establece en "true", se permite la itinerancia de datos. Si no se configura o si se establece en "false", la itinerancia de datos no estará disponible.</translation>
@@ -5753,7 +5742,6 @@
 
       Si no estableces esta política, se utilizará <ph name="PRINTERS_ALLOW_ALL" />.
       </translation>
-<translation id="9109086856618439290">Habilita las Condiciones del Servicio en la primera ejecución para CCT/AWP</translation>
 <translation id="9112727953998243860">Archivo de configuración de impresoras empresariales</translation>
 <translation id="9116740039944096995">Lista de patrones de URL. Se permiten las solicitudes de red privada enviadas desde sitios web no seguros publicados por orígenes que estén contemplados en los patrones especificados.
 
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb
index e5dd623a..1b88a2f 100644
--- a/components/policy/resources/policy_templates_es.xtb
+++ b/components/policy/resources/policy_templates_es.xtb
@@ -4713,17 +4713,6 @@
 
           Nota: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> anula esta política si se especifica la anterior.</translation>
 <translation id="7632724434767231364">Nombre de biblioteca GSSAPI</translation>
-<translation id="7642890175637942277">De forma predeterminada, se mostrarán los Términos del Servicio la primera vez que se ejecute CCT/PWA. Si se asigna el valor "Inhabilitada" a esta política, no se mostrará el cuadro de diálogo de Términos del Servicio la primera vez que se ejecute ni posteriormente. Si se le asigna el valor "Habilitada" o no se le asigna ninguno, se mostrará el cuadro de diálogo de Términos del Servicio la primera vez que se ejecute. A continuación se describen otras advertencias:
-
-      - Esta política solo funciona en dispositivos Android totalmente gestionados que puedan configurar los proveedores de Unified Endpoint Management (gestión unificada de terminales).
-
-      - Si se inhabilita esta política, la política BrowserSignin no tendrá ningún efecto.
-
-      - Si se inhabilita esta política, no se enviarán métricas al servidor.
-
-      - Si se inhabilita esta política, las funciones del navegador estarán limitadas.
-
-      - Si se inhabilita esta política, los administradores deberán comunicárselo a los usuarios finales del dispositivo.</translation>
 <translation id="7643883929273267746">Restringir cuentas que se muestran en <ph name="PRODUCT_NAME" /></translation>
 <translation id="7648907905084499629">Usar el comportamiento de cookies de <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> en todos los sitios web</translation>
 <translation id="7651739109954974365">Permite determinar la habilitación de la itinerancia de datos en el dispositivo. Si el valor se establece en "true", se permite la itinerancia de datos. Si no se configura o si el valor se establece en "false", la itinerancia de datos no estará disponible.</translation>
@@ -5768,7 +5757,6 @@
 
       Si no se establece esta política, se utiliza <ph name="PRINTERS_ALLOW_ALL" />.
       </translation>
-<translation id="9109086856618439290">Habilitar los Términos del Servicio cuando CCT/PWA se ejecute por primera vez</translation>
 <translation id="9112727953998243860">Archivo de configuración de las impresoras de empresa</translation>
 <translation id="9116740039944096995">Lista de patrones de URL. Se permiten las solicitudes de redes privadas iniciadas desde sitios web no seguros procedentes de orígenes incluidos en los patrones.
 
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb
index 4fdb5c3..b10176e 100644
--- a/components/policy/resources/policy_templates_fr.xtb
+++ b/components/policy/resources/policy_templates_fr.xtb
@@ -4698,17 +4698,6 @@
 
           Remarque : <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> remplace cette règle si l'ancienne est définie.</translation>
 <translation id="7632724434767231364">Nom de la bibliothèque GSSAPI</translation>
-<translation id="7642890175637942277">Par défaut, les conditions d'utilisation sont affichées la première fois que des onglets personnalisés Chrome et des progressive web apps sont exécutés. Si cette règle est désactivée, la boîte de dialogue des conditions d'utilisation ne s'affiche ni à la première exécution, ni lors des suivantes. Si cette règle est activée ou qu'elle n'est pas configurée, la boîte de dialogue des conditions d'utilisation s'affiche à la première exécution. Notez également les points suivants :
-
-      - Cette règle ne peut être appliquée que sur des appareils Android entièrement gérés qui peuvent être configurés par des fournisseurs UEM (Unified Endpoint Management, gestion unifiée des points de terminaison).
-
-      - Si cette règle est désactivée, la règle BrowserSignin n'a aucune incidence.
-
-      - Si cette règle est désactivée, les statistiques​ ne sont pas transmises au serveur.
-
-      - Si cette règle est désactivée, les fonctionnalités du navigateur sont limitées.
-
-      - Si cette règle est désactivée, les administrateurs doivent le signaler aux utilisateurs finaux de l'appareil.</translation>
 <translation id="7643883929273267746">Limiter les comptes visibles dans <ph name="PRODUCT_NAME" /></translation>
 <translation id="7648907905084499629">Utiliser le comportement <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> pour les cookies sur tous les sites</translation>
 <translation id="7651739109954974365">Détermine si l'itinérance des données doit être activée pour l'appareil. Si cette règle est définie sur "true", l'itinérance des données est autorisée. Si cette règle n'est pas configurée ou si elle est définie sur "false", l'itinérance des données n'est pas possible.</translation>
@@ -5750,7 +5739,6 @@
 
       Si cette règle n'est pas configurée, la règle <ph name="PRINTERS_ALLOW_ALL" /> s'applique.
       </translation>
-<translation id="9109086856618439290">Activer les conditions d'utilisation à la première exécution des onglets personnalisés Chrome et des progressive web apps</translation>
 <translation id="9112727953998243860">Fichier de configuration des imprimantes d'entreprise</translation>
 <translation id="9116740039944096995">Liste de formats d'URL. Les requêtes de réseaux privés initiées à partir de sites Web non sécurisés desservis par des URL qui figurent sur la liste sont autorisées.
 
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb
index ab55c7c..7382d1ba 100644
--- a/components/policy/resources/policy_templates_id.xtb
+++ b/components/policy/resources/policy_templates_id.xtb
@@ -4698,17 +4698,6 @@
 
           Catatan: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> akan mengganti kebijakan ini jika kebijakan tersebut ditentukan.</translation>
 <translation id="7632724434767231364">Nama pustaka GSSAPI</translation>
-<translation id="7642890175637942277">Secara default, Persyaratan Layanan akan ditampilkan saat CCT/PWA pertama kali dijalankan. Jika kebijakan ini disetel ke Nonaktif, dialog Persyaratan Layanan tidak akan muncul saat pengalaman pertama kali dijalankan atau dijalankan untuk selanjutnya. Jika kebijakan ini disetel ke Aktif atau tidak disetel, dialog Persyaratan Layanan akan muncul selama pengalaman pertama kali dijalankan. Peringatan lainnya:
-
-      - Kebijakan ini hanya berfungsi pada perangkat Android terkelola sepenuhnya yang dapat dikonfigurasikan oleh vendor Unified Endpoint Management.
-
-      - Jika kebijakan ini Dinonaktifkan, kebijakan BrowserSignin tidak akan berpengaruh.
-
-      - Jika kebijakan ini Dinonaktifkan, metrik​ tidak akan dikirim ke server.
-
-      - Jika kebijakan ini Dinonaktifkan, browser akan memiliki fungsi terbatas.
-
-      - Jika kebijakan ini Dinonaktifkan, admin harus memberitahukan hal ini kepada pengguna akhir perangkat.</translation>
 <translation id="7643883929273267746">Batasi akun yang terlihat di <ph name="PRODUCT_NAME" /></translation>
 <translation id="7648907905084499629">Gunakan perilaku <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> untuk cookie di semua situs</translation>
 <translation id="7651739109954974365">Menentukan apakah roaming data harus diaktifkan untuk perangkat. Jika disetel ke true, roaming data akan diizinkan. Jika dibiarkan tanpa konfigurasi atau disetel ke false, roaming data tidak akan tersedia.</translation>
@@ -5725,7 +5714,6 @@
 
       Jika kebijakan ini tidak disetel, <ph name="PRINTERS_ALLOW_ALL" /> akan diberlakukan.
       </translation>
-<translation id="9109086856618439290">Mengaktifkan ToS saat CCT/PWA pertama kali dijalankan</translation>
 <translation id="9112727953998243860">File konfigurasi untuk printer perusahaan</translation>
 <translation id="9116740039944096995">Daftar Pola URL. Permintaan jaringan pribadi yang dimulai dari situs tidak aman dan disalurkan oleh asal yang cocok akan diizinkan.
 
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb
index 149e570..3ca9fa64 100644
--- a/components/policy/resources/policy_templates_it.xtb
+++ b/components/policy/resources/policy_templates_it.xtb
@@ -4670,17 +4670,6 @@
 
           Nota: se specificato, <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> sostituisce questo criterio.</translation>
 <translation id="7632724434767231364">Nome della libreria GSSAPI</translation>
-<translation id="7642890175637942277">Per impostazione predefinita, vengono visualizzati i Termini di servizio alla prima esecuzione di CCT/PWA. Se questo criterio viene impostato su Disattivato, la finestra di dialogo dei Termini di servizio non viene visualizzata né alla prima esecuzione né a quelle successive. Se questo criterio viene impostato su Attivato o se non viene configurato, la finestra di dialogo dei Termini di servizio viene visualizzata alla prima esecuzione. Altre condizioni:
-
-      - Questo criterio funziona solo su dispositivi Android completamente gestiti che possono essere configurati da fornitori dell'Unified Endpoint Management.
-
-      - Se questo criterio viene impostato su Disattivato, il criterio BrowserSignin non ha effetto.
-
-      - Se questo criterio viene impostato su Disattivato, le metriche​ non vengono inviate al server.
-
-      - Se questo criterio viene impostato su Disattivato, il browser ha una funzionalità limitata.
-
-      - Se questo criterio viene impostato su Disattivato, gli amministratori devono comunicarlo agli utenti finali del dispositivo.</translation>
 <translation id="7643883929273267746">Limita gli account visibili in <ph name="PRODUCT_NAME" /></translation>
 <translation id="7648907905084499629">Usa il comportamento <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> per i cookie su tutti i siti</translation>
 <translation id="7651739109954974365">È possibile stabilire se attivare o meno il roaming dei dati per il dispositivo. Se la norma viene impostata su true, il roaming dei dati sarà consentito. Se non viene configurata o viene impostata su false, il roaming dei dati non sarà disponibile.</translation>
@@ -5702,7 +5691,6 @@
 
       Se questo criterio non viene impostato, viene utilizzata l'opzione <ph name="PRINTERS_ALLOW_ALL" />.
       </translation>
-<translation id="9109086856618439290">Attiva i TdS alla prima esecuzione di CCT/PWA</translation>
 <translation id="9112727953998243860">File di configurazione delle stampanti aziendali</translation>
 <translation id="9116740039944096995">Elenco di pattern URL. Le richieste di rete privata inoltrate da siti web non sicuri pubblicati dalle origini corrispondenti sono consentite.
 
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb
index b5ea7e0..9f47167 100644
--- a/components/policy/resources/policy_templates_ja.xtb
+++ b/components/policy/resources/policy_templates_ja.xtb
@@ -4615,17 +4615,6 @@
 
           注: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> が指定されている場合はこのポリシーより優先されます。</translation>
 <translation id="7632724434767231364">GSSAPI ライブラリ名</translation>
-<translation id="7642890175637942277">デフォルトでは、利用規約は CCT / PWA の初回実行時に表示されます。このポリシーを無効に設定した場合、利用規約のダイアログは初回実行時もその後の実行時にも表示されません。このポリシーを有効に設定するか未設定のままにした場合、利用規約のダイアログは初回実行時に表示されます。その他の注意事項:
-
-      - このポリシーは、統合エンドポイント管理ベンダーによる設定が可能な完全管理対象の Android デバイスのみに適用されます。
-
-      - このポリシーが無効の場合、BrowserSignin ポリシーは無視されます。
-
-      - このポリシーが無効の場合、指標はサーバーに送信されません。
-
-      - このポリシーが無効の場合、ブラウザの機能が制限されます。
-
-      - このポリシーが無効の場合、管理者はそのことをデバイスのエンドユーザーに知らせる必要があります。</translation>
 <translation id="7643883929273267746"><ph name="PRODUCT_NAME" /> に表示されるアカウントを制限する</translation>
 <translation id="7648907905084499629">すべてのサイトの Cookie に <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> 動作を使用する</translation>
 <translation id="7651739109954974365">データ ローミングをデバイスに対して有効にするかどうかを指定します。true に設定した場合、データ ローミングが許可されます。未設定または false に設定した場合、データ ローミングは利用できません。</translation>
@@ -5660,7 +5649,6 @@
 
       このポリシーを設定しない場合、<ph name="PRINTERS_ALLOW_ALL" /> を選択した場合と同じ動作になります。
       </translation>
-<translation id="9109086856618439290">CCT / PWA の初回実行時の利用規約を有効にする</translation>
 <translation id="9112727953998243860">企業プリンタの設定ファイル</translation>
 <translation id="9116740039944096995">URL パターンのリスト。安全でないウェブサイトのオリジンが、このリスト内のパターンの 1 つと一致する場合、そのウェブサイトからプライベート ネットワークへのリクエストは許可されます。
 
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb
index 693a6e4..5cb0578 100644
--- a/components/policy/resources/policy_templates_ko.xtb
+++ b/components/policy/resources/policy_templates_ko.xtb
@@ -4712,17 +4712,6 @@
 
           참고: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />이(가) 지정된 경우 이 정책을 재정의합니다.</translation>
 <translation id="7632724434767231364">GSSAPI 라이브러리 이름</translation>
-<translation id="7642890175637942277">CCT/PWA를 처음 실행할 때 서비스 약관이 기본으로 표시됩니다. 정책을 사용 안함으로 설정하면 첫 실행 환경 또는 이후 실행 중 서비스 약관 대화상자가 나타나지 않습니다. 정책을 사용으로 설정하거나 설정하지 않으면 첫 실행 환경에서 서비스 약관 대화상자가 나타납니다. 다른 주의사항은 다음과 같습니다.
-
-      - 이 정책은 Unified Endpoint Management 공급업체에서 구성할 수 있는 완전 관리형 Android 기기에서만 작동합니다.
-
-      - 정책을 사용 안함으로 설정하면 BrowserSignin 정책이 적용되지 않습니다.
-
-      - 정책을 사용 안함으로 설정하면 측정항목이​ 서버로 전송되지 않습니다.
-
-      - 정책을 사용 안함으로 설정하면 브라우저의 기능이 제한됩니다.
-
-      - 정책을 사용 안함으로 설정하면 관리자가 기기의 최종 사용자에게 이를 알려야 합니다.</translation>
 <translation id="7643883929273267746"><ph name="PRODUCT_NAME" />에 표시되는 계정 제한</translation>
 <translation id="7648907905084499629">모든 사이트에서 쿠키에 <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> 동작 사용</translation>
 <translation id="7651739109954974365">데이터 로밍을 기기에 사용할 지 여부를 결정합니다. true로 설정하면 데이터 로밍이 허용됩니다. 구성하지 않거나 false로 설정하면 데이터 로밍은 사용할 수 없습니다.</translation>
@@ -5774,7 +5763,6 @@
 
       정책을 설정하지 않으면 <ph name="PRINTERS_ALLOW_ALL" />이 기본적으로 사용됩니다.
       </translation>
-<translation id="9109086856618439290">첫 실행 중 CCT/PWA에 서비스 약관 사용 설정</translation>
 <translation id="9112727953998243860">엔터프라이즈 프린터 설정 파일</translation>
 <translation id="9116740039944096995">URL 패턴 목록입니다. 일치하는 원본에서 제공하는 안전하지 않은 웹사이트로부터의 비공개 네트워크 요청은 허용됩니다.
 
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb
index 994bcebd..9ea4507 100644
--- a/components/policy/resources/policy_templates_nl.xtb
+++ b/components/policy/resources/policy_templates_nl.xtb
@@ -4673,17 +4673,6 @@
 
           Opmerking: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> overschrijft dit beleid als het is opgegeven.</translation>
 <translation id="7632724434767231364">Naam van GSSAPI-bibliotheek</translation>
-<translation id="7642890175637942277">De servicevoorwaarden worden standaard weergegeven als CCT/PWA voor het eerst wordt uitgevoerd. Als je dit beleid uitschakelt, wordt het dialoogvenster met servicevoorwaarden niet weergegeven tijdens de eerste uitvoering of de daaropvolgende uitvoeringen. Als je dit beleid inschakelt of niet instelt, wordt het dialoogvenster met servicevoorwaarden weergegeven tijdens de eerste uitvoering. De andere voorbehouden zijn:
-
-      - Dit beleid werkt alleen op volledig beheerde Android-apparaten die kunnen worden geconfigureerd door leveranciers van Unified Endpoint Management.
-
-      - Als je dit beleid uitschakelt, heeft het beleid BrowserSignin geen effect.
-
-      - Als je dit beleid uitschakelt, worden er geen statistieken naar de server gestuurd.
-
-      - Als je dit beleid uitschakelt, beschikt de browser over beperkte functionaliteit.
-
-      - Als je dit beleid uitschakelt, moeten beheerders dit laten weten aan eindgebruikers van het apparaat.</translation>
 <translation id="7643883929273267746">Accounts die zichtbaar zijn in <ph name="PRODUCT_NAME" /> beperken</translation>
 <translation id="7648907905084499629">Gedrag van <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> voor cookies op alle sites gebruiken</translation>
 <translation id="7651739109954974365">Bepaalt of dataroaming moet worden ingeschakeld voor het apparaat. Als dit is ingesteld op 'true', wordt dataroaming toegestaan. Als de instelling niet wordt geconfigureerd of op 'false' is ingesteld, is dataroaming niet beschikbaar.</translation>
@@ -5723,7 +5712,6 @@
 
       Als dit beleid niet is ingesteld, wordt er uitgegaan van <ph name="PRINTERS_ALLOW_ALL" />.
       </translation>
-<translation id="9109086856618439290">Servicevoorwaarden inschakelen tijdens eerste uitvoering voor CCT/PWA</translation>
 <translation id="9112727953998243860">Configuratiebestand voor bedrijfsprinters</translation>
 <translation id="9116740039944096995">Lijst met URL-patronen. Privénetwerkverzoeken die worden gestart vanaf niet-beveiligde websites die worden geleverd via overeenkomende herkomsten, zijn toegestaan.
 
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb
index cffb9e9..9433f11 100644
--- a/components/policy/resources/policy_templates_pt-BR.xtb
+++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -4654,17 +4654,6 @@
 
           Observação: se <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> for especificada, ela substituirá esta política.</translation>
 <translation id="7632724434767231364">Nome da biblioteca GSSAPI</translation>
-<translation id="7642890175637942277">Por padrão, os Termos de Serviço são mostrados quando o CCT/PWA é executado pela primeira vez. Definir esta política como "Desativada" fará com que a caixa de diálogo de Termos de Serviço não apareça na primeira execução e nas execuções subsequentes. Definir a política como "Ativada" ou deixá-la sem definição fará com que a caixa de diálogo de Termos de Serviço apareça na primeira execução. As outras ressalvas são as seguintes:
-
-      - Esta política só funciona em dispositivos Android totalmente gerenciados que podem ser configurados por fornecedores de Unified Endpoint Management.
-
-      - Se esta política for desativada, a BrowserSignin não terá efeito.
-
-      - Se esta política for desativada, as métricas​ não serão enviadas para o servidor.
-
-      - Se esta política for desativada, o navegador terá funcionalidade limitada.
-
-      - Se esta política for desativada, os administradores precisarão informar isso para os usuários finais do dispositivo.</translation>
 <translation id="7643883929273267746">Contas restritas que estão visíveis no <ph name="PRODUCT_NAME" /></translation>
 <translation id="7648907905084499629">Use o comportamento <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> para cookies em todos os sites</translation>
 <translation id="7651739109954974365">Determina se o roaming de dados deve ser ativado para o dispositivo. Se configurado para true, o roaming de dados será permitido. Se não for configurado ou for configurado como false, o roaming de dados não estará disponível.</translation>
@@ -5703,7 +5692,6 @@
 
       Se esta política for deixada sem definição, <ph name="PRINTERS_ALLOW_ALL" /> será usada.
       </translation>
-<translation id="9109086856618439290">Ativar TOS durante a primeira execução do CCT/PWA</translation>
 <translation id="9112727953998243860">Arquivo de configuração de impressora corporativa</translation>
 <translation id="9116740039944096995">Lista de padrões de URL. São permitidas solicitações de redes privadas iniciadas por sites não seguros veiculados por origens correspondentes.
 
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb
index 2cd1447..de947f4 100644
--- a/components/policy/resources/policy_templates_ru.xtb
+++ b/components/policy/resources/policy_templates_ru.xtb
@@ -4678,17 +4678,6 @@
 
           Примечание. Если настроено правило <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />, его значение будет иметь приоритет над этим правилом.</translation>
 <translation id="7632724434767231364">название библиотеки GSSAPI</translation>
-<translation id="7642890175637942277">По умолчанию Условия использования показываются при первом запуске CCT или PWA. Если это правило отключено, диалоговое окно с Условиями использования не открывается ни при первом, ни при последующих запусках. Если это правило включено или не настроено, диалоговое окно с Условиями использования будет открываться при первом запуске. Также нужно учитывать следующее:
-
-      – Это правило работает только на полностью управляемых устройствах Android, которые могут быть настроены поставщиками архитектуры Unified Endpoint Management.
-
-      – Если это правило отключено, правило BrowserSignin не действует.
-
-      – Если это правило отключено, показатели на сервер не отправляются.
-
-      – Если это правило отключено, функциональность браузера будет ограничена.
-
-      – Если это правило отключено, администраторы должны уведомить об этом конечных пользователей устройства.</translation>
 <translation id="7643883929273267746">Ограничить число аккаунтов, которые видны в <ph name="PRODUCT_NAME" /></translation>
 <translation id="7648907905084499629">Использовать поведение <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> для файлов cookie на всех сайтах</translation>
 <translation id="7651739109954974365">Устанавливает возможность для роуминга данных для устройства. Если параметр задан, роуминг данных разрешен. Если нет (по умолчанию), роуминг данных будет недоступен.</translation>
@@ -5725,7 +5714,6 @@
 
       Если правило не настроено, используется параметр <ph name="PRINTERS_ALLOW_ALL" />.
       </translation>
-<translation id="9109086856618439290">Показ Условий использования при первом запуске для CCT и PWA</translation>
 <translation id="9112727953998243860">Файл конфигурации корпоративных принтеров</translation>
 <translation id="9116740039944096995">Список шаблонов URL. Допускаются запросы частной сети, отправленные с небезопасных сайтов, которые обслуживаются совпадающими источниками.
 
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb
index a157adc..63ab125 100644
--- a/components/policy/resources/policy_templates_th.xtb
+++ b/components/policy/resources/policy_templates_th.xtb
@@ -4651,17 +4651,6 @@
 
           หมายเหตุ: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> จะลบล้างนโยบายนี้หากระบุนโยบายเดิมไว้</translation>
 <translation id="7632724434767231364">ชื่อไลบรารี GSSAPI</translation>
-<translation id="7642890175637942277">โดยค่าเริ่มต้น ข้อกำหนดในการให้บริการจะแสดงเมื่อเรียกใช้ CCT/PWA ครั้งแรก การตั้งค่านโยบายเป็น "ปิดใช้" จะทำให้กล่องโต้ตอบข้อกำหนดในการให้บริการไม่แสดงขึ้นมาในระหว่างการเรียกใช้ครั้งแรกหรือการเรียกใช้ครั้งต่อๆ ไป การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้กล่องโต้ตอบข้อกำหนดในการให้บริการแสดงขึ้นมาในระหว่างการเรียกใช้ครั้งแรก ข้อสำคัญอื่นๆ ได้แก่
-
-      - นโยบายนี้จะใช้งานได้เฉพาะกับอุปกรณ์ Android ซึ่งมีการจัดการเต็มรูปแบบที่จะกำหนดค่าโดยผู้ให้บริการการจัดการปลายทางแบบรวม (Unified Endpoint Management) ได้
-
-      - หากตั้งค่านโยบายนี้เป็น "ปิดใช้" นโยบาย BrowserSignin จะไม่มีผล
-
-      - หากตั้งค่านโยบายนี้เป็น "ปิดใช้" ระบบจะไม่ส่งเมตริกต่างๆ ไปยังเซิร์ฟเวอร์
-
-      - หากตั้งค่านโยบายนี้เป็น "ปิดใช้" เบราว์เซอร์จะมีฟังก์ชันการทำงานที่จำกัด
-
-      - หากตั้งค่านโยบายนี้เป็น "ปิดใช้" ผู้ดูแลระบบต้องแจ้งข้อมูลนี้กับผู้ใช้ปลายทางของอุปกรณ์</translation>
 <translation id="7643883929273267746">จำกัดบัญชีที่แสดงอยู่ใน <ph name="PRODUCT_NAME" /></translation>
 <translation id="7648907905084499629">ใช้ลักษณะการทำงาน <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> สำหรับคุกกี้ในทุกเว็บไซต์</translation>
 <translation id="7651739109954974365">กำหนดว่าควรจะเปิดใช้งานการโรมมิ่งข้อมูลสำหรับอุปกรณ์หรือไม่ หากตั้งค่าเป็น "จริง" การโรมมิ่งข้อมูลจะได้รับอนุญาต หากไม่กำหนดค่าหรือตั้งค่าเป็น "เท็จ" จะไม่สามารถใช้การโรมมิ่งข้อมูลได้</translation>
@@ -5702,7 +5691,6 @@
 
       หากไม่ได้ตั้งค่านโยบายนี้ไว้ ระบบจะถือว่าเลือก <ph name="PRINTERS_ALLOW_ALL" /> ไว้
       </translation>
-<translation id="9109086856618439290">เปิดใช้ข้อกำหนดในการให้บริการเมื่อเรียกใช้ CCT/PWA ครั้งแรก</translation>
 <translation id="9112727953998243860">ไฟล์การกำหนดค่าเครื่องพิมพ์องค์กร</translation>
 <translation id="9116740039944096995">รายการรูปแบบ URL อนุญาตคำขอเครือข่ายส่วนตัวที่เริ่มต้นมาจากเว็บไซต์ที่ไม่ปลอดภัยที่แสดงโดยต้นทางที่ตรงกัน
 
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb
index 9da669f6..d6703858 100644
--- a/components/policy/resources/policy_templates_tr.xtb
+++ b/components/policy/resources/policy_templates_tr.xtb
@@ -4682,17 +4682,6 @@
 
           Not: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> belirtilmişse bu politikayı geçersiz kılar.</translation>
 <translation id="7632724434767231364">GSSAPI kitaplığı adı</translation>
-<translation id="7642890175637942277">Varsayılan olarak CCT/PWA ilk çalıştırıldığında Hizmet Şartları gösterilir. Bu politikayı Devre dışı değerine ayarlamak Hizmet Şartları iletişim kutusunun ilk çalıştırma deneyiminde veya sonraki çalıştırmalarda görünmemesine sebep olur. Bu politikayı Etkin değerine ayarlamak veya ayarlamadan bırakmak Hizmet Şartları iletişim kutusunun ilk çalıştırma deneyiminde görünmesini sağlar. Dikkat edilmesi gereken diğer noktalar:
-
-      - Bu politika Birleşik Uç Nokta Yönetimi tedarikçilerinin yapılandırabildiği, yalnızca tümüyle yönetilen Android cihazlarda çalışır.
-
-      - Bu politika Devre dışıysa BrowserSignin politikasının hiçbir etkisi olmaz.
-
-      - Bu politika Devre dışıysa metrikler sunucuya gönderilmez.
-
-      - Bu politika Devre dışıysa tarayıcının işlevi sınırlı olur.
-
-      - Bu politika Devre dışıysa yöneticiler bunu cihazın son kullanıcılarına belirtmelidir.</translation>
 <translation id="7643883929273267746"><ph name="PRODUCT_NAME" /> içinde görülebilen hesapları kısıtlama</translation>
 <translation id="7648907905084499629">Tüm sitelerde çerezler için <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> davranışını kullan</translation>
 <translation id="7651739109954974365">Veri dolaşımının etkin olup olmayacağını belirler. True olarak ayarlanırsa, veri dolaşımına izin verilir. Hiç ayarlanmazsa veya false değerine ayarlanırsa, veri dolaşımına izin verilmez.</translation>
@@ -5709,7 +5698,6 @@
 
       Bu politika ayarlanmazsa <ph name="PRINTERS_ALLOW_ALL" /> uygulanır.
       </translation>
-<translation id="9109086856618439290">CCT/PWA için ilk çalıştırma sırasında Hizmet Şartları'nı etkinleştirme</translation>
 <translation id="9112727953998243860">Kurumsal yazıcı yapılandırma dosyası</translation>
 <translation id="9116740039944096995">URL kalıpları listesi Eşleşen kaynaklar tarafından sunulan güvenli olmayan web sitelerinden başlatılan özel ağ isteklerine izin verilir.
 
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb
index b29c8a0..189f3d6 100644
--- a/components/policy/resources/policy_templates_uk.xtb
+++ b/components/policy/resources/policy_templates_uk.xtb
@@ -4701,17 +4701,6 @@
 
           Примітка: якщо вказано правило <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />, воно замінює це правило.</translation>
 <translation id="7632724434767231364">Назва бібліотеки GSSAPI</translation>
-<translation id="7642890175637942277">За умовчанням Умови використання відображаються під час першого запуску спеціальної вкладки Chrome або прогресивного веб-додатка. Якщо це правило деактивовано, вікно Умов використання не з'являтиметься під час першого й наступних запусків. Якщо це правило активовано або не налаштовано, вікно Умов використання з'являтиметься під час першого запуску. Інші попередження
-
-      - Це правило працює лише на повністю керованих пристроях Android, які можуть налаштовувати постачальники системи Unified Endpoint Management.
-
-      - Якщо це правило деактивовано, правило BrowserSignin не діятиме.
-
-      - Якщо це правило деактивовано, показники​ не надсилатимуться на сервер.
-
-      - Якщо це правило деактивовано, функції веб-переглядача буде обмежено.
-
-      - Адміністратори повинні повідомити кінцевих користувачів пристрою, якщо це правило деактивовано.</translation>
 <translation id="7643883929273267746">Обмежити видимість облікових записів у <ph name="PRODUCT_NAME" /></translation>
 <translation id="7648907905084499629">Застосовувати поведінку <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> для файлів cookie на всіх сайтах</translation>
 <translation id="7651739109954974365">Визначає, чи має бути ввімкнено роумінг даних для пристрою. Якщо значення правила встановлено як "true", роумінг даних дозволено. Якщо правило не налаштовано чи його значення встановлено як "false", роумінг даних буде недоступним.</translation>
@@ -5755,7 +5744,6 @@
 
       Якщо правило не налаштовано, застосовується значення <ph name="PRINTERS_ALLOW_ALL" />.
       </translation>
-<translation id="9109086856618439290">Увімкнути Умови використання під час першого запуску спеціальної вкладки Chrome або прогресивного веб-додатка</translation>
 <translation id="9112727953998243860">Файл конфігурації принтерів підприємства</translation>
 <translation id="9116740039944096995">Список шаблонів URL-адрес. Дозволено надсилати запити приватної мережі, ініційовані з незахищених веб-сайтів, які розміщуються джерелами, що відповідають переліченим шаблонам.
 
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb
index 2e9cd2a8..d407c809 100644
--- a/components/policy/resources/policy_templates_vi.xtb
+++ b/components/policy/resources/policy_templates_vi.xtb
@@ -4717,17 +4717,6 @@
 
           Lưu ý: <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" /> (nếu đã được chỉ định) sẽ ghi đè chính sách này.</translation>
 <translation id="7632724434767231364">Tên thư viện GSSAPI</translation>
-<translation id="7642890175637942277">Theo mặc định, Điều khoản dịch vụ sẽ hiển thị khi CCT/PWA được chạy lần đầu tiên. Nếu bạn đặt chính sách này thành Tắt, thì hộp thoại Điều khoản dịch vụ sẽ không xuất hiện trong lần chạy đầu tiên hoặc những lần chạy tiếp theo. Nếu bạn đặt thành Bật hoặc không đặt chính sách này, thì hộp thoại Điều khoản dịch vụ sẽ xuất hiện trong lần chạy đầu tiên. Các lưu ý khác:
-
-      – Chính sách này chỉ có trên những thiết bị Android được quản lý hoàn toàn. Những nhà cung cấp dịch vụ Quản lý điểm cuối hợp nhất có thể định cấu hình các thiết bị này.
-
-      – Nếu bạn đặt chính sách này thành Tắt, chính sách BrowserSignin sẽ không có hiệu lực.
-
-      – Nếu bạn đặt chính sách này thành Tắt, hệ thống sẽ không gửi các chỉ số​ tới máy chủ.
-
-      – Nếu bạn đặt chính sách này thành Tắt, chức năng của trình duyệt sẽ bị hạn chế.
-
-      – Nếu bạn đặt chính sách này thành Tắt, quản trị viên sẽ phải thông báo điều này cho người dùng cuối của thiết bị.</translation>
 <translation id="7643883929273267746">Hạn chế các tài khoản được hiển thị trong <ph name="PRODUCT_NAME" /></translation>
 <translation id="7648907905084499629">Dùng hành vi <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> cho các cookie trên tất cả các trang web</translation>
 <translation id="7651739109954974365">Xác định liệu chuyển vùng dữ liệu có được bật cho thiết bị hay không. Nếu được đặt thành đúng, chuyển vùng dữ liệu sẽ được phép. Nếu không được định cấu hình hoặc được đặt thành sai, chuyển vùng dữ liệu sẽ không khả dụng.</translation>
@@ -5776,7 +5765,6 @@
 
       Nếu bạn không đặt chính sách này, <ph name="PRINTERS_ALLOW_ALL" /> sẽ là tùy chọn mặc định.
       </translation>
-<translation id="9109086856618439290">Bật Điều khoản dịch vụ (ToS) trong lần chạy đầu tiên của CCT/PWA</translation>
 <translation id="9112727953998243860">Tệp cấu hình máy in dành cho doanh nghiệp</translation>
 <translation id="9116740039944096995">Danh sách mẫu URL. Cho phép thực hiện các yêu cầu mạng riêng từ những trang web không an toàn do các nguồn gốc trùng khớp phân phối.
 
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb
index 48873f5a..1aaef5b 100644
--- a/components/policy/resources/policy_templates_zh-CN.xtb
+++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -4639,17 +4639,6 @@
 
           注意:<ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />(若已指定)会覆盖此政策。</translation>
 <translation id="7632724434767231364">GSSAPI 库名称</translation>
-<translation id="7642890175637942277">默认情况下,当 CCT/PWA 首次运行时,系统会显示服务条款。如果此政策已停用,服务条款对话框在首次运行体验或后续运行期间就不会出现。如果此政策已启用或未设置,则服务器条款对话框会在首次运行体验期间出现。其他注意事项:
-
-      - 此政策仅适用于可由统一端点管理供应商配置的全代管式 Android 设备。
-
-      - 如果此政策已停用,BrowserSignin 政策则不会产生任何效力。
-
-      - 如果此政策已停用,系统不会将指标发送给服务器。
-
-      - 如果此政策已停用,浏览器的功能会受到限制。
-
-      - 如果此政策已停用,管理员必须告知设备的最终用户。</translation>
 <translation id="7643883929273267746">限制可在<ph name="PRODUCT_NAME" />中显示的帐号</translation>
 <translation id="7648907905084499629">让所有网站上的 Cookie 都采用 <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> 行为</translation>
 <translation id="7651739109954974365">确定是否应为设备启用数据漫游。如果将此政策设置为 true,数据漫游就可以使用。如果未配置此政策或将其设置为 false,数据漫游就无法使用。</translation>
@@ -5665,7 +5654,6 @@
 
       如果此政策未设置,系统将会默认使用 <ph name="PRINTERS_ALLOW_ALL" />。
       </translation>
-<translation id="9109086856618439290">CCT/PWA 首次运行期间启用服务条款</translation>
 <translation id="9112727953998243860">企业打印机配置文件</translation>
 <translation id="9116740039944096995">以列表形式指定一系列网址格式。允许匹配来源提供的不安全网站向专用网络发送请求。
 
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb
index 7331391..222dfc81 100644
--- a/components/policy/resources/policy_templates_zh-TW.xtb
+++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -4638,17 +4638,6 @@
 
           注意:如果指定 <ph name="DEVICE_LOGIN_SCREEN_LARGE_CURSOR_ENABLED" />,這項政策會遭到覆寫。</translation>
 <translation id="7632724434767231364">GSSAPI 資料庫名稱</translation>
-<translation id="7642890175637942277">根據預設,系統會在第一次執行 CCT/PWA 時顯示《服務條款》。如果將這項政策設為停用,系統不會在第一次或後續執行 CCT/PWA 時顯示《服務條款》對話方塊。如果將這項政策設為啟用或不設定,系統會在第一次執行 CCT/PWA 時顯示《服務條款》對話方塊。其他注意事項包含:
-
-      - 這項政策只適用於可由統一端點管理供應商所設定的全代管 Android 裝置。
-
-      - 如果停用這項政策,BrowserSignin 政策就不會有任何作用。
-
-      - 如果停用這項政策,系統不會將指標傳送至伺服器。
-
-      - 如果停用這項政策,瀏覽器的功能將受到限制。
-
-      - 如果停用這項政策,管理員必須告知裝置使用者。</translation>
 <translation id="7643883929273267746">限制在 <ph name="PRODUCT_NAME" /> 中顯示的帳戶</translation>
 <translation id="7648907905084499629">對所有網站上的 Cookie 使用 <ph name="FEATURE_NAME_SAMESITE_BY_DEFAULT_COOKIES" /> 行為</translation>
 <translation id="7651739109954974365">決定是否要為裝置啟用數據漫遊。如果設為 True,就會允許數據漫遊。如未設定或設為 False,就不支援數據漫遊。</translation>
@@ -5668,7 +5657,6 @@
 
       如果沒有設定這項政策,系統會自動採用 <ph name="PRINTERS_ALLOW_ALL" />。
       </translation>
-<translation id="9109086856618439290">在第一次執行 CCT/PWA 時啟用《服務條款》</translation>
 <translation id="9112727953998243860">企業印表機設定檔</translation>
 <translation id="9116740039944096995">網址模式清單。系統會允許相符來源提供的不安全網站所傳送的私人網路要求。
 
diff --git a/components/rlz/BUILD.gn b/components/rlz/BUILD.gn
index e153e14..7b9af2865 100644
--- a/components/rlz/BUILD.gn
+++ b/components/rlz/BUILD.gn
@@ -2,17 +2,35 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+# Reset sources_assignment_filter for the BUILD.gn file to prevent
+# regression during the migration of Chromium away from the feature.
+# See docs/no_sources_assignment_filter.md for more information.
+# TODO(crbug.com/1018739): remove this when migration is done.
+set_sources_assignment_filter([])
+
 static_library("rlz") {
   sources = [
     "rlz_tracker.cc",
     "rlz_tracker.h",
-    "rlz_tracker_chromeos.cc",
     "rlz_tracker_delegate.h",
-    "rlz_tracker_ios.cc",
-    "rlz_tracker_mac.cc",
-    "rlz_tracker_win.cc",
   ]
 
+  if (is_ios) {
+    sources += [ "rlz_tracker_ios.cc" ]
+  }
+
+  if (is_mac) {
+    sources += [ "rlz_tracker_mac.cc" ]
+  }
+
+  if (is_win) {
+    sources += [ "rlz_tracker_win.cc" ]
+  }
+
+  if (is_chromeos) {
+    sources += [ "rlz_tracker_chromeos.cc" ]
+  }
+
   deps = [
     "//base",
     "//components/google/core/common",
diff --git a/components/safe_browsing/core/db/v4_update_protocol_manager.cc b/components/safe_browsing/core/db/v4_update_protocol_manager.cc
index ca37287..0b81b261 100644
--- a/components/safe_browsing/core/db/v4_update_protocol_manager.cc
+++ b/components/safe_browsing/core/db/v4_update_protocol_manager.cc
@@ -13,6 +13,7 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/rand_util.h"
 #include "base/timer/timer.h"
+#include "build/build_config.h"
 #include "components/safe_browsing/buildflags.h"
 #include "components/safe_browsing/core/db/safebrowsing.pb.h"
 #include "components/safe_browsing/core/features.h"
@@ -76,6 +77,12 @@
 // Maximum time, in seconds, to wait for a response to an update request.
 static const int kV4TimerUpdateWaitSecMax = 15 * 60;  // 15 minutes
 
+#if defined(OS_IOS)
+// Maximum number of entries in each list, when the limited list size experiment
+// is enabled.
+static const int kMaximumEntriesPerList = 1 << 18;
+#endif
+
 ChromeClientInfo::SafeBrowsingReportingPopulation GetReportingLevelProtoValue(
     ExtendedReportingLevel reporting_level) {
   switch (reporting_level) {
@@ -242,6 +249,13 @@
     list_update_request->mutable_constraints()->add_supported_compressions(RAW);
     list_update_request->mutable_constraints()->add_supported_compressions(
         RICE);
+
+#if defined(OS_IOS)
+    if (base::FeatureList::IsEnabled(kLimitedListSizeForIOS)) {
+      list_update_request->mutable_constraints()->set_max_database_entries(
+          kMaximumEntriesPerList);
+    }
+#endif
   }
 
   if (!extended_reporting_level_callback_.is_null()) {
diff --git a/components/safe_browsing/core/features.cc b/components/safe_browsing/core/features.cc
index f85465b..3ff1185 100644
--- a/components/safe_browsing/core/features.cc
+++ b/components/safe_browsing/core/features.cc
@@ -62,6 +62,9 @@
 #endif
 };
 
+const base::Feature kLimitedListSizeForIOS{"SafeBrowsingLimitedListSizeForIOS",
+                                           base::FEATURE_DISABLED_BY_DEFAULT};
+
 const base::Feature kMalwareScanEnabled{"SafeBrowsingMalwareScanEnabled",
                                         base::FEATURE_DISABLED_BY_DEFAULT};
 
@@ -168,6 +171,7 @@
     {&kDelayedWarnings, true},
     {&kDownloadRequestWithToken, true},
     {&kEnhancedProtection, true},
+    {&kLimitedListSizeForIOS, true},
     {&kMalwareScanEnabled, true},
     {&kPasswordProtectionForSavedPasswords, true},
     {&kPasswordProtectionShowDomainsForSavedPasswords, true},
diff --git a/components/safe_browsing/core/features.h b/components/safe_browsing/core/features.h
index 3b0d584..dc5749c 100644
--- a/components/safe_browsing/core/features.h
+++ b/components/safe_browsing/core/features.h
@@ -49,6 +49,10 @@
 // Enable Chrome Safe Browsing enhanced protection.
 extern const base::Feature kEnhancedProtection;
 
+// Controls whether the limited list size experiment is enabled. This experiment
+// limits the number of entries stored in each Safe Browsing list.
+extern const base::Feature kLimitedListSizeForIOS;
+
 // Controls whether to do deep scanning for malware. If both this feature and
 // the enterprise policies are enabled, the downloaded and uploaded files are
 // sent for scanning.
diff --git a/components/signin/core/browser/signin_header_helper.cc b/components/signin/core/browser/signin_header_helper.cc
index 169f7b9..da3b486 100644
--- a/components/signin/core/browser/signin_header_helper.cc
+++ b/components/signin/core/browser/signin_header_helper.cc
@@ -27,13 +27,7 @@
 const char kDiceRequestHeader[] = "X-Chrome-ID-Consistency-Request";
 const char kDiceResponseHeader[] = "X-Chrome-ID-Consistency-Response";
 
-ManageAccountsParams::ManageAccountsParams()
-    : service_type(GAIA_SERVICE_TYPE_NONE),
-      email(""),
-      is_saml(false),
-      continue_url(""),
-      is_same_tab(false) {
-}
+ManageAccountsParams::ManageAccountsParams() = default;
 
 ManageAccountsParams::ManageAccountsParams(const ManageAccountsParams&) =
     default;
diff --git a/components/signin/core/browser/signin_header_helper.h b/components/signin/core/browser/signin_header_helper.h
index 3842a6a..35a4c0e 100644
--- a/components/signin/core/browser/signin_header_helper.h
+++ b/components/signin/core/browser/signin_header_helper.h
@@ -67,19 +67,19 @@
 // Struct describing the parameters received in the manage account header.
 struct ManageAccountsParams {
   // The requested service type such as "ADDSESSION".
-  GAIAServiceType service_type;
+  GAIAServiceType service_type = GAIA_SERVICE_TYPE_NONE;
   // The prefilled email.
   std::string email;
   // Whether |email| is a saml account.
-  bool is_saml;
+  bool is_saml = false;
   // The continue URL after the requested service is completed successfully.
   // Defaults to the current URL if empty.
   std::string continue_url;
   // Whether the continue URL should be loaded in the same tab.
-  bool is_same_tab;
+  bool is_same_tab = false;
 #if defined(OS_ANDROID) || defined(OS_IOS)
   // Whether to show consistency promo.
-  bool show_consistency_promo;
+  bool show_consistency_promo = false;
 #endif
 
   ManageAccountsParams();
diff --git a/components/signin/ios/browser/account_consistency_service_unittest.mm b/components/signin/ios/browser/account_consistency_service_unittest.mm
index ba57fbd..7c3b69f 100644
--- a/components/signin/ios/browser/account_consistency_service_unittest.mm
+++ b/components/signin/ios/browser/account_consistency_service_unittest.mm
@@ -473,13 +473,6 @@
 // signon realm returns with a X-Chrome-Manage-Accounts header with ADDSESSION
 // action.
 TEST_F(AccountConsistencyServiceTest, ChromeManageAccountsShowAddAccount) {
-#if !TARGET_IPHONE_SIMULATOR
-  // TODO(crbug.com/1126746): Test is failing on iOS 12 device.
-  if (!base::ios::IsRunningOnOrLater(13, 0, 0)) {
-    return;
-  }
-#endif
-
   id delegate =
       [OCMockObject mockForProtocol:@protocol(ManageAccountsDelegate)];
   [[delegate expect] onAddAccount];
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb
index b790af7bf..1f54c8a5 100644
--- a/components/strings/components_strings_ar.xtb
+++ b/components/strings/components_strings_ar.xtb
@@ -275,7 +275,7 @@
 <translation id="2003709556000175978">إعادة ضبط كلمة المرورالآن</translation>
 <translation id="2003775180883135320">عمل أربعة ثقوب بالأعلى</translation>
 <translation id="2025115093177348061">الواقع المعزّز</translation>
-<translation id="2025186561304664664">تم تعيين الخادم الوكيل على التهيئة التلقائية.</translation>
+<translation id="2025186561304664664">تم تعيين الخادم الوكيل على الإعداد التلقائي.</translation>
 <translation id="2032962459168915086"><ph name="BEGIN_LINK" />التحقق من الخادم الوكيل والجدار الناري<ph name="END_LINK" /></translation>
 <translation id="2042213636306070719">الدُرج 7</translation>
 <translation id="204357726431741734">‏يُرجى تسجيل الدخول لاستخدام كلمات المرور المحفوظة في حسابك على Google.</translation>
@@ -483,7 +483,7 @@
 <translation id="2934466151127459956">Government-Letter</translation>
 <translation id="2941952326391522266">هذا الخادم لم يتمكن من إثبات أن ذلك <ph name="DOMAIN" />؛ بل إنه شهادة أمان من <ph name="DOMAIN2" />. وربما سبب ذلك خطأ في التكوين أو مهاجمًا يعترض اتصالك.</translation>
 <translation id="2943895734390379394">وقت التحميل:</translation>
-<translation id="2948083400971632585">يمكنك إيقاف أي خوادم وكيلة تمت تهيئتها لاتصال من صفحة الإعدادات.</translation>
+<translation id="2948083400971632585">يمكنك إيقاف أي خوادم وكيلة تم إعدادها لاتصال من صفحة الإعدادات.</translation>
 <translation id="2951588413176968965">صندوق بريدي الإلكتروني</translation>
 <translation id="295526156371527179">تحذير: لم يتم دمج هذه السياسة كمعجم كما هو موضح بموجب السياسة؛ لأنها ليست معجمًا.</translation>
 <translation id="2955913368246107853">إغلاق شريط البحث</translation>
@@ -669,7 +669,7 @@
 <translation id="3712624925041724820">التراخيص مستنفذة</translation>
 <translation id="3714780639079136834">‏تشغيل بيانات شبكة الجوّال أو Wi-Fi</translation>
 <translation id="3715597595485130451">‏الاتصال بـ Wi-Fi</translation>
-<translation id="3717027428350673159"><ph name="BEGIN_LINK" />التحقق من تهيئة الخادم الوكيل والجدار الناري ونظام أسماء النطاقات<ph name="END_LINK" /></translation>
+<translation id="3717027428350673159"><ph name="BEGIN_LINK" />التحقق من إعداد الخادم الوكيل والجدار الناري ونظام أسماء النطاقات<ph name="END_LINK" /></translation>
 <translation id="372429172604983730">تتضمن التطبيقات التي يمكن أن تسبب ذلك الخطأ برنامج مكافحة الفيروسات والجدار الناري وبرنامج تصفية الويب أو برنامج الخادم الوكيل.</translation>
 <translation id="373042150751172459">‏B4 (مغلف)</translation>
 <translation id="3736520371357197498">إذا كنت على دراية بالمخاطر على أمنك، يمكنك <ph name="BEGIN_LINK" />زيارة هذا الموقع غير الآمن<ph name="END_LINK" /> قبل أن تتم إزالة البرامج الخطيرة.</translation>
@@ -744,7 +744,7 @@
 <translation id="4072486802667267160">حدث خطأ أثناء معالجة طلبك. يُرجى إعادة المحاولة.</translation>
 <translation id="4075732493274867456">لا يدعم كل من العميل والخادم مجموعة ترميز أو إصدار بروتوكول طبقة المقابس الآمنة الشائع.</translation>
 <translation id="4075941231477579656">رقم التعريف باللمس</translation>
-<translation id="4079302484614802869">‏تم تعيين تهيئة الخادم الوكيل لاستخدام عنوان URL نص برمجي ‎.pac وليس الخوادم الوكيلة الثابتة.</translation>
+<translation id="4079302484614802869">‏تم تعيين إعداد الخادم الوكيل لاستخدام عنوان URL نص برمجي ‎.pac وليس الخوادم الوكيلة الثابتة.</translation>
 <translation id="4082393374666368382">الإعدادات - الإدارة</translation>
 <translation id="4088981014127559358">‏طباعة جانب واحد image Y shift</translation>
 <translation id="4098354747657067197">أمامك موقع مخادع</translation>
@@ -776,7 +776,7 @@
 <translation id="4179515394835346607"><ph name="ROW_NAME" /> <ph name="ROW_CONTENT" /></translation>
 <translation id="4194250254487269611">يتعذّر حفظ بطاقتك الآن.</translation>
 <translation id="4196861286325780578">إ&amp;عادة النقل</translation>
-<translation id="4203896806696719780"><ph name="BEGIN_LINK" />التحقق من عمليات تهيئة الجدار الناري وبرامج مكافحة الفيروسات<ph name="END_LINK" /></translation>
+<translation id="4203896806696719780"><ph name="BEGIN_LINK" />التحقق من عمليات ضبط الجدار الناري وبرامج مكافحة الفيروسات<ph name="END_LINK" /></translation>
 <translation id="4209166701302774460">إن خادم <ph name="ORIGIN" /> الذي تنتقل إليه قد طلب تطبيق
     سياسة المصدر على جميع الطلبات المقدَّمة إليه، ولكن تعذّر الآن
     عرض سياسة، مما يمنع المتصفِّح من إكمال طلبك
@@ -1514,7 +1514,7 @@
 <translation id="7243010569062352439"><ph name="PASSWORDS" />، <ph name="SIGNIN_DATA" /></translation>
 <translation id="724691107663265825">يحتوي الموقع الإلكتروني المقصود على برامج ضارة</translation>
 <translation id="724975217298816891">‏أدخل تاريخ انتهاء الصلاحية ورمز التحقق من البطاقة (CVC) لـ <ph name="CREDIT_CARD" /> لتحديث تفاصيل بطاقتك. بعد تأكيدك، ستتم مشاركة تفاصيل بطاقتك مع هذا الموقع.</translation>
-<translation id="7251437084390964440">‏لا تتوافق تهيئة الشبكة مع معيار ONC. وقد لا تُستورَد أجزاء من التهيئة.
+<translation id="7251437084390964440">‏لا تتوافق إعداد الشبكة مع معيار ONC. وقد لا تُستورَد أجزاء من التهيئة.
 التفاصيل الإضافية:
 <ph name="DEBUG_INFO" /></translation>
 <translation id="725866823122871198">تعذر إنشاء اتصال خاص بـ <ph name="BEGIN_BOLD" /><ph name="DOMAIN" /><ph name="END_BOLD" /> نظرًا لأن التاريخ والوقت لجهاز الكمبيوتر (<ph name="DATE_AND_TIME" />) غير صحيحين.</translation>
@@ -1726,7 +1726,7 @@
 <translation id="8041089156583427627">إرسال تعليقات</translation>
 <translation id="8041940743680923270">استخدام الإعداد التلقائي العمومي (طلب)</translation>
 <translation id="8042918947222776840">اختيار طريقة الاستلام من المستخدم</translation>
-<translation id="8057711352706143257">لم تتم تهيئة "<ph name="SOFTWARE_NAME" />" بشكل صحيح. يؤدي عادةً إلغاء تثبيت "<ph name="SOFTWARE_NAME" />" إلى إصلاح المشكلة. <ph name="FURTHER_EXPLANATION" /></translation>
+<translation id="8057711352706143257">لم يتم إعداد "<ph name="SOFTWARE_NAME" />" بشكل صحيح. يؤدي عادةً إلغاء تثبيت "<ph name="SOFTWARE_NAME" />" إلى إصلاح المشكلة. <ph name="FURTHER_EXPLANATION" /></translation>
 <translation id="8066955247577885446">عذرًا، حدث خطأ.</translation>
 <translation id="8067872629359326442">‏لقد أدخلت للتو كلمة مرورك في موقع إلكتروني مريب. يمكن لـ Chromium مساعدتك. لتغيير كلمة مرورك وإشعار Google أن حسابك قد يكون معرّضًا للخطر، انقر على "حماية الحساب".</translation>
 <translation id="8074253406171541171">‏10x13 (مغلف)</translation>
@@ -1811,7 +1811,7 @@
 <translation id="8381674639488873545">قد يتم تحصيل هذه الرسوم لمرة واحدة أو بشكل متكرِّر، وقد تكون غير واضحة. <ph name="BEGIN_LINK" />عرض على أي حال<ph name="END_LINK" /></translation>
 <translation id="8412145213513410671">الأعطال (<ph name="CRASH_COUNT" />)</translation>
 <translation id="8412392972487953978">يجب إدخال عبارة المرور نفسها مرتين.</translation>
-<translation id="8416694386774425977">تهيئة الشبكة غير صالحة ويتعذّر استيرادها.
+<translation id="8416694386774425977">إعداد الشبكة غير صالحة ويتعذّر استيرادها.
 التفاصيل الإضافية:
 <ph name="DEBUG_INFO" /></translation>
 <translation id="8424582179843326029"><ph name="FIRST_LABEL" /> <ph name="SECOND_LABEL" /> <ph name="THIRD_LABEL" /></translation>
diff --git a/components/translate/core/browser/translate_manager.cc b/components/translate/core/browser/translate_manager.cc
index c896f45..0951ce7 100644
--- a/components/translate/core/browser/translate_manager.cc
+++ b/components/translate/core/browser/translate_manager.cc
@@ -200,9 +200,6 @@
 
   std::unique_ptr<TranslatePrefs> translate_prefs(
       translate_client_->GetTranslatePrefs());
-  if (!translate_prefs->IsTranslateAllowedByPolicy())
-    return false;
-  
   const std::string target_lang = GetManualTargetLanguage(
       TranslateDownloadManager::GetLanguageCode(source_language),
       language_state_, translate_prefs.get(), language_model_);
@@ -212,13 +209,7 @@
   return true;
 }
 
-void TranslateManager::InitiateManualTranslation(bool auto_translate,
-                                                 bool triggered_from_menu) {
-  // If a translation has already been triggered, do nothing.
-  if (language_state_.IsPageTranslated() ||
-      language_state_.translation_pending())
-    return;
-
+void TranslateManager::InitiateManualTranslation(bool auto_translate) {
   std::unique_ptr<TranslatePrefs> translate_prefs(
       translate_client_->GetTranslatePrefs());
   const std::string source_code = TranslateDownloadManager::GetLanguageCode(
@@ -230,8 +221,8 @@
 
   // Translate the page if it has not been translated and manual translate
   // should trigger translation automatically. Otherwise, only show the infobar.
-  if (auto_translate) {
-    TranslatePage(source_code, target_lang, triggered_from_menu);
+  if (!language_state_.IsPageTranslated() && auto_translate) {
+    TranslatePage(source_code, target_lang, false);
     return;
   }
 
diff --git a/components/translate/core/browser/translate_manager.h b/components/translate/core/browser/translate_manager.h
index 4af8de5..f9ee5c1 100644
--- a/components/translate/core/browser/translate_manager.h
+++ b/components/translate/core/browser/translate_manager.h
@@ -120,8 +120,7 @@
   // Initiate a manually triggered translation process for the current page.
   // Collect source and target languages, and show translation UI. If
   // |auto_translate| is true the page gets translated to the target language.
-  void InitiateManualTranslation(bool auto_translate = false,
-                                 bool triggered_from_menu = false);
+  void InitiateManualTranslation(bool auto_translate = false);
 
   // Returns true iff the current page could be manually translated.
   bool CanManuallyTranslate();
diff --git a/components/viz/service/display/surface_aggregator.h b/components/viz/service/display/surface_aggregator.h
index 70733b8..482f0df 100644
--- a/components/viz/service/display/surface_aggregator.h
+++ b/components/viz/service/display/surface_aggregator.h
@@ -414,11 +414,11 @@
 
   // True if the frame that's currently being aggregated has copy requests.
   // This is valid during Aggregate after PrewalkTree is called.
-  bool has_copy_requests_;
+  bool has_copy_requests_ = false;
 
   // True if the frame that's currently being aggregated has cached render
   // passes. This is valid during Aggregate after PrewalkTree is called.
-  bool has_cached_render_passes_;
+  bool has_cached_render_passes_ = false;
 
   // True if any RenderPasses in the aggregated frame have a backdrop filter
   // that moves pixels. This is valid during Aggregate after PrewalkTree is
diff --git a/content/browser/accessibility/accessibility_tree_formatter_auralinux.cc b/content/browser/accessibility/accessibility_tree_formatter_auralinux.cc
index 86fd58df..08db65b 100644
--- a/content/browser/accessibility/accessibility_tree_formatter_auralinux.cc
+++ b/content/browser/accessibility/accessibility_tree_formatter_auralinux.cc
@@ -22,6 +22,13 @@
 #include "content/browser/accessibility/browser_accessibility_auralinux.h"
 #include "ui/accessibility/platform/ax_platform_node_auralinux.h"
 
+#define CHECK_ATSPI_ERROR(error)  \
+  if (error) {                    \
+    LOG(ERROR) << error->message; \
+    g_clear_error(&error);        \
+    return nullptr;               \
+  }
+
 namespace content {
 
 class AccessibilityTreeFormatterAuraLinux
@@ -95,21 +102,13 @@
 
   GError* error = nullptr;
   int child_count = atspi_accessible_get_child_count(desktop, &error);
-  if (error) {
-    LOG(ERROR) << "Failed to get children of root accessible object"
-               << error->message;
-    g_clear_error(&error);
-    return nullptr;
-  }
+  CHECK_ATSPI_ERROR(error)
 
   std::vector<std::pair<std::string, AtspiAccessible*>> matched_children;
   for (int i = 0; i < child_count; i++) {
     AtspiAccessible* child =
         atspi_accessible_get_child_at_index(desktop, i, &error);
-    if (error) {
-      g_clear_error(&error);
-      continue;
-    }
+    CHECK_ATSPI_ERROR(error)
 
     char* name = atspi_accessible_get_name(child, &error);
     if (!error && name && base::MatchPattern(name, pattern)) {
@@ -153,9 +152,29 @@
 
 std::unique_ptr<base::DictionaryValue>
 AccessibilityTreeFormatterAuraLinux::BuildAccessibilityTreeForWindow(
-    gfx::AcceleratedWidget window) {
-  LOG(ERROR) << "Aura Linux does not yet support building trees for window ids";
-  NOTIMPLEMENTED();
+    gfx::AcceleratedWidget pid) {
+  AtspiAccessible* desktop = atspi_get_desktop(0);
+  CHECK(desktop);
+
+  GError* error = nullptr;
+  int child_count = atspi_accessible_get_child_count(desktop, &error);
+  CHECK_ATSPI_ERROR(error)
+
+  for (int i = 0; i < child_count; i++) {
+    AtspiAccessible* child =
+        atspi_accessible_get_child_at_index(desktop, i, &error);
+    CHECK_ATSPI_ERROR(error)
+
+    uint application_pid = atspi_accessible_get_process_id(child, &error);
+    CHECK_ATSPI_ERROR(error)
+
+    if (pid == application_pid) {
+      auto dictionary_value = std::make_unique<base::DictionaryValue>();
+      RecursiveBuildAccessibilityTree(child, dictionary_value.get());
+      return dictionary_value;
+    }
+  }
+
   return nullptr;
 }
 
diff --git a/content/browser/back_forward_cache_browsertest.cc b/content/browser/back_forward_cache_browsertest.cc
index 82e8bfc..8247a21 100644
--- a/content/browser/back_forward_cache_browsertest.cc
+++ b/content/browser/back_forward_cache_browsertest.cc
@@ -5426,7 +5426,7 @@
   double duration1 = EvalJs(rfh_a, "timeOnFrozen;").ExtractDouble();
   double duration2 = EvalJs(rfh_a, "video.currentTime;").ExtractDouble();
   EXPECT_LE(0.0, duration2 - duration1);
-  EXPECT_GT(0.01, duration2 - duration1);
+  EXPECT_GT(0.02, duration2 - duration1);
 
   // Resume the media.
   EXPECT_TRUE(ExecJs(rfh_a, "video.play();"));
diff --git a/content/browser/navigation_mhtml_browsertest.cc b/content/browser/navigation_mhtml_browsertest.cc
index 3cbe1b5..0493aa29 100644
--- a/content/browser/navigation_mhtml_browsertest.cc
+++ b/content/browser/navigation_mhtml_browsertest.cc
@@ -589,8 +589,7 @@
   EXPECT_TRUE(main_frame_host()->is_mhtml_document());
   EXPECT_TRUE(NavigateToURL(
       shell(), GURL(main_frame_host()->GetLastCommittedURL().spec() + "#foo")));
-  // TODO(https://crbug.com/1126391): This should be true instead.
-  EXPECT_FALSE(main_frame_host()->is_mhtml_document());
+  EXPECT_TRUE(main_frame_host()->is_mhtml_document());
 }
 
 // Check RenderFrameHostImpl::is_mhtml_document() is correctly set for history
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc
index 6bdd9cb..d50253c 100644
--- a/content/browser/renderer_host/navigation_controller_impl.cc
+++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -1203,11 +1203,6 @@
   // the entry.
   active_entry->ResetForCommit(frame_entry);
 
-  // It is possible that we are re-using this entry and it was marked to be
-  // skipped on back/forward UI in its previous navigation. Reset it here so
-  // that it is set afresh, if applicable, for this navigation.
-  active_entry->set_should_skip_on_back_forward_ui(false);
-
   // The active entry's SiteInstance should match our SiteInstance.
   // TODO(creis): This check won't pass for subframes until we create entries
   // for subframe navigations.
@@ -1575,7 +1570,7 @@
   }
 
   SetShouldSkipOnBackForwardUIIfNeeded(
-      rfh, replace_entry, previous_document_was_activated,
+      replace_entry, previous_document_was_activated,
       request->IsRendererInitiated(), request->GetPreviousPageUkmSourceId());
 
   InsertOrReplaceEntry(std::move(new_entry), replace_entry,
@@ -1865,7 +1860,7 @@
           delegate_->GetFrameTree()->root());
 
   SetShouldSkipOnBackForwardUIIfNeeded(
-      rfh, replace_entry, previous_document_was_activated,
+      replace_entry, previous_document_was_activated,
       request->IsRendererInitiated(), request->GetPreviousPageUkmSourceId());
 
   // TODO(creis): Update this to add the frame_entry if we can't find the one
@@ -2222,10 +2217,6 @@
   if (!last_committed_entry)
     return;
 
-  // |last_committed_entry| should not be skippable because it is the current
-  // entry and in case the skippable bit was earlier set then on re-navigation
-  // it would have been reset.
-  DCHECK(!last_committed_entry->should_skip_on_back_forward_ui());
   SetSkippableForSameDocumentEntries(GetLastCommittedEntryIndex(), false);
 }
 
@@ -3667,7 +3658,6 @@
 
 // History manipulation intervention:
 void NavigationControllerImpl::SetShouldSkipOnBackForwardUIIfNeeded(
-    RenderFrameHostImpl* rfh,
     bool replace_entry,
     bool previous_document_was_activated,
     bool is_renderer_initiated,
@@ -3678,8 +3668,13 @@
   if (replace_entry || previous_document_was_activated ||
       !is_renderer_initiated) {
     if (last_committed_entry_index_ != -1) {
+      // This histogram always counts when navigating away from an entry,
+      // irrespective of whether the skippable flag was changed or not, and
+      // whether this entry is being reused or not.
       UMA_HISTOGRAM_BOOLEAN(
-          "Navigation.BackForward.SetShouldSkipOnBackForwardUI", false);
+          "Navigation.BackForward.SetShouldSkipOnBackForwardUI",
+          GetEntryAtIndex(last_committed_entry_index_)
+              ->should_skip_on_back_forward_ui());
     }
     return;
   }
diff --git a/content/browser/renderer_host/navigation_controller_impl.h b/content/browser/renderer_host/navigation_controller_impl.h
index 210309d..ee05de0 100644
--- a/content/browser/renderer_host/navigation_controller_impl.h
+++ b/content/browser/renderer_host/navigation_controller_impl.h
@@ -576,7 +576,6 @@
   // inserted in |entries_| to make sure UKM reports the URL of the document
   // adding the entry.
   void SetShouldSkipOnBackForwardUIIfNeeded(
-      RenderFrameHostImpl* rfh,
       bool replace_entry,
       bool previous_document_was_activated,
       bool is_renderer_initiated,
diff --git a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
index 7b2e538..97aeba4b 100644
--- a/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
+++ b/content/browser/renderer_host/navigation_controller_impl_browsertest.cc
@@ -9288,10 +9288,11 @@
                                1);
 }
 
-// Tests that if an entry is marked as skippable, it will be reset if there is a
-// navigation to this entry again. This does not need the feature to be enabled.
+// Tests that if an entry is marked as skippable, it will not be reset if there
+// is a navigation to this entry again (crbug.com/112129). This does not need
+// the feature to be enabled.
 IN_PROC_BROWSER_TEST_P(NavigationControllerDisableHistoryIntervention,
-                       ResetSkipOnBackForward) {
+                       DoNotResetSkipOnBackForward) {
   base::HistogramTester histograms;
   GURL main_url(embedded_test_server()->GetURL("/frame_tree/top.html"));
 
@@ -9327,15 +9328,60 @@
   controller.GoToIndex(0);
   back_nav_load_observer.Wait();
 
-  // Going back again to an entry should reset its skippable flag.
-  EXPECT_FALSE(controller.GetEntryAtIndex(0)->should_skip_on_back_forward_ui());
+  // Going back again to an entry should not reset its skippable flag.
+  EXPECT_TRUE(controller.GetEntryAtIndex(0)->should_skip_on_back_forward_ui());
 
   // Navigating away from this with a browser initiated navigation should log a
-  // histogram with skippable as false.
+  // histogram with skippable as true.
   GURL url1(embedded_test_server()->GetURL("/title2.html"));
   EXPECT_TRUE(NavigateToURL(shell(), url1));
   histograms.ExpectBucketCount(
-      "Navigation.BackForward.SetShouldSkipOnBackForwardUI", false, 1);
+      "Navigation.BackForward.SetShouldSkipOnBackForwardUI", true, 2);
+}
+
+// Tests that if an entry is marked as skippable, it will not be reset if there
+// is a navigation to this entry again (crbug.com/112129) using history.back/
+// forward. This does not need the feature to be enabled.
+IN_PROC_BROWSER_TEST_P(NavigationControllerDisableHistoryIntervention,
+                       DoNotResetSkipOnHistoryBackAPI) {
+  base::HistogramTester histograms;
+  GURL main_url(embedded_test_server()->GetURL("/frame_tree/top.html"));
+
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  // It is safe to obtain the root frame tree node here, as it doesn't change.
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetFrameTree()
+                            ->root();
+
+  EXPECT_FALSE(root->HasStickyUserActivation());
+  EXPECT_FALSE(root->HasTransientUserActivation());
+
+  // Navigate to a new same-site document from the renderer without a user
+  // gesture.
+  GURL url(embedded_test_server()->GetURL("/title1.html"));
+  EXPECT_TRUE(NavigateToURLFromRendererWithoutUserGesture(shell(), url));
+
+  NavigationControllerImpl& controller = static_cast<NavigationControllerImpl&>(
+      shell()->web_contents()->GetController());
+  EXPECT_EQ(1, controller.GetCurrentEntryIndex());
+  EXPECT_EQ(1, controller.GetLastCommittedEntryIndex());
+
+  // Last entry should have been marked as skippable.
+  EXPECT_TRUE(controller.GetEntryAtIndex(0)->should_skip_on_back_forward_ui());
+  EXPECT_FALSE(
+      controller.GetLastCommittedEntry()->should_skip_on_back_forward_ui());
+  histograms.ExpectBucketCount(
+      "Navigation.BackForward.SetShouldSkipOnBackForwardUI", true, 1);
+
+  // Go back to the last entry using history.back.
+  EXPECT_TRUE(ExecuteScriptWithoutUserGesture(shell(), "history.back();"));
+  EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
+
+  // Going back again to an entry should not reset its skippable flag.
+  EXPECT_TRUE(
+      controller.GetLastCommittedEntry()->should_skip_on_back_forward_ui());
+  EXPECT_EQ(0, controller.GetLastCommittedEntryIndex());
 }
 
 // Tests that if a navigation entry is marked as skippable due to pushState then
@@ -9412,11 +9458,12 @@
   EXPECT_EQ(push_state_url1, controller.GetLastCommittedEntry()->GetURL());
 
   // We now have (Before user gesture)
-  // [skippable_url(skip), redirected_url(skip), push_state_url1*,
+  // [skippable_url(skip), redirected_url(skip), push_state_url1(skip)*,
   // push_state_url2(skip), push_state_url3]
+  // Note the entry at index 2 retains its skippable flag.
   EXPECT_TRUE(controller.GetEntryAtIndex(0)->should_skip_on_back_forward_ui());
   EXPECT_TRUE(controller.GetEntryAtIndex(1)->should_skip_on_back_forward_ui());
-  EXPECT_FALSE(controller.GetEntryAtIndex(2)->should_skip_on_back_forward_ui());
+  EXPECT_TRUE(controller.GetEntryAtIndex(2)->should_skip_on_back_forward_ui());
   EXPECT_TRUE(controller.GetEntryAtIndex(3)->should_skip_on_back_forward_ui());
   EXPECT_FALSE(controller.GetEntryAtIndex(4)->should_skip_on_back_forward_ui());
 
diff --git a/content/browser/renderer_host/navigation_controller_impl_unittest.cc b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
index 6a909aa2..5e31dca 100644
--- a/content/browser/renderer_host/navigation_controller_impl_unittest.cc
+++ b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
@@ -1600,6 +1600,12 @@
   EXPECT_EQ(1U, navigation_entry_committed_counter_);
   navigation_entry_committed_counter_ = 0;
 
+  // Simulate a user gesture so that the above entry is not marked to be skipped
+  // on back.
+  main_test_rfh()->frame_tree_node()->UpdateUserActivationState(
+      blink::mojom::UserActivationUpdateType::kNotifyActivation,
+      blink::mojom::UserActivationNotificationType::kTest);
+
   auto forward_navigation =
       NavigationSimulator::CreateHistoryNavigation(1, contents());
   forward_navigation->Start();
@@ -1663,6 +1669,12 @@
   EXPECT_EQ(1U, navigation_entry_committed_counter_);
   navigation_entry_committed_counter_ = 0;
 
+  // Simulate a user gesture so that the above entry is not marked to be skipped
+  // on back.
+  main_test_rfh()->frame_tree_node()->UpdateUserActivationState(
+      blink::mojom::UserActivationUpdateType::kNotifyActivation,
+      blink::mojom::UserActivationNotificationType::kTest);
+
   auto forward_navigation =
       NavigationSimulator::CreateHistoryNavigation(1, contents());
   forward_navigation->Start();
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index be8c261..95637432d 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -8311,17 +8311,6 @@
   if (!is_same_document_navigation)
     UpdateRenderProcessHostFramePriorities();
 
-  // Set the state whether this navigation is to an MHTML document, since there
-  // are certain security checks that we cannot apply to subframes in MHTML
-  // documents. Do not trust renderer data when determining that, rather use
-  // the |navigation_request|, which was generated and stays browser side.
-  //
-  // TODO(arthursonzogni): Updating this flag for same-document or bfcache
-  // navigation is NOT correct. This should be moved to DidCommitNewDocument().
-  is_mhtml_document_ =
-      (navigation_request->GetMimeType() == "multipart/related" ||
-       navigation_request->GetMimeType() == "message/rfc822");
-
   // TODO(arthursonzogni): Updating this flag for same-document or bfcache
   // navigation might not be right. Should this be moved to
   // DidCommitNewDocument()?
@@ -8482,6 +8471,14 @@
         base::BindOnce(&RenderFrameHostImpl::BindReportingObserver,
                        weak_ptr_factory_.GetWeakPtr(), std::move(receiver)));
   }
+
+  // Set the state whether this navigation is to an MHTML document, since there
+  // are certain security checks that we cannot apply to subframes in MHTML
+  // documents. Do not trust renderer data when determining that, rather use
+  // the |navigation_request|, which was generated and stays browser side.
+  is_mhtml_document_ =
+      navigation_request->GetMimeType() == "multipart/related" ||
+      navigation_request->GetMimeType() == "message/rfc822";
 }
 
 void RenderFrameHostImpl::OnSameDocumentCommitProcessed(
diff --git a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
index 24cc0f5..9b1c9de 100644
--- a/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
+++ b/content/browser/renderer_host/render_frame_host_impl_browsertest.cc
@@ -83,9 +83,10 @@
 #endif  // defined(OS_ANDROID)
 
 namespace content {
-
 namespace {
 
+using ::testing::EndsWith;
+
 // Implementation of ContentBrowserClient that overrides
 // OverridePageVisibilityState() and allows consumers to set a value.
 class PrerenderTestContentBrowserClient : public TestContentBrowserClient {
@@ -3888,6 +3889,40 @@
   }
 }
 
+// This test verifies that when the right feature is enabled, iframe requests:
+//  - from an insecure page with the "treat-as-public-address" CSP directive
+//  - to a local IP address
+// are blocked.
+IN_PROC_BROWSER_TEST_F(
+    RenderFrameHostImplBrowserTestWithInsecurePrivateNetworkRequestsBlocked,
+    IframeFromInsecureTreatAsPublicToLocalIsBlocked) {
+  // Unfortunately for us, http://localhost is considered secure. Fortunately,
+  // the host resolver in these tests is set to resolve anything to 127.0.0.1.
+  // We use http://foo.test, which is not considered secure.
+  EXPECT_TRUE(NavigateToURL(
+      shell(),
+      embedded_test_server()->GetURL(
+          "foo.test",
+          "/set-header?Content-Security-Policy: treat-as-public-address")));
+
+  EXPECT_TRUE(ExecJs(root_frame_host(), R"(
+    const iframe = document.createElement("iframe");
+    iframe.src = "empty.html";
+    document.body.appendChild(iframe);
+  )"));
+
+  EXPECT_TRUE(WaitForLoadStop(web_contents()));
+
+  // Check that the child iframe failed to fetch.
+  ASSERT_EQ(1ul, root_frame_host()->child_count());
+  auto* child_frame = root_frame_host()->child_at(0)->current_frame_host();
+  // TODO(crbug.com/1124346): Expect 0 once the load fails.
+  EXPECT_EQ(200, child_frame->last_http_status_code());
+  // TODO(crbug.com/1124346): Expect an empty URL once the load fails.
+  EXPECT_THAT(child_frame->last_successful_url().spec(),
+              EndsWith("/empty.html"));
+}
+
 namespace {
 
 // Returns a snippet of Javascript that fetch()es the given URL.
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index 5214b6e..f05255d 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -2080,13 +2080,17 @@
   return true;
 }
 
-void RenderWidgetHostViewAndroid::OnPhysicalBackingSizeChanged() {
+void RenderWidgetHostViewAndroid::OnPhysicalBackingSizeChanged(
+    base::Optional<base::TimeDelta> deadline_override) {
   // We may need to update the background color to match pre-surface-sync
   // behavior of EvictFrameIfNecessary.
   UpdateWebViewBackgroundColorIfNecessary();
+  int64_t deadline_in_frames =
+      deadline_override ? ui::DelegatedFrameHostAndroid::TimeDeltaToFrames(
+                              deadline_override.value())
+                        : ui::DelegatedFrameHostAndroid::ResizeTimeoutFrames();
   SynchronizeVisualProperties(
-      cc::DeadlinePolicy::UseSpecifiedDeadline(
-          ui::DelegatedFrameHostAndroid::ResizeTimeoutFrames()),
+      cc::DeadlinePolicy::UseSpecifiedDeadline(deadline_in_frames),
       base::nullopt);
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index 35ecc92b..36f7e62 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -187,7 +187,8 @@
   bool OnMouseEvent(const ui::MotionEventAndroid& m) override;
   bool OnMouseWheelEvent(const ui::MotionEventAndroid& event) override;
   bool OnGestureEvent(const ui::GestureEventAndroid& event) override;
-  void OnPhysicalBackingSizeChanged() override;
+  void OnPhysicalBackingSizeChanged(
+      base::Optional<base::TimeDelta> deadline_override) override;
 
   // ui::ViewAndroidObserver implementation:
   void OnAttachedToWindow() override;
diff --git a/content/browser/service_worker/fake_service_worker.cc b/content/browser/service_worker/fake_service_worker.cc
index 21c1a16..0d266c49 100644
--- a/content/browser/service_worker/fake_service_worker.cc
+++ b/content/browser/service_worker/fake_service_worker.cc
@@ -172,14 +172,14 @@
                                           bool last_chance,
                                           base::TimeDelta timeout,
                                           DispatchSyncEventCallback callback) {
-  NOTIMPLEMENTED();
+  std::move(callback).Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED);
 }
 
 void FakeServiceWorker::DispatchPeriodicSyncEvent(
     const std::string& tag,
     base::TimeDelta timeout,
     DispatchPeriodicSyncEventCallback callback) {
-  NOTIMPLEMENTED();
+  std::move(callback).Run(blink::mojom::ServiceWorkerEventStatus::COMPLETED);
 }
 
 void FakeServiceWorker::DispatchAbortPaymentEvent(
diff --git a/content/browser/web_contents/web_contents_view_android.cc b/content/browser/web_contents/web_contents_view_android.cc
index cbd4227..09c67f34 100644
--- a/content/browser/web_contents/web_contents_view_android.cc
+++ b/content/browser/web_contents/web_contents_view_android.cc
@@ -584,7 +584,8 @@
   }
 }
 
-void WebContentsViewAndroid::OnPhysicalBackingSizeChanged() {
+void WebContentsViewAndroid::OnPhysicalBackingSizeChanged(
+    base::Optional<base::TimeDelta> deadline_override) {
   if (web_contents_->GetRenderWidgetHostView())
     web_contents_->SendScreenRects();
 }
diff --git a/content/browser/web_contents/web_contents_view_android.h b/content/browser/web_contents/web_contents_view_android.h
index dc386eb8..0916f2d 100644
--- a/content/browser/web_contents/web_contents_view_android.h
+++ b/content/browser/web_contents/web_contents_view_android.h
@@ -121,7 +121,8 @@
   bool ScrollBy(float delta_x, float delta_y) override;
   bool ScrollTo(float x, float y) override;
   void OnSizeChanged() override;
-  void OnPhysicalBackingSizeChanged() override;
+  void OnPhysicalBackingSizeChanged(
+      base::Optional<base::TimeDelta> deadline_override) override;
   void OnBrowserControlsHeightChanged() override;
   void OnControlsResizeViewChanged() override;
 
diff --git a/content/browser/webui/web_ui_data_source_impl.cc b/content/browser/webui/web_ui_data_source_impl.cc
index adaf7fd..250dddef 100644
--- a/content/browser/webui/web_ui_data_source_impl.cc
+++ b/content/browser/webui/web_ui_data_source_impl.cc
@@ -51,7 +51,11 @@
 
 std::string CleanUpPath(const std::string& path) {
   // Remove the query string for named resource lookups.
-  return path.substr(0, path.find_first_of('?'));
+  std::string clean_path = path.substr(0, path.find_first_of('?'));
+  // Remove a URL fragment (for example #foo) if it exists.
+  clean_path = clean_path.substr(0, path.find_first_of('#'));
+
+  return clean_path;
 }
 
 const int kNonExistentResource = -1;
diff --git a/content/browser/webui/web_ui_data_source_unittest.cc b/content/browser/webui/web_ui_data_source_unittest.cc
index 49c7315..ee5238c3 100644
--- a/content/browser/webui/web_ui_data_source_unittest.cc
+++ b/content/browser/webui/web_ui_data_source_unittest.cc
@@ -181,6 +181,19 @@
                    base::BindOnce(&NamedResourceWithQueryStringCallback));
 }
 
+void NamedResourceWithUrlFragmentCallback(
+    scoped_refptr<base::RefCountedMemory> data) {
+  EXPECT_NE(data, nullptr);
+  std::string result(data->front_as<char>(), data->size());
+  EXPECT_NE(result.find(kDummyResource), std::string::npos);
+}
+
+TEST_F(WebUIDataSourceTest, NamedResourceWithUrlFragment) {
+  source()->AddResourcePath("foobar", kDummyResourceId);
+  StartDataRequest("foobar#fragment",
+                   base::BindOnce(&NamedResourceWithUrlFragmentCallback));
+}
+
 void WebUIDataSourceTest::RequestFilterQueryStringCallback(
     scoped_refptr<base::RefCountedMemory> data) {
   std::string result(data->front_as<char>(), data->size());
diff --git a/content/public/renderer/content_renderer_client.cc b/content/public/renderer/content_renderer_client.cc
index 6c747859..889362f 100644
--- a/content/public/renderer/content_renderer_client.cc
+++ b/content/public/renderer/content_renderer_client.cc
@@ -263,4 +263,9 @@
   return base::nullopt;
 }
 
+void ContentRendererClient::MaybeProxyURLLoaderFactory(
+    RenderFrame* render_frame,
+    mojo::PendingReceiver<network::mojom::URLLoaderFactory>* factory_receiver) {
+}
+
 }  // namespace content
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h
index 5b0784c..04e4329a 100644
--- a/content/public/renderer/content_renderer_client.h
+++ b/content/public/renderer/content_renderer_client.h
@@ -24,6 +24,8 @@
 #include "content/public/renderer/websocket_handshake_throttle_provider.h"
 #include "media/base/audio_parameters.h"
 #include "media/base/supported_types.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "services/network/public/mojom/url_loader_factory.mojom.h"
 #include "third_party/blink/public/platform/web_content_settings_client.h"
 #include "third_party/blink/public/web/web_navigation_policy.h"
 #include "third_party/blink/public/web/web_navigation_type.h"
@@ -436,6 +438,12 @@
   virtual base::Optional<::media::AudioRendererAlgorithmParameters>
   GetAudioRendererAlgorithmParameters(
       ::media::AudioParameters audio_parameters);
+
+  // Proxies the URLLoaderFactory if the platform supports Chrome extensions.
+  virtual void MaybeProxyURLLoaderFactory(
+      RenderFrame* render_frame,
+      mojo::PendingReceiver<network::mojom::URLLoaderFactory>*
+          factory_receiver);
 };
 
 }  // namespace content
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index e9961d7..0dcb9632c 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -6558,6 +6558,15 @@
     observer.OnStop();
 }
 
+void RenderFrameImpl::MaybeProxyURLLoaderFactory(
+    blink::CrossVariantMojoReceiver<
+        network::mojom::URLLoaderFactoryInterfaceBase>* factory_receiver) {
+  mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver(
+      std::move(*factory_receiver));
+  GetContentClient()->renderer()->MaybeProxyURLLoaderFactory(this, &receiver);
+  *factory_receiver = std::move(receiver);
+}
+
 void RenderFrameImpl::DraggableRegionsChanged() {
   for (auto& observer : observers_)
     observer.DraggableRegionsChanged();
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 5ba5acd..e24ea26e 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -748,6 +748,10 @@
       blink::WebSetSinkIdCompleteCallback callback) override;
   std::unique_ptr<blink::WebURLLoaderFactory> CreateURLLoaderFactory() override;
   void OnStopLoading() override;
+  void MaybeProxyURLLoaderFactory(
+      blink::CrossVariantMojoReceiver<
+          network::mojom::URLLoaderFactoryInterfaceBase>* factory_receiver)
+      override;
   void DraggableRegionsChanged() override;
   blink::BrowserInterfaceBrokerProxy* GetBrowserInterfaceBroker() override;
   void SubmitThroughputData(ukm::SourceId source_id,
diff --git a/content/test/fuzzer/BUILD.gn b/content/test/fuzzer/BUILD.gn
index 6f57c7c4d..9c72c008 100644
--- a/content/test/fuzzer/BUILD.gn
+++ b/content/test/fuzzer/BUILD.gn
@@ -254,3 +254,30 @@
   seed_corpus =
       "../../browser/indexed_db/fuzzer_corpus/encoded_indexed_db_key_path"
 }
+
+# Fuzzer only supports linux. As we use a `V4L2CaptureDevice`, which is only
+# usable on linux through `VideoCaptureDeviceFactoryLinux`.
+if (is_linux) {
+  mojolpm_fuzzer_test("video_capture_host_mojolpm_fuzzer") {
+    sources = [ "video_capture_host_mojolpm_fuzzer.cc" ]
+
+    proto_source = "video_capture_host_mojolpm_fuzzer.proto"
+
+    deps = [
+      "//base/test:test_support",
+      "//content/browser:for_content_tests",
+      "//content/public/browser:browser",
+      "//content/test:content_unittests",
+      "//content/test:test_support",
+      "//media:test_support",
+      "//media/capture:capture_lib",
+      "//media/capture:test_support",
+      "//services/network:test_support",
+      "//storage/browser:test_support",
+      "//third_party/blink/public/common:common",
+      "//third_party/icu:icudata",
+    ]
+
+    proto_deps = [ "//media/capture/mojom:video_capture_mojolpm" ]
+  }
+}
diff --git a/content/test/fuzzer/video_capture_host_mojolpm_fuzzer.cc b/content/test/fuzzer/video_capture_host_mojolpm_fuzzer.cc
new file mode 100644
index 0000000..089776f7
--- /dev/null
+++ b/content/test/fuzzer/video_capture_host_mojolpm_fuzzer.cc
@@ -0,0 +1,701 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <stdint.h>
+#include <memory>
+#include <string>
+#include <utility>
+
+#include "base/at_exit.h"
+#include "base/bind.h"
+#include "base/command_line.h"
+#include "base/i18n/icu_util.h"
+#include "base/no_destructor.h"
+#include "base/run_loop.h"
+#include "base/task/post_task.h"
+#include "base/task/task_traits.h"
+#include "base/test/test_timeouts.h"
+#include "base/threading/thread.h"
+#include "content/browser/renderer_host/media/fake_video_capture_provider.h"
+#include "content/browser/renderer_host/media/in_process_video_capture_provider.h"  // nogncheck
+#include "content/browser/renderer_host/media/media_stream_manager.h"  // nogncheck
+#include "content/browser/renderer_host/media/media_stream_ui_proxy.h"  // nogncheck
+#include "content/browser/renderer_host/media/video_capture_host.h"  // nogncheck
+#include "content/browser/renderer_host/media/video_capture_manager.h"  // nogncheck
+#include "content/public/browser/browser_task_traits.h"
+#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/test_browser_context.h"
+#include "content/public/test/test_content_client_initializer.h"
+#include "content/test/fuzzer/video_capture_host_mojolpm_fuzzer.pb.h"
+#include "content/test/test_content_browser_client.h"
+#include "media/audio/audio_system_impl.h"
+#include "media/audio/mock_audio_manager.h"
+#include "media/audio/test_audio_thread.h"
+#include "media/capture/mojom/video_capture.mojom-mojolpm.h"
+#include "media/capture/video/create_video_capture_device_factory.h"
+#include "media/capture/video/linux/fake_device_provider.h"
+#include "media/capture/video/linux/fake_v4l2_impl.h"
+#include "media/capture/video/linux/video_capture_device_factory_linux.h"
+#include "media/capture/video/video_capture_system_impl.h"
+#include "media/capture/video_capture_types.h"
+#include "mojo/core/embedder/embedder.h"
+#include "third_party/blink/public/common/mediastream/media_devices.h"
+#include "third_party/libprotobuf-mutator/src/src/libfuzzer/libfuzzer_macro.h"
+
+const char* cmdline[] = {"video_capture_host_mojolpm_fuzzer", nullptr};
+
+// Describe all the devices (as descriptors).
+const uint32_t kNumDeviceDescriptors = 4;
+const media::VideoCaptureDeviceDescriptors kDeviceDescriptors{
+    {"dev_name_1", "dev_id_1"},
+    {"dev_name_2", "dev_id_2"},
+    {"dev_name_3", "dev_id_3"},
+    {"dev_name_4", "dev_id_4"}};
+// Specifies number of render process ids (counted from 0).
+// All devices are opened for each id.
+const uint32_t kNumRenderProcessIds = 2;
+
+// Global environment needed to run the interface being tested.
+//
+// This will be created once, before fuzzing starts, and will be shared between
+// all testcases. It is created on the main thread.
+//
+// At a minimum, we should always be able to set up the command line, i18n and
+// mojo, and create the thread on which the fuzzer will be run. We want to avoid
+// (as much as is reasonable) any state being preserved between testcases.
+//
+// We try to create an environment that matches the real browser process as much
+// as possible, so we use real platform threads in the task environment.
+class ContentFuzzerEnvironment {
+ public:
+  ContentFuzzerEnvironment()
+      : fuzzer_thread_((base::CommandLine::Init(1, cmdline), "fuzzer_thread")) {
+    TestTimeouts::Initialize();
+    logging::SetMinLogLevel(logging::LOG_FATAL);
+    mojo::core::Init();
+    base::i18n::InitializeICU();
+
+    fuzzer_thread_.StartAndWaitForTesting();
+  }
+
+  scoped_refptr<base::SequencedTaskRunner> fuzzer_task_runner() {
+    return fuzzer_thread_.task_runner();
+  }
+
+  base::AtExitManager at_exit_manager_;
+  base::Thread fuzzer_thread_;
+  content::TestContentClientInitializer content_client_initializer_;
+};
+
+ContentFuzzerEnvironment& GetEnvironment() {
+  static base::NoDestructor<ContentFuzzerEnvironment> environment;
+  return *environment;
+}
+
+scoped_refptr<base::SequencedTaskRunner> GetFuzzerTaskRunner() {
+  return GetEnvironment().fuzzer_task_runner();
+}
+
+// Per-testcase state needed to run the interface being tested.
+//
+// The lifetime of this is scoped to a single testcase, and it is created and
+// destroyed from the fuzzer sequence.
+//
+// The component under fuzz `VideoCaptureHost` is created on call
+// `AddVideoCaptureHost` (singly bound using a self owned receiver).
+// This directly relies on `MediaStreamManager`, which is owned here (as well as
+// indirectly reliant on other components owned here).
+//
+// `MediaStreamManager` is a `CurrentThread::DestructionObserver`, so it must
+// outlive the `BrowserTaskEnvironment`. So the task environment is scoped per
+// testcase (undesirable for performance).
+class VideoCaptureHostTestcase {
+ public:
+  VideoCaptureHostTestcase(
+      const content::fuzzing::video_capture_host::proto::Testcase& testcase);
+  ~VideoCaptureHostTestcase();
+
+  // Returns true once either all of the actions in the testcase have been
+  // performed, or the per-testcase action limit has been exceeded.
+  //
+  // This should only be called from the fuzzer sequence.
+  bool IsFinished();
+
+  // If there are still actions remaining in the testcase, this will perform the
+  // next sequence of actions before returning.
+  //
+  // If IsFinished() would return true, then calling this function is a no-op.
+  //
+  // This should only be called from the fuzzer sequence.
+  void NextAction();
+
+ private:
+  using Action = content::fuzzing::video_capture_host::proto::Action;
+
+  void SetUp();
+  void SetUpOnIOThreadFirst();
+  void SetUpOnUIThread();
+  void SetUpOnIOThreadSecond();
+
+  // We want to open video sessions, to enable behaviour for the fuzzer.
+  // To do this, we enumerate with the `MediaDeviceManager` (on UI thread),
+  // then `OpenDevice` with the `MediaStreamManager` (on IO thread).
+  // `OpenSession` is repeated for each `render_process_id`.
+  // So the same devices are opened for multiple ids.
+  void OpenSession(int render_process_id,
+                   int render_frame_id,
+                   int requester_id,
+                   int page_request_id);
+  void OpenSessionOnUIThread(
+      int render_process_id,
+      int render_frame_id,
+      content::MediaDeviceSaltAndOrigin* salt_and_origin);
+  void OpenSessionOnIOThread(
+      int render_process_id,
+      int render_frame_id,
+      int requester_id,
+      int page_request_id,
+      const content::MediaDeviceSaltAndOrigin& salt_and_origin,
+      base::OnceClosure quit_closure);
+
+  void TearDown();
+  void TearDownOnIOThread();
+  void TearDownOnUIThread();
+
+  std::unique_ptr<content::FakeMediaStreamUIProxy> CreateFakeUI();
+
+  // A callback to receive the enumerated devices in the
+  // `WebMediaDeviceInfoArray`.
+  void VideoInputDevicesEnumerated(
+      base::OnceClosure quit_closure,
+      const std::string& salt,
+      const url::Origin& security_origin,
+      blink::WebMediaDeviceInfoArray* out,
+      const content::MediaDeviceEnumeration& enumeration);
+
+  // A callback which confirms opening device success. This provides the
+  // session ids for the devices, stored in `opened_session_ids_`.
+  void OnDeviceOpened(base::OnceClosure quit_closure,
+                      int render_process_id,
+                      uint32_t device_index,
+                      bool success,
+                      const std::string& label,
+                      const blink::MediaStreamDevice& opened_device);
+
+  // Create and bind a new instance for fuzzing. This needs to make sure that
+  // the new instance has been created and bound on the correct sequence
+  // before returning.
+  void AddVideoCaptureHost(uint32_t id, uint32_t render_process_id);
+
+  // This wraps `HandleRemoteAction`, making the call for the correct device.
+  // As it requires specifying the `render_process_id` and `device_index`.
+  // to find the correct session id for the device.
+  void HandleDeviceRemoteAction(
+      const content::fuzzing::video_capture_host::proto::
+          VideoCaptureHostDeviceRemoteAction& device_remote_action);
+
+  // Used to directly inject the session id into the `RemoteAction`,
+  // overwriting the protobuf field.
+  using RemoteAction = mojolpm::media::mojom::VideoCaptureHost_RemoteAction;
+  const RemoteAction& RemoteActionInjectSessionId(
+      const RemoteAction& remote_method_action,
+      const ::base::UnguessableToken& input);
+
+  // We register, and therefore use, the devices per `render_process_id`.
+  // So this gets the appropriate session id.
+  const base::UnguessableToken& OpenedSessionId(int render_process_id,
+                                                uint32_t device_index);
+
+  // The proto message describing the test actions to perform.
+  const content::fuzzing::video_capture_host::proto::Testcase& testcase_;
+
+  // Apply a reasonable upper-bound on testcase complexity to avoid timeouts.
+  const int max_action_count_ = 512;
+
+  // Apply a reasonable upper-bound on maximum size of action that we will
+  // deserialize. (This is deliberately slightly larger than max mojo message
+  // size)
+  const size_t max_action_size_ = 300 * 1024 * 1024;
+
+  // Count of total actions performed in this testcase.
+  int action_count_ = 0;
+
+  // The index of the next sequence of actions to execute.
+  int next_sequence_idx_ = 0;
+
+  // Prerequisite components for the `VideoCaptureHost`.
+  std::unique_ptr<content::MediaStreamManager> media_stream_manager_;
+  std::unique_ptr<media::AudioManager> audio_manager_;
+  std::unique_ptr<media::AudioSystem> audio_system_;
+
+  // Indexed by `render_process_id` then `kDeviceDescriptors` index
+  // See `OpenedSessionId` getter.
+  std::array<std::array<base::UnguessableToken, kNumDeviceDescriptors>,
+             kNumRenderProcessIds>
+      opened_session_ids_;
+
+  // Prerequisite state.
+  content::BrowserTaskEnvironment task_environment_;
+  content::TestBrowserContext browser_context_;
+  content::TestContentBrowserClient browser_client_;
+
+  SEQUENCE_CHECKER(sequence_checker_);
+};
+
+VideoCaptureHostTestcase::VideoCaptureHostTestcase(
+    const content::fuzzing::video_capture_host::proto::Testcase& testcase)
+    : testcase_(testcase),
+      task_environment_(
+          base::test::TaskEnvironment::MainThreadType::DEFAULT,
+          base::test::TaskEnvironment::ThreadPoolExecutionMode::ASYNC,
+          base::test::TaskEnvironment::ThreadingMode::MULTIPLE_THREADS,
+          content::BrowserTaskEnvironment::REAL_IO_THREAD),
+      browser_context_(),
+      browser_client_() {
+  // VideoCaptureHostTestcase is created on the main thread, but the actions
+  // that we want to validate the sequencing of take place on the fuzzer
+  // sequence.
+  DETACH_FROM_SEQUENCE(sequence_checker_);
+  SetUp();
+  for (uint32_t render_process_id = 0; render_process_id < kNumRenderProcessIds;
+       render_process_id++)
+    OpenSession(render_process_id,
+                /*render_frame_id=*/1,
+                /*requester_id=*/1,
+                /*page_request_id=*/1);
+}
+
+VideoCaptureHostTestcase::~VideoCaptureHostTestcase() {
+  TearDown();
+}
+
+bool VideoCaptureHostTestcase::IsFinished() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  return next_sequence_idx_ >= testcase_.sequence_indexes_size();
+}
+
+void VideoCaptureHostTestcase::NextAction() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (next_sequence_idx_ < testcase_.sequence_indexes_size()) {
+    auto sequence_idx = testcase_.sequence_indexes(next_sequence_idx_++);
+    const auto& sequence =
+        testcase_.sequences(sequence_idx % testcase_.sequences_size());
+    for (auto action_idx : sequence.action_indexes()) {
+      if (!testcase_.actions_size() || ++action_count_ > max_action_count_) {
+        return;
+      }
+      const auto& action =
+          testcase_.actions(action_idx % testcase_.actions_size());
+      if (action.ByteSizeLong() > max_action_size_) {
+        return;
+      }
+      switch (action.action_case()) {
+        case Action::kRunThread: {
+          if (action.run_thread().id()) {
+            base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+            base::PostTask(FROM_HERE, {content::BrowserThread::UI},
+                           run_loop.QuitClosure());
+            run_loop.Run();
+          } else {
+            base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+            base::PostTask(FROM_HERE, {content::BrowserThread::IO},
+                           run_loop.QuitClosure());
+            run_loop.Run();
+          }
+        } break;
+
+        case Action::kNewVideoCaptureHost: {
+          AddVideoCaptureHost(
+              action.new_video_capture_host().id(),
+              action.new_video_capture_host().render_process_id());
+        } break;
+
+        case Action::kVideoCaptureHostDeviceRemoteAction: {
+          HandleDeviceRemoteAction(
+              action.video_capture_host_device_remote_action());
+        } break;
+
+        case Action::kVideoCaptureObserverReceiverAction: {
+          mojolpm::HandleReceiverAction(
+              action.video_capture_observer_receiver_action());
+        } break;
+
+        case Action::ACTION_NOT_SET:
+          break;
+      }
+    }
+  }
+}
+
+void VideoCaptureHostTestcase::SetUp() {
+  {
+    base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed};
+    base::PostTaskAndReply(
+        FROM_HERE, {content::BrowserThread::IO},
+        base::BindOnce(&VideoCaptureHostTestcase::SetUpOnIOThreadFirst,
+                       base::Unretained(this)),
+        run_loop.QuitClosure());
+    run_loop.Run();
+  }
+  {
+    base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed};
+    base::PostTaskAndReply(
+        FROM_HERE, {content::BrowserThread::UI},
+        base::BindOnce(&VideoCaptureHostTestcase::SetUpOnUIThread,
+                       base::Unretained(this)),
+        run_loop.QuitClosure());
+    run_loop.Run();
+  }
+  {
+    base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed};
+    base::PostTaskAndReply(
+        FROM_HERE, {content::BrowserThread::IO},
+        base::BindOnce(&VideoCaptureHostTestcase::SetUpOnIOThreadSecond,
+                       base::Unretained(this)),
+        run_loop.QuitClosure());
+    run_loop.Run();
+  }
+}
+
+void VideoCaptureHostTestcase::SetUpOnIOThreadFirst() {
+  audio_manager_ = std::make_unique<media::MockAudioManager>(
+      std::make_unique<media::TestAudioThread>());
+  audio_system_ =
+      std::make_unique<media::AudioSystemImpl>(audio_manager_.get());
+}
+
+void VideoCaptureHostTestcase::SetUpOnUIThread() {
+  // Here we specify the devices described by `kDeviceDescriptors`.
+  // Which tells the `VideoCaptureDeviceFactoryLinux` what devices we have.
+  // This factory is then used to setup the `MediaStreamManager`.
+  std::unique_ptr<media::FakeDeviceProvider> fake_device_provider =
+      std::make_unique<media::FakeDeviceProvider>();
+  scoped_refptr<media::FakeV4L2Impl> fake_v4l2_impl =
+      base::MakeRefCounted<media::FakeV4L2Impl>();
+
+  for (const auto& descriptor : kDeviceDescriptors) {
+    // Note, despite the param name, `device_name` should match `device_id`
+    fake_v4l2_impl->AddDevice(/*device_name=*/descriptor.device_id,
+                              media::FakeV4L2DeviceConfig(descriptor));
+    fake_device_provider->AddDevice(descriptor);
+  }
+
+  std::unique_ptr<media::VideoCaptureDeviceFactoryLinux>
+      video_capture_device_factory =
+          std::make_unique<media::VideoCaptureDeviceFactoryLinux>(
+              task_environment_.GetMainThreadTaskRunner());
+
+  video_capture_device_factory->SetV4L2EnvironmentForTesting(
+      std::move(fake_v4l2_impl), std::move(fake_device_provider));
+
+  media_stream_manager_ = std::make_unique<content::MediaStreamManager>(
+      audio_system_.get(), audio_manager_->GetTaskRunner(),
+      content::InProcessVideoCaptureProvider::CreateInstance(
+          std::make_unique<media::VideoCaptureSystemImpl>(
+              std::move(video_capture_device_factory)),
+          audio_manager_->GetTaskRunner(), base::DoNothing()));
+}
+
+void VideoCaptureHostTestcase::SetUpOnIOThreadSecond() {
+  media_stream_manager_->UseFakeUIFactoryForTests(base::BindRepeating(
+      &VideoCaptureHostTestcase::CreateFakeUI, base::Unretained(this)));
+}
+
+void VideoCaptureHostTestcase::OpenSession(int render_process_id,
+                                           int render_frame_id,
+                                           int requester_id,
+                                           int page_request_id) {
+  // We get `salt_and_origin` on the UI Thread, and use it on the IO thread.
+  content::MediaDeviceSaltAndOrigin salt_and_origin;
+  {
+    base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed};
+    base::PostTaskAndReply(
+        FROM_HERE, {content::BrowserThread::UI},
+        base::BindOnce(&VideoCaptureHostTestcase::OpenSessionOnUIThread,
+                       base::Unretained(this), render_process_id,
+                       render_frame_id, base::Unretained(&salt_and_origin)),
+        run_loop.QuitClosure());
+    run_loop.Run();
+  }
+  {
+    base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed};
+    base::PostTask(
+        FROM_HERE, {content::BrowserThread::IO},
+        base::BindOnce(&VideoCaptureHostTestcase::OpenSessionOnIOThread,
+                       base::Unretained(this), render_process_id,
+                       render_frame_id, requester_id, page_request_id,
+                       salt_and_origin, run_loop.QuitClosure()));
+    run_loop.Run();
+  }
+}
+
+void VideoCaptureHostTestcase::OpenSessionOnUIThread(
+    int render_process_id,
+    int render_frame_id,
+    content::MediaDeviceSaltAndOrigin* out_salt_and_origin) {
+  *out_salt_and_origin =
+      content::GetMediaDeviceSaltAndOrigin(render_process_id, render_frame_id);
+}
+
+void VideoCaptureHostTestcase::OpenSessionOnIOThread(
+    int render_process_id,
+    int render_frame_id,
+    int requester_id,
+    int page_request_id,
+    const content::MediaDeviceSaltAndOrigin& salt_and_origin,
+    base::OnceClosure quit_closure) {
+  // Enumerate video devices.
+  blink::WebMediaDeviceInfoArray video_devices;
+  {
+    base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed};
+    content::MediaDevicesManager::BoolDeviceTypes devices_to_enumerate;
+    devices_to_enumerate[blink::MEDIA_DEVICE_TYPE_VIDEO_INPUT] = true;
+    media_stream_manager_->media_devices_manager()->EnumerateDevices(
+        devices_to_enumerate,
+        base::BindOnce(&VideoCaptureHostTestcase::VideoInputDevicesEnumerated,
+                       base::Unretained(this), run_loop.QuitClosure(),
+                       salt_and_origin.device_id_salt, salt_and_origin.origin,
+                       &video_devices));
+
+    run_loop.Run();
+  }
+
+  // Open video devices.
+  for (uint32_t device_index = 0; device_index < video_devices.size();
+       device_index++) {
+    base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed};
+    media_stream_manager_->OpenDevice(
+        render_process_id, render_frame_id, requester_id, page_request_id,
+        video_devices[device_index].device_id,
+        blink::mojom::MediaStreamType::DEVICE_VIDEO_CAPTURE, salt_and_origin,
+        base::BindOnce(&VideoCaptureHostTestcase::OnDeviceOpened,
+                       base::Unretained(this), run_loop.QuitClosure(),
+                       render_process_id, device_index),
+        content::MediaStreamManager::DeviceStoppedCallback());
+    run_loop.Run();
+  }
+
+  std::move(quit_closure).Run();
+}
+
+void VideoCaptureHostTestcase::TearDown() {
+  {
+    base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed};
+    base::PostTaskAndReply(
+        FROM_HERE, {content::BrowserThread::IO},
+        base::BindOnce(&VideoCaptureHostTestcase::TearDownOnIOThread,
+                       base::Unretained(this)),
+        run_loop.QuitClosure());
+    run_loop.Run();
+  }
+  {
+    base::RunLoop run_loop{base::RunLoop::Type::kNestableTasksAllowed};
+    base::PostTaskAndReply(
+        FROM_HERE, {content::BrowserThread::UI},
+        base::BindOnce(&VideoCaptureHostTestcase::TearDownOnUIThread,
+                       base::Unretained(this)),
+        run_loop.QuitClosure());
+    run_loop.Run();
+  }
+}
+
+void VideoCaptureHostTestcase::TearDownOnIOThread() {
+  audio_manager_->Shutdown();
+  audio_manager_.reset();
+}
+
+void VideoCaptureHostTestcase::TearDownOnUIThread() {
+  audio_system_.reset();
+}
+
+std::unique_ptr<content::FakeMediaStreamUIProxy>
+VideoCaptureHostTestcase::CreateFakeUI() {
+  return std::make_unique<content::FakeMediaStreamUIProxy>(
+      /*tests_use_fake_render_frame_hosts=*/true);
+}
+
+void VideoCaptureHostTestcase::VideoInputDevicesEnumerated(
+    base::OnceClosure quit_closure,
+    const std::string& salt,
+    const url::Origin& security_origin,
+    blink::WebMediaDeviceInfoArray* out,
+    const content::MediaDeviceEnumeration& enumeration) {
+  for (const auto& info : enumeration[blink::MEDIA_DEVICE_TYPE_VIDEO_INPUT]) {
+    std::string device_id =
+        content::MediaStreamManager::GetHMACForMediaDeviceID(
+            salt, security_origin, info.device_id);
+    out->push_back(
+        blink::WebMediaDeviceInfo(device_id, info.label, std::string()));
+  }
+  std::move(quit_closure).Run();
+}
+
+void VideoCaptureHostTestcase::OnDeviceOpened(
+    base::OnceClosure quit_closure,
+    int render_process_id,
+    uint32_t device_index,
+    bool success,
+    const std::string& label,
+    const blink::MediaStreamDevice& opened_device) {
+  if (success) {
+    opened_session_ids_[render_process_id][device_index] =
+        opened_device.session_id();
+  }
+  std::move(quit_closure).Run();
+}
+
+void VideoCaptureHostTestcase::AddVideoCaptureHost(uint32_t id,
+                                                   uint32_t render_process_id) {
+  mojo::Remote<::media::mojom::VideoCaptureHost> remote;
+  auto receiver = remote.BindNewPipeAndPassReceiver();
+
+  base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+  base::PostTaskAndReply(
+      FROM_HERE, {content::BrowserThread::IO},
+      base::BindOnce(&content::VideoCaptureHost::Create, render_process_id,
+                     media_stream_manager_.get(), std::move(receiver)),
+      run_loop.QuitClosure());
+  run_loop.Run();
+
+  mojolpm::GetContext()->AddInstance(id, std::move(remote));
+}
+
+/* Matches signature of a mojolpm::ToProto implementation, which has not been
+ * implemented yet, to be replaced once that is done.
+ * see "mojo/public/mojom/base/unguessable_token.mojom-mojolpm.h"
+ */
+bool ToProto(const ::base::UnguessableToken& input,
+             mojolpm::mojo_base::mojom::UnguessableToken& output) {
+  if (output.has_new_()) {
+    output.mutable_new_()->set_id(1UL);
+    output.mutable_new_()->set_m_low(input.GetLowForSerialization());
+    output.mutable_new_()->set_m_high(input.GetHighForSerialization());
+    return true;
+  }
+  auto allocated_new = std::make_unique<
+      mojolpm::mojo_base::mojom::UnguessableToken_ProtoStruct>();
+
+  allocated_new->set_id(1UL);
+  allocated_new->set_m_low(input.GetLowForSerialization());
+  allocated_new->set_m_high(input.GetHighForSerialization());
+
+  // passes ownership of `allocated_new`
+  output.set_allocated_new_(allocated_new.release());
+  return true;
+}
+
+void VideoCaptureHostTestcase::HandleDeviceRemoteAction(
+    const content::fuzzing::video_capture_host::proto::
+        VideoCaptureHostDeviceRemoteAction& device_remote_action) {
+  const base::UnguessableToken& token =
+      OpenedSessionId(device_remote_action.render_process_id(),
+                      device_remote_action.device_index());
+
+  mojolpm::HandleRemoteAction(
+      RemoteActionInjectSessionId(device_remote_action.remote_action(), token));
+}
+
+const VideoCaptureHostTestcase::RemoteAction&
+VideoCaptureHostTestcase::RemoteActionInjectSessionId(
+    const RemoteAction& remote_method_action,
+    const ::base::UnguessableToken& token) {
+  // `const_cast` used for performance (could also copy)
+  RemoteAction& remote_method_action_mutable =
+      const_cast<RemoteAction&>(remote_method_action);
+  mojolpm::mojo_base::mojom::UnguessableToken* m_session_id;
+
+  switch (remote_method_action_mutable.method_case()) {
+    case RemoteAction::kMStart:
+      m_session_id = remote_method_action_mutable.mutable_m_start()
+                         ->mutable_m_session_id();
+      break;
+
+    case RemoteAction::kMResume:
+      m_session_id = remote_method_action_mutable.mutable_m_resume()
+                         ->mutable_m_session_id();
+      break;
+
+    case RemoteAction::kMGetDeviceSupportedFormats:
+      m_session_id =
+          remote_method_action_mutable.mutable_m_get_device_supported_formats()
+              ->mutable_m_session_id();
+      break;
+
+    case RemoteAction::kMGetDeviceFormatsInUse:
+      m_session_id =
+          remote_method_action_mutable.mutable_m_get_device_formats_in_use()
+              ->mutable_m_session_id();
+      break;
+
+    default:
+      return remote_method_action;
+  }
+
+  if (!ToProto(token, *m_session_id))
+    return remote_method_action;
+  return remote_method_action_mutable;
+}
+
+const base::UnguessableToken& VideoCaptureHostTestcase::OpenedSessionId(
+    int render_process_id,
+    uint32_t device_index) {
+  return opened_session_ids_[render_process_id % kNumRenderProcessIds]
+                            [device_index % kNumDeviceDescriptors];
+}
+
+// Helper function to keep scheduling fuzzer actions on the current runloop
+// until the testcase has completed, and then quit the runloop.
+void NextAction(VideoCaptureHostTestcase* testcase,
+                base::RepeatingClosure quit_closure) {
+  if (!testcase->IsFinished()) {
+    testcase->NextAction();
+    GetFuzzerTaskRunner()->PostTask(
+        FROM_HERE, base::BindOnce(NextAction, base::Unretained(testcase),
+                                  std::move(quit_closure)));
+  } else {
+    GetFuzzerTaskRunner()->PostTask(FROM_HERE, std::move(quit_closure));
+  }
+}
+
+// Helper function to setup and run the testcase, since we need to do that from
+// the fuzzer sequence rather than the main thread.
+void RunTestcase(VideoCaptureHostTestcase* testcase) {
+  mojo::Message message;
+  auto dispatch_context =
+      std::make_unique<mojo::internal::MessageDispatchContext>(&message);
+
+  mojolpm::GetContext()->StartTestcase();
+
+  base::RunLoop fuzzer_run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+  GetFuzzerTaskRunner()->PostTask(
+      FROM_HERE, base::BindOnce(NextAction, base::Unretained(testcase),
+                                fuzzer_run_loop.QuitClosure()));
+  fuzzer_run_loop.Run();
+
+  mojolpm::GetContext()->EndTestcase();
+}
+
+DEFINE_BINARY_PROTO_FUZZER(
+    const content::fuzzing::video_capture_host::proto::Testcase&
+        proto_testcase) {
+  if (!proto_testcase.actions_size() || !proto_testcase.sequences_size() ||
+      !proto_testcase.sequence_indexes_size()) {
+    return;
+  }
+
+  // Make sure that the environment is initialized before we do anything else.
+  GetEnvironment();
+
+  VideoCaptureHostTestcase testcase(proto_testcase);
+
+  base::RunLoop ui_run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+
+  // Unretained is safe here, because ui_run_loop has to finish before testcase
+  // goes out of scope.
+  GetFuzzerTaskRunner()->PostTaskAndReply(
+      FROM_HERE, base::BindOnce(RunTestcase, base::Unretained(&testcase)),
+      ui_run_loop.QuitClosure());
+
+  ui_run_loop.Run();
+}
diff --git a/content/test/fuzzer/video_capture_host_mojolpm_fuzzer.proto b/content/test/fuzzer/video_capture_host_mojolpm_fuzzer.proto
new file mode 100644
index 0000000..65a9928
--- /dev/null
+++ b/content/test/fuzzer/video_capture_host_mojolpm_fuzzer.proto
@@ -0,0 +1,58 @@
+syntax = "proto2";
+
+package content.fuzzing.video_capture_host.proto;
+
+import "media/capture/mojom/video_capture.mojom.mojolpm.proto";
+
+// Bind a new VideoCaptureHost remote
+message NewVideoCaptureHostAction {
+  required uint32 id = 1;
+  required uint32 render_process_id = 2;
+}
+
+// A wrapper message for all remote actions. It requires further specifying
+// the `render_process_id` and `device_index` to identify which session id to
+// inject into the call. So the call correctly acts for a specific device.
+message VideoCaptureHostDeviceRemoteAction {
+  required uint32 render_process_id = 1;
+  required uint32 device_index = 2;
+  required mojolpm.media.mojom.VideoCaptureHost.RemoteAction remote_action = 3;
+}
+
+// Run the specific sequence for (an indeterminate) period. This is not
+// intended to create a specific ordering, but to allow the fuzzer to delay a
+// later task until previous tasks have completed.
+message RunThreadAction {
+  enum ThreadId {
+    IO = 0;
+    UI = 1;
+  }
+
+  required ThreadId id = 1;
+}
+
+// Actions that can be performed by the fuzzer.
+message Action {
+  oneof action {
+    RunThreadAction run_thread = 1;
+
+    NewVideoCaptureHostAction new_video_capture_host = 2;
+    VideoCaptureHostDeviceRemoteAction video_capture_host_device_remote_action =
+        3;
+    mojolpm.media.mojom.VideoCaptureObserver.ReceiverAction
+        video_capture_observer_receiver_action = 4;
+  }
+}
+
+// Sequence provides a level of indirection which allows Testcase to compactly
+// express repeated sequences of actions.
+message Sequence {
+  repeated uint32 action_indexes = 1 [packed = true];
+}
+
+// Testcase is the top-level message type interpreted by the fuzzer.
+message Testcase {
+  repeated Action actions = 1;
+  repeated Sequence sequences = 2;
+  repeated uint32 sequence_indexes = 3 [packed = true];
+}
diff --git a/crypto/BUILD.gn b/crypto/BUILD.gn
index 39ad6bf..c866aa7 100644
--- a/crypto/BUILD.gn
+++ b/crypto/BUILD.gn
@@ -77,7 +77,7 @@
 
   public_deps = [ "//third_party/boringssl" ]
 
-  if (!is_mac && !is_ios) {
+  if (!is_apple) {
     sources -= [
       "apple_keychain.h",
       "mock_apple_keychain.cc",
diff --git a/docs/webui_explainer.md b/docs/webui_explainer.md
index e3dc1a0..6d247540 100644
--- a/docs/webui_explainer.md
+++ b/docs/webui_explainer.md
@@ -134,7 +134,7 @@
     content::WebUIDataSource* source =
         content::WebUIDataSource::Create("donuts");  // "donuts" == hostname
     source->AddString("mmmDonuts", "Mmm, donuts!");  // Translations.
-    source->SetDefaultResource(IDR_DONUTS_HTML);  // Home page.
+    source->AddResourcePath("", IDR_DONUTS_HTML);  // Home page.
     content::WebUIDataSource::Add(source);
 
     // Handles messages from JavaScript to C++ via chrome.send().
@@ -207,8 +207,46 @@
 inspection (i.e. chrome://settings creates a generic [`WebUI`](#WebUI) with a
 settings-specific `WebUIController`).
 
+<a name="WebUIDataSource"></a>
 ### WebUIDataSource
 
+The `WebUIDataSource` class provides a place for data to live for WebUI pages.
+
+Examples types of data stored in this class are:
+
+* static resources (i.e. .html files packed into bundles and pulled off of disk)
+* translations
+* dynamic feature values (i.e. whether a feature is enabled)
+
+Data sources are set up in the browser process (in C++) and are accessed by
+loading URLs from the renderer.
+
+Below is an example of a simple data source (in this case, Chrome's history
+page):
+
+```c++
+content::WebUIDataSource* source = content::WebUIDataSource::Create("history");
+
+source->AddResourcePath("sign_in_promo.svg", IDR_HISTORY_SIGN_IN_PROMO_SVG);
+source->AddResourcePath("synced_tabs.html", IDR_HISTORY_SYNCED_TABS_HTML);
+
+source->AddString("title", IDS_HISTORY_TITLE);
+source->AddString("moreFromThisSite", IDS_HISTORY_MORE_FROM_THIS_SITE);
+
+source->AddBoolean("showDateRanges",
+    base::FeatureList::IsEnabled(features::kHistoryShowDateRanges));
+
+webui::SetupWebUIDataSource(
+    source, base::make_span(kHistoryResources, kHistoryResourcesSize),
+    kGeneratedPath, IDR_HISTORY_HISTORY_HTML);
+
+content::WebUIDataSource::Add(source);
+```
+
+For more about each of the methods called on `WebUIDataSource` and the utility
+method that performs additional configuration, see [DataSources](#DataSources)
+and [WebUIDataSourceUtils](#WebUIDataSourceUtils)
+
 <a name="WebUIMessageHandler"></a>
 ### WebUIMessageHandler
 
@@ -242,6 +280,156 @@
 };
 ```
 
+<a name="DataSources">
+## Data Sources
+
+<a name="Create"></a>
+### WebUIDataSource::Create()
+
+This is a factory method required to create a WebUIDataSource instance. The
+argument to `Create()` is typically the host name of the page. Caller owns the
+result.
+
+<a name="Add"></a>
+### WebUIDataSource::Add()
+
+Once you've created and added some things to a data source, it'll need to be
+"added". This means transferring ownership. In practice, the data source is
+created in the browser process on the UI thread and transferred to the IO
+thread. Additionally, calling `Add()` will overwrite any existing data source
+with the same name.
+
+<div class="note">
+It's unsafe to keep references to a <code>WebUIDataSource</code> after calling
+<code>Add()</code>. Don't do this.
+</div>
+
+<a name="AddLocalizedString"></a>
+### WebUIDataSource::AddLocalizedString()
+
+Using an int reference to a grit string (starts with "IDS" and lives in a .grd
+or .grdp file), adding a string with a key name will be possible to reference
+via the `$i18n{}` syntax (and will be replaced when requested) or later
+dynamically in JavaScript via `loadTimeData.getString()` (or `getStringF`).
+
+<a name="AddResourcePath"></a>
+### WebUIDataSource::AddResourcePath()
+
+Using an int reference to a grit resource (starts with "IDR" and lives in a .grd
+or .grdp file), adds a resource to the UI with the specified path.
+
+It's generally a good idea to call <code>AddResourcePath()</code> with the empty
+path and a resource ID that should be served as the "catch all" resource to
+respond with. This resource will be served for requests like "chrome://history",
+or "chrome://history/pathThatDoesNotExist". It will not be served for requests
+that look like they are attempting to fetch a specific file, like
+"chrome://history/file\_that\_does\_not\_exist.js". This is so that if a user
+enters a typo when trying to load a subpage like "chrome://history/syncedTabs"
+they will be redirected to the main history page, instead of seeing an error,
+but incorrect imports in the source code will fail, so that they can be more
+easily found and corrected.
+
+<a name="AddBoolean"></a>
+### WebUIDataSource::AddBoolean()
+
+Often a page needs to know whether a feature is enabled. This is a good use case
+for `WebUIDataSource::AddBoolean()`.  Then, in the Javascript, one can write
+code like this:
+
+```js
+if (loadTimeData.getBoolean('myFeatureIsEnabled')) {
+  ...
+}
+```
+
+<div class="note">
+Data sources are not recreated on refresh, and therefore values that are dynamic
+(i.e. that can change while Chrome is running) may easily become stale. It may
+be preferable to use <code>cr.sendWithPromise()</code> to initialize dynamic
+values and call <code>FireWebUIListener()</code> to update them.
+
+If you really want or need to use <code>AddBoolean()</code> for a dynamic value,
+make sure to call <code>WebUIDataSource::Update()</code> when the value changes.
+</div>
+
+<a name="WebUIDataSourceUtils"></a>
+## WebUI utils for working with data sources
+
+chrome/browser/ui/webui/webui\_util.\* contains a number of methods to simplify
+common configuration tasks.
+
+<a name="AddLocalizedStringsBulk"></a>
+### webui::AddLocalizedStringsBulk()
+
+Many Web UI data sources need to be set up with a large number of localized
+strings. Instead of repeatedly calling <code>AddLocalizedString()</code>, create
+an array of all the strings and use <code>AddLocalizedStringsBulk()</code>:
+
+```c++
+  static constexpr webui::LocalizedString kStrings[] = {
+      // Localized strings (alphabetical order).
+      {"actionMenuDescription", IDS_HISTORY_ACTION_MENU_DESCRIPTION},
+      {"ariaRoleDescription", IDS_HISTORY_ARIA_ROLE_DESCRIPTION},
+      {"bookmarked", IDS_HISTORY_ENTRY_BOOKMARKED},
+  };
+  AddLocalizedStringsBulk(source, kStrings);
+```
+
+<a name="AddResourcePathsBulk"></a>
+### webui::AddResourcePathsBulk()
+
+Similar to the localized strings, many Web UIs need to add a large number of
+resource paths. In this case, use <code>AddResourcePathsBulk()</code> to
+replace repeated calls to <code>AddResourcePath()</code>. There are two
+versions. One works almost identically to the strings case:
+
+```c++
+  static constexpr webui::ResourcePath kPdfResources[] = {
+      {"pdf/browser_api.js", IDR_PDF_BROWSER_API_JS},
+      {"pdf/constants.js", IDR_PDF_CONSTANTS_JS},
+      {"pdf/controller.js", IDR_PDF_CONTROLLER_JS},
+  };
+  webui::AddResourcePathsBulk(source, kStrings);
+```
+
+The second version instead accepts a span of <code>GritResourceMap</code> so
+that it can directly use constants defined by autogenerated grit resources map
+header files. For example, the autogenerated print\_preview\_resources\_map.h
+header defines a <code>GritResourceMap</code> named
+<code>kPrintPreviewResources</code> and a
+<code>size\_t kPrintPreviewResourcesSize</code>. All the resources in this
+resource map can be added as follows:
+
+```c++
+  webui::AddResourcePathsBulk(
+      source,
+      base::make_span(kPrintPreviewResources, kPrintPreviewResourcesSize));
+```
+
+<a name="SetupWebUIDataSource"></a>
+### webui::SetupWebUIDataSource() and webui::SetupBundledWebUIDataSource()
+
+These methods perform common configuration tasks on a data source for a Web UI
+that uses JS modules. When creating a Web UI that uses JS modules, use these
+utilities instead of duplicating the configuration steps they perform elsewhere.
+Specific setup steps performed by these utilities include:
+
+* Setting the content security policy to allow the data source to load only
+  resources from its own host (e.g. chrome://history), chrome://resources, and
+  chrome://test (used to load test files).
+* Enabling i18n template replacements by calling <code>UseStringsJs()</code> and
+  <code>EnableReplaceI18nInJS()</code> on the data source.
+* Adding the test loader files to the data source, so that test files can be
+  loaded as JS modules.
+* Setting the resource to load for the empty path.
+
+The version for non-bundled UIs (<code>SetupWebUIDataSource()</code>) also adds
+all resources in a GritResourceMap.
+
+The version for bundled UIs (<code>SetupBundledWebUIDataSource()</code>) adds
+a single specified bundled resource. Note that this version is only defined when
+the optimize_webui build flag is enabled.
+
 ## Browser (C++) &rarr; Renderer (JS)
 
 <a name="AllowJavascript"></a>
diff --git a/fuchsia/base/message_port.cc b/fuchsia/base/message_port.cc
index 345f6e3..22457729 100644
--- a/fuchsia/base/message_port.cc
+++ b/fuchsia/base/message_port.cc
@@ -24,6 +24,9 @@
 
 using BlinkMessage = blink::WebMessagePort::Message;
 
+// Converts a fuchsia::web::WebMessage to a BlinkMessage.
+// An empty result indicates that conversion was successful.
+// Data validation errors are returned as a FrameError.
 base::Optional<fuchsia::web::FrameError> BlinkMessageFromFidl(
     fuchsia::web::WebMessage fidl_message,
     BlinkMessage* blink_message) {
@@ -50,41 +53,17 @@
       blink_message->ports.push_back(
           BlinkMessagePortFromFidl(std::move(transferrable.message_port())));
     }
+  } else if (fidl_message.has_incoming_transfer()) {
+    for (fuchsia::web::IncomingTransferable& incoming :
+         *fidl_message.mutable_incoming_transfer()) {
+      blink_message->ports.push_back(
+          BlinkMessagePortFromFidl(std::move(incoming.message_port())));
+    }
   }
 
   return base::nullopt;
 }
 
-base::Optional<fuchsia::web::WebMessage> FidlWebMessageFromBlink(
-    BlinkMessage blink_message) {
-  fuchsia::web::WebMessage fidl_message;
-  if (!blink_message.ports.empty()) {
-    std::vector<fuchsia::web::IncomingTransferable> transferables;
-    for (blink::WebMessagePort& port : blink_message.ports) {
-      fuchsia::web::IncomingTransferable incoming;
-      incoming.set_message_port(FidlMessagePortFromBlink(std::move(port)));
-      transferables.push_back(std::move(incoming));
-    }
-    fidl_message.set_incoming_transfer(std::move(transferables));
-    blink_message.ports.clear();
-  }
-
-  base::string16 data_utf16 = std::move(blink_message.data);
-  std::string data_utf8;
-  if (!base::UTF16ToUTF8(data_utf16.data(), data_utf16.size(), &data_utf8))
-    return base::nullopt;
-
-  base::STLClearObject(&data_utf16);
-
-  fuchsia::mem::Buffer data =
-      cr_fuchsia::MemBufferFromString(data_utf8, "cr-web-message-from-blink");
-  if (!data.vmo)
-    return base::nullopt;
-
-  fidl_message.set_data(std::move(data));
-  return fidl_message;
-}
-
 // Defines a MessagePortAdapter, which translates and routes messages between a
 // FIDL MessagePort and a blink::WebMessagePort. Every MessagePortAdapter has
 // exactly one FIDL MessagePort and one blink::WebMessagePort.
@@ -129,7 +108,8 @@
   // blink::WebMessagePort::MessageReceiver implementation:
   bool OnMessage(BlinkMessage message) override {
     base::Optional<fuchsia::web::WebMessage> message_converted =
-        FidlWebMessageFromBlink(std::move(message));
+        FidlWebMessageFromBlink(std::move(message),
+                                TransferableHostType::kLocal);
     if (!message_converted) {
       DLOG(ERROR) << "Couldn't decode WebMessage from blink::WebMessagePort.";
       Destroy();
@@ -171,6 +151,10 @@
     });
   }
 
+  fidl::InterfaceRequest<fuchsia::web::MessagePort> NewRequest() {
+    return port_.NewRequest();
+  }
+
  private:
   ~FidlMessagePortClientAdapter() override = default;
 
@@ -307,12 +291,24 @@
   DISALLOW_COPY_AND_ASSIGN(FidlMessagePortServerAdapter);
 };
 
+fidl::InterfaceRequest<fuchsia::web::MessagePort>
+RemoteFidlMessagePortFromBlink(blink::WebMessagePort blink_port) {
+  fidl::InterfaceHandle<fuchsia::web::MessagePort> fidl_handle;
+  auto request = fidl_handle.NewRequest();
+  new FidlMessagePortClientAdapter(std::move(blink_port),
+                                   std::move(fidl_handle));
+  return request;
+}
+
 }  // namespace
 
+// Methods for constructing MessagePortAdapters for various port types and
+// origins. The adapters manage their own lifetimes and will self-delete when
+// either endpoint of their channels are disconnected.
+
 blink::WebMessagePort BlinkMessagePortFromFidl(
     fidl::InterfaceRequest<fuchsia::web::MessagePort> fidl_port) {
   auto port_pair = blink::WebMessagePort::CreatePair();
-  // The adapter cleans itself up when either of the associated ports is closed.
   new FidlMessagePortServerAdapter(std::move(port_pair.first),
                                    std::move(fidl_port));
   return std::move(port_pair.second);
@@ -321,7 +317,6 @@
 blink::WebMessagePort BlinkMessagePortFromFidl(
     fidl::InterfaceHandle<fuchsia::web::MessagePort> fidl_port) {
   auto port_pair = blink::WebMessagePort::CreatePair();
-  // The adapter cleans itself up when either of the associated ports is closed.
   new FidlMessagePortClientAdapter(std::move(port_pair.first),
                                    std::move(fidl_port));
   return std::move(port_pair.second);
@@ -333,4 +328,49 @@
   return adapter->NewBinding();
 }
 
+base::Optional<fuchsia::web::WebMessage> FidlWebMessageFromBlink(
+    BlinkMessage blink_message,
+    TransferableHostType port_type) {
+  fuchsia::web::WebMessage fidl_message;
+
+  if (!blink_message.ports.empty()) {
+    switch (port_type) {
+      case TransferableHostType::kLocal:
+        for (blink::WebMessagePort& port : blink_message.ports) {
+          fuchsia::web::IncomingTransferable incoming;
+          incoming.set_message_port(FidlMessagePortFromBlink(std::move(port)));
+          fidl_message.mutable_incoming_transfer()->push_back(
+              std::move(incoming));
+        }
+        break;
+      case TransferableHostType::kRemote:
+        for (blink::WebMessagePort& port : blink_message.ports) {
+          fuchsia::web::OutgoingTransferable outgoing;
+          outgoing.set_message_port(
+              RemoteFidlMessagePortFromBlink(std::move(port)));
+          fidl_message.mutable_outgoing_transfer()->push_back(
+              std::move(outgoing));
+        }
+        break;
+    }
+    blink_message.ports.clear();
+  }
+
+  base::string16 data_utf16 = std::move(blink_message.data);
+  std::string data_utf8;
+  if (!base::UTF16ToUTF8(data_utf16.data(), data_utf16.size(), &data_utf8))
+    return base::nullopt;
+
+  base::STLClearObject(&data_utf16);
+
+  constexpr char kBufferVmoName[] = "cr-web-message-from-blink";
+  fuchsia::mem::Buffer data_buffer =
+      cr_fuchsia::MemBufferFromString(data_utf8, kBufferVmoName);
+  if (!data_buffer.vmo)
+    return base::nullopt;
+
+  fidl_message.set_data(std::move(data_buffer));
+  return fidl_message;
+}
+
 }  // namespace cr_fuchsia
diff --git a/fuchsia/base/message_port.h b/fuchsia/base/message_port.h
index 8baf242..1902f50 100644
--- a/fuchsia/base/message_port.h
+++ b/fuchsia/base/message_port.h
@@ -29,6 +29,21 @@
 fidl::InterfaceHandle<fuchsia::web::MessagePort> FidlMessagePortFromBlink(
     blink::WebMessagePort blink_port);
 
+// Specifies the location of the MessagePort FIDL service that handles messages
+// sent over the Transferable.
+enum class TransferableHostType {
+  // The MessagePort FIDL service is hosted in-process.
+  kLocal,
+
+  // The MessagePort FIDL service is hosted remotely.
+  kRemote,
+};
+
+// Converts a BlinkMessage to a fuchsia::web::WebMessage.
+base::Optional<fuchsia::web::WebMessage> FidlWebMessageFromBlink(
+    blink::WebMessagePort::Message blink_message,
+    TransferableHostType port_type);
+
 }  // namespace cr_fuchsia
 
 #endif  // FUCHSIA_BASE_MESSAGE_PORT_H_
diff --git a/fuchsia/engine/browser/frame_impl.cc b/fuchsia/engine/browser/frame_impl.cc
index faee6acd..96077f4 100644
--- a/fuchsia/engine/browser/frame_impl.cc
+++ b/fuchsia/engine/browser/frame_impl.cc
@@ -690,11 +690,9 @@
     return;
   }
 
-  // Include outgoing MessagePorts in the message.
+  // Convert and pass along any MessagePorts contained in the message.
   std::vector<blink::WebMessagePort> message_ports;
   if (message.has_outgoing_transfer()) {
-    // Verify that all the Transferables are valid before we start allocating
-    // resources to them.
     for (const fuchsia::web::OutgoingTransferable& outgoing :
          message.outgoing_transfer()) {
       if (!outgoing.is_message_port()) {
diff --git a/fuchsia/runners/BUILD.gn b/fuchsia/runners/BUILD.gn
index 4b1a7c74..7ddaa53d 100644
--- a/fuchsia/runners/BUILD.gn
+++ b/fuchsia/runners/BUILD.gn
@@ -62,16 +62,21 @@
     "cast/cast_runner.h",
     "cast/cast_streaming.cc",
     "cast/cast_streaming.h",
-    "cast/named_message_port_connector.cc",
-    "cast/named_message_port_connector.h",
+    "cast/named_message_port_connector_fuchsia.cc",
+    "cast/named_message_port_connector_fuchsia.h",
     "cast/pending_cast_component.cc",
     "cast/pending_cast_component.h",
   ]
-  data_deps = [ "//chromecast/bindings:named_message_port_connector_resources" ]
-  data = [ "cast/data" ]
+  data = [
+    "cast/data/receiver.html",
+    "${root_gen_dir}/components/cast/named_message_port_connector/named_message_port_connector_resources.pak",
+  ]
   deps = [
     "//base",
+    "//components/cast/named_message_port_connector:named_message_port_connector",
+    "//components/cast/named_message_port_connector:resources",
     "//fuchsia/base",
+    "//fuchsia/base:message_port",
     "//fuchsia/base:modular",
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.modular",
     "//third_party/fuchsia-sdk/sdk/pkg/scenic_cpp",
@@ -95,7 +100,10 @@
     ":common",
     "//base",
     "//fuchsia/base",
+    "//mojo/core/embedder",  # TODO(crbug.com/1126571): Remove when MPP lands.
+    "//ui/base",
   ]
+  data_deps = [ ":cast_runner_core" ]
   visibility = [ ":*" ]
 }
 
@@ -157,7 +165,9 @@
     ":cast_runner_test_core",
     "//base/test:run_all_unittests",
     "//base/test:test_support",
+    "//components/cast/named_message_port_connector:resources",
     "//fuchsia/base:test_support",
+    "//mojo/core/embedder",  # TODO(crbug.com/1126571): Remove when MPP lands.
     "//net:test_support",
     "//testing/gtest",
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.camera3",
@@ -165,7 +175,9 @@
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.modular",
     "//third_party/fuchsia-sdk/sdk/pkg/scenic_cpp",
     "//third_party/fuchsia-sdk/sdk/pkg/sys_cpp",
+    "//ui/base",
   ]
+  data_deps = [ ":cast_runner_core" ]
   package_deps = [ [
         "//fuchsia/engine:web_engine",
         "web_engine",
@@ -175,7 +187,7 @@
 test("cast_runner_browsertests") {
   sources = [
     "cast/api_bindings_client_browsertest.cc",
-    "cast/named_message_port_connector_browsertest.cc",
+    "cast/named_message_port_connector_fuchsia_browsertest.cc",
   ]
   defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
   data = [ "cast/testdata" ]
@@ -186,6 +198,7 @@
     "//content/public/browser",
     "//content/test:test_support",
     "//fuchsia/base",
+    "//fuchsia/base:message_port",
     "//fuchsia/base:test_support",
     "//fuchsia/engine:browsertest_core",
     "//testing/gmock",
diff --git a/fuchsia/runners/cast/DEPS b/fuchsia/runners/cast/DEPS
index 3d2534c..c51cea95 100644
--- a/fuchsia/runners/cast/DEPS
+++ b/fuchsia/runners/cast/DEPS
@@ -1,3 +1,6 @@
 include_rules = [
+  "+components/cast/named_message_port_connector",
   "+content/public/test",
-]
\ No newline at end of file
+  "+mojo/core/embedder",
+  "+ui/base/resource",
+]
diff --git a/fuchsia/runners/cast/api_bindings_client.cc b/fuchsia/runners/cast/api_bindings_client.cc
index 9cd338c..88f02f8a 100644
--- a/fuchsia/runners/cast/api_bindings_client.cc
+++ b/fuchsia/runners/cast/api_bindings_client.cc
@@ -9,6 +9,7 @@
 #include "base/bind.h"
 #include "base/fuchsia/fuchsia_logging.h"
 #include "base/strings/string_piece.h"
+#include "fuchsia/base/message_port.h"
 
 namespace {
 
@@ -35,7 +36,7 @@
 
 ApiBindingsClient::~ApiBindingsClient() {
   if (connector_ && frame_) {
-    connector_->Register({});
+    connector_->RegisterPortHandler({});
 
     // Remove all injected scripts using their automatically enumerated IDs.
     for (uint64_t i = 0; i < bindings_->size(); ++i)
@@ -43,9 +44,10 @@
   }
 }
 
-void ApiBindingsClient::AttachToFrame(fuchsia::web::Frame* frame,
-                                      NamedMessagePortConnector* connector,
-                                      base::OnceClosure on_error_callback) {
+void ApiBindingsClient::AttachToFrame(
+    fuchsia::web::Frame* frame,
+    cast_api_bindings::NamedMessagePortConnector* connector,
+    base::OnceClosure on_error_callback) {
   DCHECK(!frame_) << "AttachToFrame() was called twice.";
   DCHECK(frame);
   DCHECK(connector);
@@ -62,8 +64,8 @@
     std::move(on_error_callback).Run();
   });
 
-  connector_->Register(base::BindRepeating(&ApiBindingsClient::OnPortConnected,
-                                           base::Unretained(this)));
+  connector_->RegisterPortHandler(base::BindRepeating(
+      &ApiBindingsClient::OnPortConnected, base::Unretained(this)));
 
   // Enumerate and inject all scripts in |bindings|.
   uint64_t bindings_id = kBindingsIdStart;
@@ -87,11 +89,15 @@
   return bindings_.has_value();
 }
 
-void ApiBindingsClient::OnPortConnected(
-    base::StringPiece port_name,
-    fidl::InterfaceHandle<fuchsia::web::MessagePort> port) {
-  if (bindings_service_)
-    bindings_service_->Connect(port_name.as_string(), std::move(port));
+bool ApiBindingsClient::OnPortConnected(base::StringPiece port_name,
+                                        blink::WebMessagePort port) {
+  if (!bindings_service_)
+    return false;
+
+  bindings_service_->Connect(
+      port_name.as_string(),
+      cr_fuchsia::FidlMessagePortFromBlink(std::move(port)));
+  return true;
 }
 
 void ApiBindingsClient::OnBindingsReceived(
diff --git a/fuchsia/runners/cast/api_bindings_client.h b/fuchsia/runners/cast/api_bindings_client.h
index 219e419..7ca8c1a 100644
--- a/fuchsia/runners/cast/api_bindings_client.h
+++ b/fuchsia/runners/cast/api_bindings_client.h
@@ -10,8 +10,8 @@
 
 #include "base/macros.h"
 #include "base/optional.h"
+#include "components/cast/named_message_port_connector/named_message_port_connector.h"
 #include "fuchsia/fidl/chromium/cast/cpp/fidl.h"
-#include "fuchsia/runners/cast/named_message_port_connector.h"
 
 // Injects scripts received from the ApiBindings service, and provides connected
 // ports to the Agent.
@@ -31,7 +31,7 @@
   // lost connection to the Agent). The callback must remain valid for the
   // entire lifetime of |this|.
   void AttachToFrame(fuchsia::web::Frame* frame,
-                     NamedMessagePortConnector* connector,
+                     cast_api_bindings::NamedMessagePortConnector* connector,
                      base::OnceClosure on_error_callback);
 
   // Indicates that the Frame is no longer live, preventing the API bindings
@@ -45,17 +45,15 @@
   // TODO(crbug.com/1082821): Move this method back to private once the Cast
   // Streaming Receiver component has been implemented.
   // Called when |connector_| has connected a port.
-  void OnPortConnected(base::StringPiece port_name,
-                       fidl::InterfaceHandle<fuchsia::web::MessagePort> port);
+  bool OnPortConnected(base::StringPiece port_name, blink::WebMessagePort port);
 
  private:
   // Called when ApiBindings::GetAll() has responded.
   void OnBindingsReceived(std::vector<chromium::cast::ApiBinding> bindings);
 
-
   base::Optional<std::vector<chromium::cast::ApiBinding>> bindings_;
   fuchsia::web::Frame* frame_ = nullptr;
-  NamedMessagePortConnector* connector_ = nullptr;
+  cast_api_bindings::NamedMessagePortConnector* connector_ = nullptr;
   chromium::cast::ApiBindingsPtr bindings_service_;
   base::OnceClosure on_initialization_complete_;
 
diff --git a/fuchsia/runners/cast/api_bindings_client_browsertest.cc b/fuchsia/runners/cast/api_bindings_client_browsertest.cc
index f6cd01d..7223552e 100644
--- a/fuchsia/runners/cast/api_bindings_client_browsertest.cc
+++ b/fuchsia/runners/cast/api_bindings_client_browsertest.cc
@@ -5,17 +5,24 @@
 #include <fuchsia/web/cpp/fidl.h>
 #include <lib/fidl/cpp/binding.h>
 
+#include "base/barrier_closure.h"
+#include "base/base_paths_fuchsia.h"
+#include "base/files/file_util.h"
+#include "base/path_service.h"
 #include "base/test/bind_test_util.h"
 #include "content/public/test/browser_test.h"
 #include "fuchsia/base/fit_adapter.h"
 #include "fuchsia/base/frame_test_util.h"
 #include "fuchsia/base/mem_buffer_util.h"
+#include "fuchsia/base/message_port.h"
 #include "fuchsia/base/result_receiver.h"
 #include "fuchsia/base/test_navigation_listener.h"
 #include "fuchsia/engine/test/web_engine_browser_test.h"
 #include "fuchsia/runners/cast/api_bindings_client.h"
+#include "fuchsia/runners/cast/named_message_port_connector_fuchsia.h"
 #include "fuchsia/runners/cast/test_api_bindings.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/resource/resource_bundle.h"
 
 namespace {
 
@@ -27,6 +34,8 @@
 
   ~ApiBindingsClientTest() override = default;
 
+  void SetUp() override { cr_fuchsia::WebEngineBrowserTest::SetUp(); }
+
  protected:
   void StartClient() {
     base::ScopedAllowBlockingForTesting allow_blocking;
@@ -41,7 +50,23 @@
 
     frame_ = WebEngineBrowserTest::CreateFrame(&navigation_listener_);
     frame_->GetNavigationController(controller_.NewRequest());
-    connector_ = std::make_unique<NamedMessagePortConnector>(frame_.get());
+
+    static bool g_js_resources_loaded = false;
+    if (!g_js_resources_loaded) {
+      base::FilePath pak_file;
+      bool result = base::PathService::Get(base::DIR_ASSETS, &pak_file);
+      DCHECK(result);
+      pak_file = pak_file.Append(
+          FILE_PATH_LITERAL("components/cast/named_message_port_connector/"
+                            "named_message_port_connector_resources.pak"));
+      DCHECK(base::PathExists(pak_file));
+      ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath(
+          pak_file, ui::ScaleFactor::SCALE_FACTOR_NONE);
+      g_js_resources_loaded = true;
+    }
+    connector_ =
+        std::make_unique<NamedMessagePortConnectorFuchsia>(frame_.get());
+
     client_->AttachToFrame(frame_.get(), connector_.get(),
                            base::MakeExpectedNotRunClosure(FROM_HERE));
   }
@@ -57,7 +82,7 @@
   }
 
   fuchsia::web::FramePtr frame_;
-  std::unique_ptr<NamedMessagePortConnector> connector_;
+  std::unique_ptr<NamedMessagePortConnectorFuchsia> connector_;
   TestApiBindings api_service_;
   fidl::Binding<chromium::cast::ApiBindings> api_service_binding_;
   std::unique_ptr<ApiBindingsClient> client_;
@@ -67,7 +92,11 @@
   DISALLOW_COPY_AND_ASSIGN(ApiBindingsClientTest);
 };
 
+// Tests API registration, injection, and message IPC.
+// Registers a port that echoes messages received over a MessagePort back to the
+// sender.
 IN_PROC_BROWSER_TEST_F(ApiBindingsClientTest, EndToEnd) {
+  // Define the injected bindings.
   std::vector<chromium::cast::ApiBinding> binding_list;
   chromium::cast::ApiBinding echo_binding;
   echo_binding.set_before_load_script(cr_fuchsia::MemBufferFromString(
@@ -75,24 +104,41 @@
       "test"));
   binding_list.emplace_back(std::move(echo_binding));
   api_service_.set_bindings(std::move(binding_list));
+
   StartClient();
 
+  base::RunLoop post_message_responses_loop;
+  base::RepeatingClosure post_message_response_closure =
+      base::BarrierClosure(2, post_message_responses_loop.QuitClosure());
+
+  // Navigate to a test page that makes use of the injected bindings.
   const GURL test_url = embedded_test_server()->GetURL("/echo.html");
   EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
       controller_.get(), fuchsia::web::LoadUrlParams(), test_url.spec()));
   navigation_listener_.RunUntilUrlEquals(test_url);
-  connector_->OnPageLoad();
+  frame_->PostMessage("*",
+                      std::move(*cr_fuchsia::FidlWebMessageFromBlink(
+                          connector_->GetConnectMessage(),
+                          cr_fuchsia::TransferableHostType::kRemote)),
+                      [&post_message_response_closure](
+                          fuchsia::web::Frame_PostMessage_Result result) {
+                        ASSERT_TRUE(result.is_response());
+                        post_message_response_closure.Run();
+                      });
 
-  fuchsia::web::MessagePortPtr port =
-      api_service_.RunUntilMessagePortReceived("echoService").Bind();
-
+  // Connect to the echo service hosted by the page and send a ping to it.
   fuchsia::web::WebMessage message;
   message.set_data(cr_fuchsia::MemBufferFromString("ping", "ping-msg"));
+  fuchsia::web::MessagePortPtr port =
+      api_service_.RunUntilMessagePortReceived("echoService").Bind();
   port->PostMessage(std::move(message),
-                    [](fuchsia::web::MessagePort_PostMessage_Result result) {
-                      EXPECT_TRUE(result.is_response());
+                    [&post_message_response_closure](
+                        fuchsia::web::MessagePort_PostMessage_Result result) {
+                      ASSERT_TRUE(result.is_response());
+                      post_message_response_closure.Run();
                     });
 
+  // Handle the ping response.
   base::RunLoop response_loop;
   cr_fuchsia::ResultReceiver<fuchsia::web::WebMessage> response(
       response_loop.QuitClosure());
@@ -104,6 +150,9 @@
   EXPECT_TRUE(
       cr_fuchsia::StringFromMemBuffer(response->data(), &response_string));
   EXPECT_EQ("ack ping", response_string);
+
+  // Ensure that we've received acks for all messages.
+  post_message_responses_loop.Run();
 }
 
 }  // namespace
diff --git a/fuchsia/runners/cast/cast_component.cc b/fuchsia/runners/cast/cast_component.cc
index 7bd5ed4..a0e98425 100644
--- a/fuchsia/runners/cast/cast_component.cc
+++ b/fuchsia/runners/cast/cast_component.cc
@@ -7,6 +7,7 @@
 #include <lib/fidl/cpp/binding.h>
 #include <lib/ui/scenic/cpp/view_ref_pair.h>
 #include <algorithm>
+#include <string>
 #include <utility>
 
 #include "base/auto_reset.h"
@@ -17,6 +18,7 @@
 #include "base/task/current_thread.h"
 #include "fuchsia/base/agent_manager.h"
 #include "fuchsia/base/mem_buffer_util.h"
+#include "fuchsia/base/message_port.h"
 #include "fuchsia/fidl/chromium/cast/cpp/fidl.h"
 #include "fuchsia/runners/cast/cast_runner.h"
 #include "fuchsia/runners/cast/cast_streaming.h"
@@ -78,7 +80,7 @@
 
   WebComponent::StartComponent();
 
-  connector_ = std::make_unique<NamedMessagePortConnector>(frame());
+  connector_ = std::make_unique<NamedMessagePortConnectorFuchsia>(frame());
 
   url_rewrite_rules_provider_.set_error_handler([this](zx_status_t status) {
     ZX_LOG_IF(ERROR, status != ZX_OK, status)
@@ -115,8 +117,9 @@
                              fuchsia::sys::TerminationReason::INTERNAL_ERROR);
           }
         });
-    api_bindings_client_->OnPortConnected(kCastStreamingMessagePortName,
-                                          std::move(message_port));
+    api_bindings_client_->OnPortConnected(
+        kCastStreamingMessagePortName,
+        cr_fuchsia::BlinkMessagePortFromFidl(std::move(message_port)));
   }
 
   api_bindings_client_->AttachToFrame(
@@ -166,6 +169,7 @@
   // frame() is about to be destroyed, so there is no need to perform cleanup
   // such as removing before-load JavaScripts.
   api_bindings_client_->DetachFromFrame(frame());
+  connector_->DetachFromFrame();
 
   WebComponent::DestroyComponent(exit_code, reason);
 }
@@ -181,8 +185,18 @@
 void CastComponent::OnNavigationStateChanged(
     fuchsia::web::NavigationState change,
     OnNavigationStateChangedCallback callback) {
-  if (change.has_is_main_document_loaded() && change.is_main_document_loaded())
-    connector_->OnPageLoad();
+  if (change.has_is_main_document_loaded() &&
+      change.is_main_document_loaded()) {
+    // Send the NamedMessagePortConnector handshake to the page.
+    frame()->PostMessage("*",
+                         *cr_fuchsia::FidlWebMessageFromBlink(
+                             connector_->GetConnectMessage(),
+                             cr_fuchsia::TransferableHostType::kRemote),
+                         [](fuchsia::web::Frame_PostMessage_Result result) {
+                           DCHECK(result.is_response());
+                         });
+  }
+
   WebComponent::OnNavigationStateChanged(std::move(change),
                                          std::move(callback));
 }
diff --git a/fuchsia/runners/cast/cast_component.h b/fuchsia/runners/cast/cast_component.h
index b158933..ff3646e 100644
--- a/fuchsia/runners/cast/cast_component.h
+++ b/fuchsia/runners/cast/cast_component.h
@@ -17,7 +17,7 @@
 #include "fuchsia/fidl/chromium/cast/cpp/fidl.h"
 #include "fuchsia/runners/cast/api_bindings_client.h"
 #include "fuchsia/runners/cast/application_controller_impl.h"
-#include "fuchsia/runners/cast/named_message_port_connector.h"
+#include "fuchsia/runners/cast/named_message_port_connector_fuchsia.h"
 #include "fuchsia/runners/common/web_component.h"
 
 namespace cr_fuchsia {
@@ -108,7 +108,7 @@
   std::vector<fuchsia::web::UrlRequestRewriteRule> initial_url_rewrite_rules_;
 
   bool constructor_active_ = false;
-  std::unique_ptr<NamedMessagePortConnector> connector_;
+  std::unique_ptr<NamedMessagePortConnectorFuchsia> connector_;
   std::unique_ptr<ApiBindingsClient> api_bindings_client_;
   std::unique_ptr<ApplicationControllerImpl> application_controller_;
   chromium::cast::ApplicationContextPtr application_context_;
diff --git a/fuchsia/runners/cast/cast_runner_integration_test.cc b/fuchsia/runners/cast/cast_runner_integration_test.cc
index d8589a0b..7211c89 100644
--- a/fuchsia/runners/cast/cast_runner_integration_test.cc
+++ b/fuchsia/runners/cast/cast_runner_integration_test.cc
@@ -16,6 +16,7 @@
 
 #include "base/base_paths_fuchsia.h"
 #include "base/callback_helpers.h"
+#include "base/files/file_util.h"
 #include "base/fuchsia/file_utils.h"
 #include "base/fuchsia/filtered_service_directory.h"
 #include "base/fuchsia/fuchsia_logging.h"
@@ -42,9 +43,11 @@
 #include "fuchsia/runners/cast/cast_runner.h"
 #include "fuchsia/runners/cast/fake_application_config_manager.h"
 #include "fuchsia/runners/cast/test_api_bindings.h"
+#include "mojo/core/embedder/embedder.h"
 #include "net/test/embedded_test_server/default_handlers.h"
 #include "net/test/embedded_test_server/http_request.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/resource/resource_bundle.h"
 
 namespace {
 
@@ -224,6 +227,23 @@
   CastRunnerIntegrationTest& operator=(const CastRunnerIntegrationTest&) =
       delete;
 
+  void SetUp() override {
+    mojo::core::Init();
+
+    static bool g_resources_loaded = false;
+    if (!g_resources_loaded) {
+      base::FilePath pak_file;
+      bool result = base::PathService::Get(base::DIR_ASSETS, &pak_file);
+      DCHECK(result);
+      pak_file = pak_file.Append(
+          FILE_PATH_LITERAL("components/cast/named_message_port_connector/"
+                            "named_message_port_connector_resources.pak"));
+      DCHECK(base::PathExists(pak_file));
+      ui::ResourceBundle::InitSharedInstanceWithPakPath(pak_file);
+      g_resources_loaded = true;
+    }
+  }
+
   void TearDown() override {
     if (component_controller_)
       ShutdownComponent();
diff --git a/fuchsia/runners/cast/main.cc b/fuchsia/runners/cast/main.cc
index df486ac..51756d1 100644
--- a/fuchsia/runners/cast/main.cc
+++ b/fuchsia/runners/cast/main.cc
@@ -9,6 +9,7 @@
 #include "base/fuchsia/scoped_service_binding.h"
 #include "base/message_loop/message_pump_type.h"
 #include "base/optional.h"
+#include "base/path_service.h"
 #include "base/run_loop.h"
 #include "base/task/single_thread_task_executor.h"
 #include "base/values.h"
@@ -18,6 +19,8 @@
 #include "fuchsia/base/init_logging.h"
 #include "fuchsia/base/inspect.h"
 #include "fuchsia/runners/cast/cast_runner.h"
+#include "mojo/core/embedder/embedder.h"
+#include "ui/base/resource/resource_bundle.h"
 
 namespace {
 
@@ -46,6 +49,16 @@
   return false;
 }
 
+void LoadResources() {
+  base::FilePath pak_file;
+  bool result = base::PathService::Get(base::DIR_ASSETS, &pak_file);
+  DCHECK(result);
+  pak_file = pak_file.Append(
+      FILE_PATH_LITERAL("components/cast_api_bindings/"
+                        "named_message_port_connector_resources.pak"));
+  ui::ResourceBundle::InitSharedInstanceWithPakPath(pak_file);
+}
+
 }  // namespace
 
 int main(int argc, char** argv) {
@@ -59,6 +72,10 @@
       *base::CommandLine::ForCurrentProcess()))
       << "Failed to initialize logging.";
 
+  mojo::core::Init();
+
+  LoadResources();
+
   cr_fuchsia::RegisterFuchsiaDirScheme();
 
   sys::OutgoingDirectory* const outgoing_directory =
diff --git a/fuchsia/runners/cast/named_message_port_connector.cc b/fuchsia/runners/cast/named_message_port_connector.cc
deleted file mode 100644
index 76b80b3..0000000
--- a/fuchsia/runners/cast/named_message_port_connector.cc
+++ /dev/null
@@ -1,123 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "fuchsia/runners/cast/named_message_port_connector.h"
-
-#include <memory>
-#include <utility>
-#include <vector>
-
-#include "base/callback.h"
-#include "base/files/file_path.h"
-#include "base/files/file_util.h"
-#include "base/logging.h"
-#include "base/macros.h"
-#include "base/path_service.h"
-#include "base/strings/string_piece.h"
-#include "base/strings/string_split.h"
-#include "fuchsia/base/mem_buffer_util.h"
-#include "fuchsia/runners/cast/cast_platform_bindings_ids.h"
-
-namespace {
-
-const char kBindingsJsPath[] = FILE_PATH_LITERAL(
-    "chromecast/bindings/resources/named_message_port_connector.js");
-const char kControlPortConnectMessage[] = "cast.master.connect";
-
-}  // namespace
-
-NamedMessagePortConnector::NamedMessagePortConnector(fuchsia::web::Frame* frame)
-    : frame_(frame) {
-  DCHECK(frame_);
-
-  // Inject the script providing the connection API into the Frame.
-  base::FilePath assets_path;
-  bool path_service_result =
-      base::PathService::Get(base::DIR_ASSETS, &assets_path);
-  DCHECK(path_service_result);
-  fuchsia::mem::Buffer bindings_script_ = cr_fuchsia::MemBufferFromFile(
-      base::File(assets_path.AppendASCII(kBindingsJsPath),
-                 base::File::FLAG_OPEN | base::File::FLAG_READ));
-
-  std::vector<std::string> origins = {"*"};
-  frame_->AddBeforeLoadJavaScript(
-      static_cast<uint64_t>(
-          CastPlatformBindingsId::NAMED_MESSAGE_PORT_CONNECTOR),
-      std::move(origins),
-      cr_fuchsia::CloneBuffer(bindings_script_, "cast-bindings-js"),
-      [](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
-        CHECK(result.is_response()) << "Couldn't inject bindings.";
-      });
-}
-
-NamedMessagePortConnector::~NamedMessagePortConnector() {
-  if (frame_) {
-    // Don't attempt to remove before-load JavaScript when being deleted because
-    // the Frame has disconnected.
-    frame_->RemoveBeforeLoadJavaScript(static_cast<uint64_t>(
-        CastPlatformBindingsId::NAMED_MESSAGE_PORT_CONNECTOR));
-  }
-}
-
-void NamedMessagePortConnector::Register(DefaultPortConnectedCallback handler) {
-  default_handler_ = std::move(handler);
-}
-
-void NamedMessagePortConnector::OnPageLoad() {
-  control_port_.Unbind();
-
-  fuchsia::web::WebMessage message;
-  message.set_data(cr_fuchsia::MemBufferFromString(kControlPortConnectMessage,
-                                                   "cast-connect-message"));
-  std::vector<fuchsia::web::OutgoingTransferable> outgoing_vector(1);
-  outgoing_vector[0].set_message_port(control_port_.NewRequest());
-  message.set_outgoing_transfer(std::move(outgoing_vector));
-
-  frame_->PostMessage("*", std::move(message),
-                      [](fuchsia::web::Frame_PostMessage_Result result) {
-                        DCHECK(result.is_response());
-                      });
-
-  ReceiveNextConnectRequest();
-}
-
-void NamedMessagePortConnector::ReceiveNextConnectRequest() {
-  DCHECK(control_port_);
-
-  control_port_->ReceiveMessage(
-      fit::bind_member(this, &NamedMessagePortConnector::OnConnectRequest));
-}
-
-void NamedMessagePortConnector::OnConnectRequest(
-    fuchsia::web::WebMessage message) {
-  std::string port_name;
-  if (!message.has_data() ||
-      !cr_fuchsia::StringFromMemBuffer(message.data(), &port_name)) {
-    LOG(ERROR) << "Couldn't read from message VMO.";
-    control_port_.Unbind();
-    return;
-  }
-
-  size_t num_transfers = message.has_incoming_transfer() ?
-    message.incoming_transfer().size() : 0U;
-  if (num_transfers != 1) {
-    LOG(ERROR) << "Expected one Transferable, got " << num_transfers
-               << " instead.";
-    control_port_.Unbind();
-    return;
-  }
-
-  fuchsia::web::IncomingTransferable& transferable =
-      (*message.mutable_incoming_transfer())[0];
-  if (!transferable.is_message_port()) {
-    LOG(ERROR) << "Transferable is not a MessagePort.";
-    control_port_.Unbind();
-    return;
-  }
-
-  DCHECK(default_handler_);
-  default_handler_.Run(port_name, std::move(transferable.message_port()));
-
-  ReceiveNextConnectRequest();
-}
diff --git a/fuchsia/runners/cast/named_message_port_connector.h b/fuchsia/runners/cast/named_message_port_connector.h
deleted file mode 100644
index db04a75..0000000
--- a/fuchsia/runners/cast/named_message_port_connector.h
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef FUCHSIA_RUNNERS_CAST_NAMED_MESSAGE_PORT_CONNECTOR_H_
-#define FUCHSIA_RUNNERS_CAST_NAMED_MESSAGE_PORT_CONNECTOR_H_
-
-#include <fuchsia/web/cpp/fidl.h>
-#include <lib/fidl/cpp/interface_handle.h>
-#include <map>
-#include <string>
-
-#include "base/callback.h"
-#include "base/macros.h"
-
-// Injects an API into |frame| through which it can connect MessagePorts to one
-// or more services registered by the caller.
-class NamedMessagePortConnector {
- public:
-  using DefaultPortConnectedCallback = base::RepeatingCallback<void(
-      base::StringPiece,
-      fidl::InterfaceHandle<fuchsia::web::MessagePort>)>;
-
-  explicit NamedMessagePortConnector(fuchsia::web::Frame* frame);
-  ~NamedMessagePortConnector();
-
-  // Sets the handler that is called for connected ports which aren't
-  // registered in advance.
-  void Register(DefaultPortConnectedCallback handler);
-
-  // Invoked by the caller after every |frame_| page load.
-  // Half-connected ports from prior page generations will be discarded.
-  void OnPageLoad();
-
- private:
-  // Gets the next port from |control_port_|.
-  void ReceiveNextConnectRequest();
-
-  // Handles a port received from |control_port_|.
-  void OnConnectRequest(fuchsia::web::WebMessage message);
-
-  fuchsia::web::Frame* const frame_;
-
-  // Invoked for ports which weren't previously Register()'ed.
-  DefaultPortConnectedCallback default_handler_;
-
-  fuchsia::web::MessagePortPtr control_port_;
-
-  DISALLOW_COPY_AND_ASSIGN(NamedMessagePortConnector);
-};
-
-#endif  // FUCHSIA_RUNNERS_CAST_NAMED_MESSAGE_PORT_CONNECTOR_H_
diff --git a/fuchsia/runners/cast/named_message_port_connector_fuchsia.cc b/fuchsia/runners/cast/named_message_port_connector_fuchsia.cc
new file mode 100644
index 0000000..9d76743
--- /dev/null
+++ b/fuchsia/runners/cast/named_message_port_connector_fuchsia.cc
@@ -0,0 +1,57 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "fuchsia/runners/cast/named_message_port_connector_fuchsia.h"
+
+#include <fuchsia/web/cpp/fidl.h>
+#include <memory>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "base/logging.h"
+#include "components/cast/named_message_port_connector/grit/named_message_port_connector_resources.h"
+#include "fuchsia/base/mem_buffer_util.h"
+#include "ui/base/resource/resource_bundle.h"
+
+namespace {
+constexpr uint64_t kPortConnectorBindingsId = 1000;
+}  // namespace
+
+NamedMessagePortConnectorFuchsia::NamedMessagePortConnectorFuchsia(
+    fuchsia::web::Frame* frame)
+    : frame_(frame) {
+  DCHECK(frame_);
+
+  std::string bindings_script_string =
+      ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
+          IDR_PORT_CONNECTOR_JS);
+  DCHECK(!bindings_script_string.empty())
+      << "NamedMessagePortConnector resources not loaded.";
+
+  // Inject the JS connection API into the Frame.
+  constexpr char kBindingsScriptVmoName[] = "port-connector-js";
+  fuchsia::mem::Buffer bindings_script = cr_fuchsia::MemBufferFromString(
+      std::move(bindings_script_string), kBindingsScriptVmoName);
+
+  std::vector<std::string> origins = {"*"};
+  frame_->AddBeforeLoadJavaScript(
+      kPortConnectorBindingsId, std::move(origins), std::move(bindings_script),
+      [](fuchsia::web::Frame_AddBeforeLoadJavaScript_Result result) {
+        CHECK(result.is_response())
+            << "Couldn't inject port connector bindings.";
+      });
+}
+
+NamedMessagePortConnectorFuchsia::~NamedMessagePortConnectorFuchsia() {
+  // Nothing to do if there is no attached Frame.
+  if (!frame_)
+    return;
+
+  frame_->RemoveBeforeLoadJavaScript(kPortConnectorBindingsId);
+}
+
+void NamedMessagePortConnectorFuchsia::DetachFromFrame() {
+  frame_ = nullptr;
+}
diff --git a/fuchsia/runners/cast/named_message_port_connector_fuchsia.h b/fuchsia/runners/cast/named_message_port_connector_fuchsia.h
new file mode 100644
index 0000000..75742a5
--- /dev/null
+++ b/fuchsia/runners/cast/named_message_port_connector_fuchsia.h
@@ -0,0 +1,36 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef FUCHSIA_RUNNERS_CAST_NAMED_MESSAGE_PORT_CONNECTOR_FUCHSIA_H_
+#define FUCHSIA_RUNNERS_CAST_NAMED_MESSAGE_PORT_CONNECTOR_FUCHSIA_H_
+
+#include "components/cast/named_message_port_connector/named_message_port_connector.h"
+
+namespace fuchsia {
+namespace web {
+class Frame;
+}
+}  // namespace fuchsia
+
+// Publishes NamedMessagePortConnector services to documents loaded in |frame|.
+// OnFrameDisconnect() should be called if the FramePtr is torn down before
+// |this|.
+class NamedMessagePortConnectorFuchsia
+    : public cast_api_bindings::NamedMessagePortConnector {
+ public:
+  explicit NamedMessagePortConnectorFuchsia(fuchsia::web::Frame* frame);
+  ~NamedMessagePortConnectorFuchsia() override;
+
+  NamedMessagePortConnectorFuchsia(const NamedMessagePortConnectorFuchsia&) =
+      delete;
+  void operator=(const NamedMessagePortConnectorFuchsia&) = delete;
+
+  // Called when the peer Frame connection has terminated.
+  void DetachFromFrame();
+
+ private:
+  fuchsia::web::Frame* frame_ = nullptr;
+};
+
+#endif  // FUCHSIA_RUNNERS_CAST_NAMED_MESSAGE_PORT_CONNECTOR_FUCHSIA_H_
diff --git a/fuchsia/runners/cast/named_message_port_connector_browsertest.cc b/fuchsia/runners/cast/named_message_port_connector_fuchsia_browsertest.cc
similarity index 65%
rename from fuchsia/runners/cast/named_message_port_connector_browsertest.cc
rename to fuchsia/runners/cast/named_message_port_connector_fuchsia_browsertest.cc
index d0151eb3..d6ea6186d 100644
--- a/fuchsia/runners/cast/named_message_port_connector_browsertest.cc
+++ b/fuchsia/runners/cast/named_message_port_connector_fuchsia_browsertest.cc
@@ -9,38 +9,54 @@
 #include "base/files/file_util.h"
 #include "base/macros.h"
 #include "base/path_service.h"
-#include "base/threading/thread_restrictions.h"
 #include "content/public/test/browser_test.h"
 #include "fuchsia/base/fit_adapter.h"
 #include "fuchsia/base/frame_test_util.h"
 #include "fuchsia/base/mem_buffer_util.h"
+#include "fuchsia/base/message_port.h"
 #include "fuchsia/base/result_receiver.h"
 #include "fuchsia/base/test_navigation_listener.h"
 #include "fuchsia/engine/test/web_engine_browser_test.h"
-#include "fuchsia/runners/cast/named_message_port_connector.h"
+#include "fuchsia/runners/cast/named_message_port_connector_fuchsia.h"
 #include "testing/gmock/include/gmock/gmock-matchers.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/resource/resource_bundle.h"
 #include "url/url_constants.h"
 
-class NamedMessagePortConnectorTest : public cr_fuchsia::WebEngineBrowserTest {
+class NamedMessagePortConnectorFuchsiaTest
+    : public cr_fuchsia::WebEngineBrowserTest {
  public:
-  NamedMessagePortConnectorTest() {
+  NamedMessagePortConnectorFuchsiaTest() {
     set_test_server_root(base::FilePath("fuchsia/runners/cast/testdata"));
-    navigation_listener_.SetBeforeAckHook(
-        base::BindRepeating(&NamedMessagePortConnectorTest::OnBeforeAckHook,
-                            base::Unretained(this)));
+    navigation_listener_.SetBeforeAckHook(base::BindRepeating(
+        &NamedMessagePortConnectorFuchsiaTest::OnBeforeAckHook,
+        base::Unretained(this)));
   }
 
-  ~NamedMessagePortConnectorTest() override = default;
+  ~NamedMessagePortConnectorFuchsiaTest() override = default;
 
  protected:
   // BrowserTestBase implementation.
   void SetUpOnMainThread() override {
     cr_fuchsia::WebEngineBrowserTest::SetUpOnMainThread();
     frame_ = WebEngineBrowserTest::CreateFrame(&navigation_listener_);
-    base::ScopedAllowBlockingForTesting allow_blocking;
-    connector_ = std::make_unique<NamedMessagePortConnector>(frame_.get());
+
+    static bool g_js_resources_loaded = false;
+    if (!g_js_resources_loaded) {
+      base::FilePath pak_file;
+      bool result = base::PathService::Get(base::DIR_ASSETS, &pak_file);
+      DCHECK(result);
+      pak_file = pak_file.Append(
+          FILE_PATH_LITERAL("components/cast/named_message_port_connector/"
+                            "named_message_port_connector_resources.pak"));
+      DCHECK(base::PathExists(pak_file));
+      ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath(
+          pak_file, ui::ScaleFactor::SCALE_FACTOR_NONE);
+      g_js_resources_loaded = true;
+    }
+    connector_ =
+        std::make_unique<NamedMessagePortConnectorFuchsia>(frame_.get());
   }
 
   // Intercepts the page load event to trigger the injection of |connector_|'s
@@ -50,8 +66,15 @@
       fuchsia::web::NavigationEventListener::OnNavigationStateChangedCallback
           callback) {
     if (change.has_is_main_document_loaded() &&
-        change.is_main_document_loaded())
-      connector_->OnPageLoad();
+        change.is_main_document_loaded()) {
+      frame_->PostMessage("*",
+                          std::move(*cr_fuchsia::FidlWebMessageFromBlink(
+                              connector_->GetConnectMessage(),
+                              cr_fuchsia::TransferableHostType::kRemote)),
+                          [](fuchsia::web::Frame_PostMessage_Result result) {
+                            DCHECK(result.is_response());
+                          });
+    }
 
     // Allow the TestNavigationListener's usual navigation event processing flow
     // to continue.
@@ -60,36 +83,42 @@
 
   std::unique_ptr<base::RunLoop> navigate_run_loop_;
   fuchsia::web::FramePtr frame_;
-  std::unique_ptr<NamedMessagePortConnector> connector_;
+  std::unique_ptr<NamedMessagePortConnectorFuchsia> connector_;
   cr_fuchsia::TestNavigationListener navigation_listener_;
 
-  DISALLOW_COPY_AND_ASSIGN(NamedMessagePortConnectorTest);
+  DISALLOW_COPY_AND_ASSIGN(NamedMessagePortConnectorFuchsiaTest);
 };
 
-IN_PROC_BROWSER_TEST_F(NamedMessagePortConnectorTest, EndToEnd) {
+IN_PROC_BROWSER_TEST_F(NamedMessagePortConnectorFuchsiaTest, EndToEnd) {
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL test_url(embedded_test_server()->GetURL("/connector.html"));
 
   fuchsia::web::NavigationControllerPtr controller;
   frame_->GetNavigationController(controller.NewRequest());
 
+  std::string received_port_name;
   fidl::InterfaceHandle<fuchsia::web::MessagePort> received_port;
   base::RunLoop receive_port_run_loop;
-  connector_->Register(base::BindRepeating(
-      [](fidl::InterfaceHandle<fuchsia::web::MessagePort>* received_port,
-         base::RunLoop* receive_port_run_loop, base::StringPiece name,
-         fidl::InterfaceHandle<fuchsia::web::MessagePort> message_port) {
-        *received_port = std::move(message_port);
+  connector_->RegisterPortHandler(base::BindRepeating(
+      [](std::string* received_port_name,
+         fidl::InterfaceHandle<fuchsia::web::MessagePort>* received_port,
+         base::RunLoop* receive_port_run_loop, base::StringPiece port_name,
+         blink::WebMessagePort port) -> bool {
+        *received_port_name = port_name.as_string();
+        *received_port = cr_fuchsia::FidlMessagePortFromBlink(std::move(port));
         receive_port_run_loop->Quit();
+        return true;
       },
-      base::Unretained(&received_port),
+      base::Unretained(&received_port_name), base::Unretained(&received_port),
       base::Unretained(&receive_port_run_loop)));
 
   EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
       controller.get(), fuchsia::web::LoadUrlParams(), test_url.spec()));
   navigation_listener_.RunUntilUrlEquals(test_url);
 
+  // The JS code in connector.html should connect to the port "echo".
   receive_port_run_loop.Run();
+  EXPECT_EQ(received_port_name, "echo");
 
   fuchsia::web::MessagePortPtr message_port = received_port.Bind();
 
@@ -130,9 +159,11 @@
   }
 }
 
-// Tests that the NamedMessagePortConnector can receive more than one port over
-// its lifetime.
-IN_PROC_BROWSER_TEST_F(NamedMessagePortConnectorTest, MultiplePorts) {
+// Tests that the NamedMessagePortConnectorFuchsia can receive more than one
+// port over its lifetime.
+IN_PROC_BROWSER_TEST_F(NamedMessagePortConnectorFuchsiaTest, MultiplePorts) {
+  constexpr size_t kExpectedPortCount = 3;
+
   ASSERT_TRUE(embedded_test_server()->Start());
   GURL test_url(
       embedded_test_server()->GetURL("/connector_multiple_ports.html"));
@@ -142,15 +173,18 @@
 
   std::vector<fidl::InterfaceHandle<fuchsia::web::MessagePort>> received_ports;
   base::RunLoop receive_ports_run_loop;
-  connector_->Register(base::BindRepeating(
+  connector_->RegisterPortHandler(base::BindRepeating(
       [](std::vector<fidl::InterfaceHandle<fuchsia::web::MessagePort>>*
              received_ports,
-         base::RunLoop* receive_ports_run_loop, base::StringPiece name,
-         fidl::InterfaceHandle<fuchsia::web::MessagePort> message_port) {
-        received_ports->push_back(std::move(message_port));
+         base::RunLoop* receive_ports_run_loop, base::StringPiece,
+         blink::WebMessagePort port) -> bool {
+        received_ports->push_back(
+            cr_fuchsia::FidlMessagePortFromBlink(std::move(port)));
 
-        if (received_ports->size() == 3)
+        if (received_ports->size() == kExpectedPortCount)
           receive_ports_run_loop->Quit();
+
+        return true;
       },
       base::Unretained(&received_ports),
       base::Unretained(&receive_ports_run_loop)));
@@ -158,7 +192,6 @@
   EXPECT_TRUE(cr_fuchsia::LoadUrlAndExpectResponse(
       controller.get(), fuchsia::web::LoadUrlParams(), test_url.spec()));
   navigation_listener_.RunUntilUrlEquals(test_url);
-
   receive_ports_run_loop.Run();
 
   for (fidl::InterfaceHandle<fuchsia::web::MessagePort>& message_port :
diff --git a/fuchsia/runners/cast/testdata/connector.html b/fuchsia/runners/cast/testdata/connector.html
index 2e505f7a..d6341858 100644
--- a/fuchsia/runners/cast/testdata/connector.html
+++ b/fuchsia/runners/cast/testdata/connector.html
@@ -2,7 +2,7 @@
   <head><title>bindings</title></head>
   <body>
     <script>
-      var testChannel = cast.__platform__.PortConnector.bind('hello');
+      var testChannel = cast.__platform__.PortConnector.bind('echo');
       testChannel.onmessage = function(msg) {
         testChannel.postMessage('ack ' + msg.data);
         return true;
diff --git a/gin/v8_platform_unittest.cc b/gin/v8_platform_unittest.cc
index 96c57a8..8dbfbd43 100644
--- a/gin/v8_platform_unittest.cc
+++ b/gin/v8_platform_unittest.cc
@@ -75,10 +75,8 @@
         : num_tasks_to_run(num_tasks_to_run) {}
     void Run(v8::JobDelegate* delegate) override { --(*num_tasks_to_run); }
 
-    // TODO(1114823): Cleanup the old version once migration is complete.
-    size_t GetMaxConcurrency() const override { return *num_tasks_to_run; }
     size_t GetMaxConcurrency(size_t /* worker_count*/) const override {
-      return GetMaxConcurrency();
+      return *num_tasks_to_run;
     }
 
     std::atomic_size_t* num_tasks_to_run;
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index 3037abf..25085c31 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -17207,7 +17207,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17244,7 +17244,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17281,7 +17281,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17318,7 +17318,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/binary_size\":{\"analyze_targets\":[\"//chrome/android:validate_expectations\",\"//chrome/android:monochrome_public_minimal_apks\",\"//tools/binary_size:binary_size_trybot_py\"],\"compile_targets\":[\"monochrome_public_minimal_apks\",\"monochrome_static_initializers\",\"validate_expectations\"]},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"binary_size_trybot\"}"
+      properties: "{\"$build/binary_size\":{\"analyze_targets\":[\"//chrome/android:validate_expectations\",\"//chrome/android:monochrome_public_minimal_apks\",\"//tools/binary_size:binary_size_trybot_py\"],\"compile_targets\":[\"monochrome_public_minimal_apks\",\"monochrome_static_initializers\",\"validate_expectations\"]},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"binary_size_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17355,7 +17355,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17392,7 +17392,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17429,7 +17429,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"swarming/deterministic_build\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"swarming/deterministic_build\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -17466,7 +17466,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"swarming/deterministic_build\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"swarming/deterministic_build\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -17503,7 +17503,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17540,7 +17540,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/code_coverage\":{\"use_java_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/code_coverage\":{\"use_java_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17577,7 +17577,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17614,7 +17614,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17651,7 +17651,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17688,7 +17688,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17725,7 +17725,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17762,7 +17762,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17799,7 +17799,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17836,7 +17836,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17873,7 +17873,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17910,7 +17910,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17947,7 +17947,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -17984,7 +17984,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18021,7 +18021,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18058,7 +18058,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18095,7 +18095,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18132,7 +18132,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18168,7 +18168,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18204,7 +18204,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18240,7 +18240,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18276,7 +18276,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18312,7 +18312,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18348,7 +18348,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18385,7 +18385,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18422,7 +18422,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18459,7 +18459,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18496,7 +18496,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18533,7 +18533,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18570,7 +18570,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18607,7 +18607,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18644,7 +18644,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18681,7 +18681,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18718,7 +18718,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18755,7 +18755,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18791,7 +18791,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -18828,7 +18828,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18865,7 +18865,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18902,7 +18902,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18939,7 +18939,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -18976,7 +18976,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19013,7 +19013,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19050,7 +19050,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19087,7 +19087,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19124,7 +19124,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19161,7 +19161,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19198,7 +19198,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19235,7 +19235,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$depot_tools/presubmit\":{\"runhooks\":true,\"timeout_s\":480},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"presubmit\",\"repo_name\":\"chromium\"}"
+      properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$depot_tools/presubmit\":{\"runhooks\":true,\"timeout_s\":480},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"presubmit\",\"repo_name\":\"chromium\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19272,7 +19272,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"closure_compilation\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"closure_compilation\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19307,7 +19307,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19342,7 +19342,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19377,7 +19377,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19412,7 +19412,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19447,7 +19447,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19482,7 +19482,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19518,7 +19518,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19555,7 +19555,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19592,7 +19592,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19629,7 +19629,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19666,7 +19666,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19703,7 +19703,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19740,7 +19740,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19777,7 +19777,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19814,7 +19814,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19851,7 +19851,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19888,7 +19888,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -19924,7 +19924,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -19960,7 +19960,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -19996,7 +19996,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20032,7 +20032,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20068,7 +20068,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20104,7 +20104,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20140,7 +20140,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20176,7 +20176,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20212,7 +20212,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20248,7 +20248,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20284,7 +20284,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20320,7 +20320,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20356,7 +20356,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20392,7 +20392,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20428,7 +20428,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20464,7 +20464,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20500,7 +20500,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20536,7 +20536,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20572,7 +20572,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20608,7 +20608,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20644,7 +20644,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20680,7 +20680,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20716,7 +20716,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20752,7 +20752,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20788,7 +20788,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20824,7 +20824,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20860,7 +20860,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20895,7 +20895,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20930,7 +20930,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -20965,7 +20965,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21000,7 +21000,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21035,7 +21035,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21070,7 +21070,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21105,7 +21105,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21140,7 +21140,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21175,7 +21175,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21210,7 +21210,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21245,7 +21245,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21280,7 +21280,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21315,7 +21315,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 43200
       expiration_secs: 7200
       caches {
@@ -21350,7 +21350,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21386,7 +21386,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21422,7 +21422,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21458,7 +21458,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21494,7 +21494,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21530,7 +21530,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21566,7 +21566,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21602,7 +21602,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21638,7 +21638,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21674,7 +21674,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21710,7 +21710,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21746,7 +21746,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21782,7 +21782,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21818,7 +21818,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21854,7 +21854,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21890,7 +21890,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21926,7 +21926,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21962,7 +21962,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -21998,7 +21998,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -22034,7 +22034,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -22070,7 +22070,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -22106,7 +22106,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -22141,7 +22141,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -22176,7 +22176,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -22212,7 +22212,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -22247,7 +22247,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22286,7 +22286,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22325,7 +22325,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/code_coverage\":{\"coverage_exclude_sources\":\"ios_test_files_and_test_utils\",\"coverage_test_types\":[\"unit\"],\"use_clang_coverage\":true},\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/code_coverage\":{\"coverage_exclude_sources\":\"ios_test_files_and_test_utils\",\"coverage_test_types\":[\"unit\"],\"use_clang_coverage\":true},\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22364,7 +22364,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22403,7 +22403,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"11e146\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"11e146\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22442,7 +22442,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"ios/try\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"ios/try\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22481,7 +22481,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22520,7 +22520,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22559,7 +22559,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22598,7 +22598,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22637,7 +22637,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22676,7 +22676,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22715,7 +22715,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"12a8189n\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22756,7 +22756,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22793,7 +22793,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22829,7 +22829,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22866,7 +22866,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22903,7 +22903,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22940,7 +22940,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -22977,7 +22977,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23014,7 +23014,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23051,7 +23051,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23088,7 +23088,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23125,7 +23125,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23162,7 +23162,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23199,7 +23199,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23236,7 +23236,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"tricium_clang_tidy_wrapper\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"tricium_clang_tidy_wrapper\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23273,7 +23273,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"tricium_clang_tidy_wrapper\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"tricium_clang_tidy_wrapper\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23308,7 +23308,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23345,7 +23345,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23382,7 +23382,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23419,7 +23419,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23456,7 +23456,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23493,7 +23493,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23530,7 +23530,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23567,7 +23567,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_libfuzzer_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_libfuzzer_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23604,7 +23604,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23641,7 +23641,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23678,7 +23678,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23715,7 +23715,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -23752,7 +23752,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -23789,7 +23789,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -23826,7 +23826,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -23863,7 +23863,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -23900,7 +23900,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -23937,7 +23937,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -23974,7 +23974,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -24011,7 +24011,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24048,7 +24048,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24085,7 +24085,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24122,7 +24122,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24159,7 +24159,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24195,7 +24195,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24231,7 +24231,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24268,7 +24268,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24305,7 +24305,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24342,7 +24342,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24379,7 +24379,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24416,7 +24416,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24453,7 +24453,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24490,7 +24490,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"swarming/deterministic_build\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"swarming/deterministic_build\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -24527,7 +24527,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24564,7 +24564,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24601,7 +24601,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24642,7 +24642,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24679,7 +24679,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24720,7 +24720,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24757,7 +24757,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24794,7 +24794,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24831,7 +24831,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24868,7 +24868,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24905,7 +24905,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24942,7 +24942,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -24978,7 +24978,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -25015,7 +25015,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_upload_clang\"}"
+      properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_upload_clang\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25052,7 +25052,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25087,7 +25087,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25123,7 +25123,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25159,7 +25159,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25194,7 +25194,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25229,7 +25229,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25265,7 +25265,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25301,7 +25301,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25336,7 +25336,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -25372,7 +25372,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25408,7 +25408,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25444,7 +25444,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25480,7 +25480,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25516,7 +25516,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25552,7 +25552,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25588,7 +25588,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25624,7 +25624,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25660,7 +25660,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25696,7 +25696,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25732,7 +25732,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25768,7 +25768,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25804,7 +25804,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25840,7 +25840,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25876,7 +25876,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25912,7 +25912,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -25947,7 +25947,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -25983,7 +25983,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$depot_tools/osx_sdk\":{\"sdk_version\":\"9a235\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_upload_clang\"}"
+      properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$depot_tools/osx_sdk\":{\"sdk_version\":\"9a235\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_upload_clang\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -26024,7 +26024,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26061,7 +26061,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"tricium_metrics\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"tricium_metrics\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26098,7 +26098,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26134,7 +26134,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26170,7 +26170,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26206,7 +26206,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26242,7 +26242,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.angle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26279,7 +26279,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26316,7 +26316,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26353,7 +26353,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"exclude\":\"chrome_only\",\"pool_name\":\"celab-chromium-try\",\"pool_size\":20,\"recipe\":\"celab\",\"tests\":\"*\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"exclude\":\"chrome_only\",\"pool_name\":\"celab-chromium-try\",\"pool_size\":20,\"recipe\":\"celab\",\"tests\":\"*\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26388,7 +26388,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26424,7 +26424,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_libfuzzer_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_libfuzzer_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26461,7 +26461,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26498,7 +26498,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -26535,7 +26535,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -26572,7 +26572,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -26609,7 +26609,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -26646,7 +26646,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"angle_chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -26683,7 +26683,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -26720,7 +26720,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.swangle\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 7200
       expiration_secs: 7200
       caches {
@@ -26757,7 +26757,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26794,7 +26794,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26831,7 +26831,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26868,7 +26868,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26904,7 +26904,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26941,7 +26941,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -26978,7 +26978,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27015,7 +27015,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 16200
       expiration_secs: 7200
       caches {
@@ -27052,7 +27052,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27089,7 +27089,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27126,7 +27126,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27163,7 +27163,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27200,7 +27200,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27237,7 +27237,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27274,7 +27274,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -27310,7 +27310,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_upload_clang\"}"
+      properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_upload_clang\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27347,7 +27347,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27416,7 +27416,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/binary_size\":{\"analyze_targets\":[\"//chrome/android:validate_expectations\",\"//chrome/android:monochrome_public_minimal_apks\",\"//tools/binary_size:binary_size_trybot_py\"],\"compile_targets\":[\"monochrome_public_minimal_apks\",\"monochrome_static_initializers\",\"validate_expectations\"]},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"binary_size_trybot\"}"
+      properties: "{\"$build/binary_size\":{\"analyze_targets\":[\"//chrome/android:validate_expectations\",\"//chrome/android:monochrome_public_minimal_apks\",\"//tools/binary_size:binary_size_trybot_py\"],\"compile_targets\":[\"monochrome_public_minimal_apks\",\"monochrome_static_initializers\",\"validate_expectations\"]},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"binary_size_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27453,7 +27453,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27490,7 +27490,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27527,7 +27527,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/code_coverage\":{\"use_java_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/code_coverage\":{\"use_java_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27564,7 +27564,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27601,7 +27601,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27638,7 +27638,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27675,7 +27675,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":300,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27712,7 +27712,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27749,7 +27749,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27786,7 +27786,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27823,7 +27823,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27859,7 +27859,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -27896,7 +27896,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.android\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27933,7 +27933,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -27970,7 +27970,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28007,7 +28007,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28044,7 +28044,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28081,7 +28081,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$depot_tools/presubmit\":{\"runhooks\":true,\"timeout_s\":480},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"presubmit\",\"repo_name\":\"chromium\"}"
+      properties: "{\"$build/goma\":{\"use_luci_auth\":true},\"$depot_tools/presubmit\":{\"runhooks\":true,\"timeout_s\":480},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"presubmit\",\"repo_name\":\"chromium\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28118,7 +28118,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"closure_compilation\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"closure_compilation\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28153,7 +28153,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28188,7 +28188,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28223,7 +28223,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28258,7 +28258,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.dawn\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28295,7 +28295,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28332,7 +28332,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28369,7 +28369,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28406,7 +28406,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28443,7 +28443,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28478,7 +28478,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"11e146\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"11e146\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28517,7 +28517,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"11e146\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"11e146\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28556,7 +28556,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"11e146\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\",\"xcode_build_version\":\"11e146\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28597,7 +28597,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.blink\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28634,7 +28634,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28671,7 +28671,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.chromiumos\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28708,7 +28708,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_libfuzzer_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_libfuzzer_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28745,7 +28745,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28782,7 +28782,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28819,7 +28819,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28856,7 +28856,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28893,7 +28893,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28934,7 +28934,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -28975,7 +28975,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -29012,7 +29012,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -29049,7 +29049,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -29085,7 +29085,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -29122,7 +29122,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.linux\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -29158,7 +29158,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -29194,7 +29194,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -29229,7 +29229,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.mac\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
@@ -29265,7 +29265,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_libfuzzer_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_libfuzzer_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -29302,7 +29302,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/code_coverage\":{\"use_clang_coverage\":true},\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -29339,7 +29339,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"jobs\":150,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 14400
       expiration_secs: 7200
       caches {
@@ -29376,7 +29376,7 @@
         cipd_version: "refs/heads/master"
         cmd: "recipes"
       }
-      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\"},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
+      properties: "{\"$build/goma\":{\"enable_ats\":true,\"rpc_extra_params\":\"?prod\",\"server_host\":\"goma.chromium.org\",\"use_luci_auth\":true},\"$kitchen\":{\"devshell\":true,\"git_auth\":true},\"$recipe_engine/isolated\":{\"server\":\"https://isolateserver.appspot.com\"},\"builder_group\":\"tryserver.chromium.win\",\"recipe\":\"chromium_trybot\"}"
       execution_timeout_secs: 21600
       expiration_secs: 7200
       caches {
diff --git a/infra/config/lib/try.star b/infra/config/lib/try.star
index c6a2c483..49e483a 100644
--- a/infra/config/lib/try.star
+++ b/infra/config/lib/try.star
@@ -121,6 +121,7 @@
         service_account = "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com",
         swarming_tags = ["vpython:native-python-wrapper"],
         task_template_canary_percentage = 5,
+        goma_use_luci_auth = True,
     )
     default_values.update(kwargs)
     for k, v in default_values.items():
diff --git a/ios/chrome/app/application_delegate/app_state.h b/ios/chrome/app/application_delegate/app_state.h
index 7d3fe25..1571846 100644
--- a/ios/chrome/app/application_delegate/app_state.h
+++ b/ios/chrome/app/application_delegate/app_state.h
@@ -115,8 +115,7 @@
 // Called when going into the background. iOS already broadcasts, so
 // stakeholders can register for it directly.
 - (void)applicationDidEnterBackground:(UIApplication*)application
-                         memoryHelper:(MemoryWarningHelper*)memoryHelper
-              incognitoContentVisible:(BOOL)incognitoContentVisible;
+                         memoryHelper:(MemoryWarningHelper*)memoryHelper;
 
 // Called when returning to the foreground. Resets and uploads the metrics.
 // Starts the browser to foreground if needed.
diff --git a/ios/chrome/app/application_delegate/app_state.mm b/ios/chrome/app/application_delegate/app_state.mm
index 4eb0da0..5a12074e2 100644
--- a/ios/chrome/app/application_delegate/app_state.mm
+++ b/ios/chrome/app/application_delegate/app_state.mm
@@ -10,7 +10,6 @@
 #include "base/callback.h"
 #include "base/critical_closure.h"
 #import "base/ios/crb_protocol_observers.h"
-#include "base/mac/bundle_locations.h"
 #include "base/mac/foundation_util.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/task/post_task.h"
@@ -104,8 +103,6 @@
   base::TimeTicks _sessionStartTime;
   // YES if the app is currently in the process of terminating.
   BOOL _appIsTerminating;
-  // Interstitial view used to block any incognito tabs after backgrounding.
-  UIView* _incognitoBlocker;
   // Whether the application is currently in the background.
   // This is a workaround for rdar://22392526 where
   // -applicationDidEnterBackground: can be called twice.
@@ -212,8 +209,7 @@
 #pragma mark - Public methods.
 
 - (void)applicationDidEnterBackground:(UIApplication*)application
-                         memoryHelper:(MemoryWarningHelper*)memoryHelper
-              incognitoContentVisible:(BOOL)incognitoContentVisible {
+                         memoryHelper:(MemoryWarningHelper*)memoryHelper {
   if ([self isInSafeMode]) {
     // Force a crash when backgrounding and in safe mode, so users don't get
     // stuck in safe mode.
@@ -255,34 +251,6 @@
 
   [_startupInformation expireFirstUserActionRecorder];
 
-  // If the current BVC is incognito, or if we are in the tab switcher and there
-  // are incognito tabs visible, place a full screen view containing the
-  // switcher background to hide any incognito content.
-  if (incognitoContentVisible) {
-    // Cover the largest area potentially shown in the app switcher, in case
-    // the screenshot is reused in a different orientation or size class.
-    CGRect screenBounds = [[UIScreen mainScreen] bounds];
-    CGFloat maxDimension =
-        std::max(CGRectGetWidth(screenBounds), CGRectGetHeight(screenBounds));
-    _incognitoBlocker = [[UIView alloc]
-        initWithFrame:CGRectMake(0, 0, maxDimension, maxDimension)];
-    NSBundle* mainBundle = base::mac::FrameworkBundle();
-    NSArray* topObjects =
-        [mainBundle loadNibNamed:@"LaunchScreen" owner:self options:nil];
-    UIViewController* launchScreenController =
-        base::mac::ObjCCastStrict<UIViewController>([topObjects lastObject]);
-    [_incognitoBlocker addSubview:[launchScreenController view]];
-    [launchScreenController view].autoresizingMask =
-        UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
-    _incognitoBlocker.autoresizingMask =
-        UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
-
-    // Adding |_incognitoBlocker| to |_window| won't cover overlay windows such
-    // as fullscreen video.  Instead use the sharedApplication |keyWindow|.
-    UIWindow* window = [[UIApplication sharedApplication] keyWindow];
-    [window addSubview:_incognitoBlocker];
-  }
-
   // Do not save cookies if it is already in progress.
   id<BrowserInterface> currentInterface =
       _browserLauncher.interfaceProvider.currentInterface;
@@ -344,9 +312,6 @@
         ->OnApplicationWillEnterForeground();
   }
 
-  [_incognitoBlocker removeFromSuperview];
-  _incognitoBlocker = nil;
-
   crash_keys::SetCurrentlyInBackground(false);
 
   // Update the state of metrics and crash reporting, as the method of
@@ -393,9 +358,6 @@
              connectionInformation:
                  (id<ConnectionInformation>)connectionInformation {
   DCHECK(!IsSceneStartupSupported());
-  [_incognitoBlocker removeFromSuperview];
-  _incognitoBlocker = nil;
-
   DCHECK([_browserLauncher browserInitializationStage] ==
          INITIALIZATION_STAGE_FOREGROUND);
 
diff --git a/ios/chrome/app/application_delegate/app_state_unittest.mm b/ios/chrome/app/application_delegate/app_state_unittest.mm
index 2558b6f..7823eb30 100644
--- a/ios/chrome/app/application_delegate/app_state_unittest.mm
+++ b/ios/chrome/app/application_delegate/app_state_unittest.mm
@@ -196,27 +196,6 @@
     browser_state_ = test_cbs_builder.Build();
   }
 
-  void initializeIncognitoBlocker(UIWindow* window) {
-    id application = [OCMockObject niceMockForClass:[UIApplication class]];
-    id memoryHelper = [OCMockObject mockForClass:[MemoryWarningHelper class]];
-    StubBrowserInterfaceProvider* interfaceProvider =
-        [[StubBrowserInterfaceProvider alloc] init];
-    std::unique_ptr<Browser> browser = std::make_unique<TestBrowser>();
-
-    [[startup_information_mock_ stub] expireFirstUserActionRecorder];
-    [[[memoryHelper stub] andReturnValue:@0] foregroundMemoryWarningCount];
-
-    interfaceProvider.mainInterface.browser = browser.get();
-
-    swizzleMetricsMediatorDisableReporting();
-
-    [app_state_ applicationDidEnterBackground:application
-                                 memoryHelper:memoryHelper
-                      incognitoContentVisible:YES];
-
-    metrics_mediator_called_ = NO;
-  }
-
   void swizzleConnectedScenes(NSArray<SceneState*>* connectedScenes) {
     connected_scenes_swizzle_block_ = ^NSArray<SceneState*>*(id self) {
       return connectedScenes;
@@ -269,8 +248,7 @@
         handle_startup_swizzle_block_));
   }
 
-  AppState* getAppStateWithOpenNTPAndIncognitoBlock(BOOL shouldOpenNTP,
-                                                    UIWindow* window) {
+  AppState* getAppStateWithOpenNTP(BOOL shouldOpenNTP, UIWindow* window) {
     AppState* appState = getAppStateWithRealWindow(window);
 
     id application = [OCMockObject mockForClass:[UIApplication class]];
@@ -297,8 +275,6 @@
                              metricsMediator:metricsMediator
                                 memoryHelper:memoryHelper];
 
-    initializeIncognitoBlocker(window);
-
     return appState;
   }
 
@@ -588,7 +564,7 @@
   EXPECT_TRUE(provider->cancel_called());
 }
 
-// Test that -resumeSessionWithTabOpener removes incognito blocker,
+// Test that -resumeSessionWithTabOpener
 // restart metrics and launchs from StartupParameters if they exist.
 TEST_F(AppStateTest, resumeSessionWithStartupParameters) {
   if (IsSceneStartupSupported()) {
@@ -627,10 +603,7 @@
   swizzleHandleStartupParameters(tabOpener, getBrowserState());
 
   ScopedKeyWindow scopedKeyWindow;
-  AppState* appState =
-      getAppStateWithOpenNTPAndIncognitoBlock(NO, scopedKeyWindow.Get());
-
-  ASSERT_EQ(NSUInteger(1), [scopedKeyWindow.Get() subviews].count);
+  AppState* appState = getAppStateWithOpenNTP(NO, scopedKeyWindow.Get());
 
   // Action.
   [appState resumeSessionWithTabOpener:tabOpener
@@ -638,12 +611,11 @@
                  connectionInformation:getConnectionInformationMock()];
 
   // Test.
-  EXPECT_EQ(NSUInteger(0), [scopedKeyWindow.Get() subviews].count);
   EXPECT_EQ(1, getProfileSessionDurationsService()->session_started_count());
   EXPECT_EQ(0, getProfileSessionDurationsService()->session_ended_count());
 }
 
-// Test that -resumeSessionWithTabOpener removes incognito blocker,
+// Test that -resumeSessionWithTabOpener
 // restart metrics and creates a new tab from tab switcher if shouldOpenNTP is
 // YES.
 TEST_F(AppStateTest, resumeSessionShouldOpenNTPTabSwitcher) {
@@ -681,10 +653,7 @@
   [[[tabSwitcher stub] andReturnValue:@YES] openNewTabFromTabSwitcher];
 
   ScopedKeyWindow scopedKeyWindow;
-  AppState* appState =
-      getAppStateWithOpenNTPAndIncognitoBlock(YES, scopedKeyWindow.Get());
-
-  ASSERT_EQ(NSUInteger(1), [scopedKeyWindow.Get() subviews].count);
+  AppState* appState = getAppStateWithOpenNTP(YES, scopedKeyWindow.Get());
 
   // Action.
   [appState resumeSessionWithTabOpener:tabOpener
@@ -695,7 +664,7 @@
   EXPECT_EQ(NSUInteger(0), [scopedKeyWindow.Get() subviews].count);
 }
 
-// Test that -resumeSessionWithTabOpener removes incognito blocker,
+// Test that -resumeSessionWithTabOpener,
 // restart metrics and creates a new tab if shouldOpenNTP is YES.
 TEST_F(AppStateTest, resumeSessionShouldOpenNTPNoTabSwitcher) {
   if (IsSceneStartupSupported()) {
@@ -746,11 +715,7 @@
   [[[tabSwitcher stub] andReturnValue:@NO] openNewTabFromTabSwitcher];
 
   ScopedKeyWindow scopedKeyWindow;
-  AppState* appState =
-      getAppStateWithOpenNTPAndIncognitoBlock(YES, scopedKeyWindow.Get());
-
-  // incognitoBlocker.
-  ASSERT_EQ(NSUInteger(1), [scopedKeyWindow.Get() subviews].count);
+  AppState* appState = getAppStateWithOpenNTP(YES, scopedKeyWindow.Get());
 
   // Action.
   [appState resumeSessionWithTabOpener:tabOpener
@@ -790,8 +755,7 @@
   [[getStartupInformationMock() expect] expireFirstUserActionRecorder];
   swizzleMetricsMediatorDisableReporting();
   [getAppStateWithMock() applicationDidEnterBackground:application
-                                          memoryHelper:memoryHelper
-                               incognitoContentVisible:YES];
+                                          memoryHelper:memoryHelper];
 
   void (^swizzleBlock)() = ^{
   };
@@ -887,7 +851,7 @@
   EXPECT_TRUE([getAppStateWithMock() isInSafeMode]);
 }
 
-// Tests that -applicationDidEnterBackground creates an incognito blocker.
+// Tests that -applicationDidEnterBackground calls the metrics mediator.
 TEST_F(AppStateTest, applicationDidEnterBackgroundIncognito) {
   // Setup.
   ScopedKeyWindow scopedKeyWindow;
@@ -910,17 +874,13 @@
 
   swizzleMetricsMediatorDisableReporting();
 
-  ASSERT_EQ(NSUInteger(0), [scopedKeyWindow.Get() subviews].count);
-
   // Action.
   [appState applicationDidEnterBackground:application
-                             memoryHelper:memoryHelper
-                  incognitoContentVisible:YES];
+                             memoryHelper:memoryHelper];
 
   // Tests.
   EXPECT_OCMOCK_VERIFY(startupInformation);
   EXPECT_TRUE(metricsMediatorHasBeenCalled());
-  EXPECT_EQ(NSUInteger(1), [scopedKeyWindow.Get() subviews].count);
 }
 
 // Tests that -applicationDidEnterBackground do nothing if the application has
@@ -941,46 +901,8 @@
   // Action.
   [getAppStateWithRealWindow(scopedKeyWindow.Get())
       applicationDidEnterBackground:application
-                       memoryHelper:memoryHelper
-            incognitoContentVisible:YES];
+                       memoryHelper:memoryHelper];
 
   // Tests.
   EXPECT_EQ(NSUInteger(0), [scopedKeyWindow.Get() subviews].count);
 }
-
-// Tests that -applicationDidEnterBackground does not create an incognito
-// blocker if there is no incognito tab.
-TEST_F(AppStateTest, applicationDidEnterBackgroundNoIncognitoBlocker) {
-  // Setup.
-  ScopedKeyWindow scopedKeyWindow;
-  id application = [OCMockObject niceMockForClass:[UIApplication class]];
-  id memoryHelper = [OCMockObject mockForClass:[MemoryWarningHelper class]];
-  StubBrowserInterfaceProvider* interfaceProvider = getInterfaceProvider();
-
-  std::unique_ptr<Browser> browser = std::make_unique<TestBrowser>();
-  id startupInformation = getStartupInformationMock();
-  id browserLauncher = getBrowserLauncherMock();
-  BrowserInitializationStageType stage = INITIALIZATION_STAGE_FOREGROUND;
-
-  AppState* appState = getAppStateWithRealWindow(scopedKeyWindow.Get());
-
-  [[startupInformation expect] expireFirstUserActionRecorder];
-  [[[memoryHelper stub] andReturnValue:@0] foregroundMemoryWarningCount];
-  interfaceProvider.incognitoInterface.browser = browser.get();
-  [[[browserLauncher stub] andReturnValue:@(stage)] browserInitializationStage];
-  [[[browserLauncher stub] andReturn:interfaceProvider] interfaceProvider];
-
-  swizzleMetricsMediatorDisableReporting();
-
-  ASSERT_EQ(NSUInteger(0), [scopedKeyWindow.Get() subviews].count);
-
-  // Action.
-  [appState applicationDidEnterBackground:application
-                             memoryHelper:memoryHelper
-                  incognitoContentVisible:NO];
-
-  // Tests.
-  EXPECT_OCMOCK_VERIFY(startupInformation);
-  EXPECT_TRUE(metricsMediatorHasBeenCalled());
-  EXPECT_EQ(NSUInteger(0), [scopedKeyWindow.Get() subviews].count);
-}
diff --git a/ios/chrome/app/main_application_delegate.mm b/ios/chrome/app/main_application_delegate.mm
index 0c23a33..ec93434 100644
--- a/ios/chrome/app/main_application_delegate.mm
+++ b/ios/chrome/app/main_application_delegate.mm
@@ -193,9 +193,7 @@
   }
 
   [_appState applicationDidEnterBackground:application
-                              memoryHelper:_memoryHelper
-                   incognitoContentVisible:self.sceneController
-                                               .incognitoContentVisible];
+                              memoryHelper:_memoryHelper];
 }
 
 // Called when returning to the foreground.
@@ -283,9 +281,7 @@
   DCHECK(IsSceneStartupSupported());
   if (@available(iOS 13, *)) {
     [_appState applicationDidEnterBackground:UIApplication.sharedApplication
-                                memoryHelper:_memoryHelper
-                     incognitoContentVisible:self.sceneController
-                                                 .incognitoContentVisible];
+                                memoryHelper:_memoryHelper];
   }
 }
 
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index b7f1e6e..a27d8c9 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1691,6 +1691,9 @@
       <message name="IDS_IOS_EXPORT_PASSWORDS_CANCEL_BUTTON" desc="Label of a confirmation dialog button which allows the user to cancel passwords export. [Length: 22em] [iOS only]">
         Cancel
       </message>
+      <message name="IDS_IOS_SETTINGS_SET_DEFAULT_BROWSER" desc="Title of the button allowing the user to change its default browser">
+Change Default Browser…
+</message>
       <message name="IDS_IOS_SETTINGS_EXPORT_PASSWORDS_SET_UP_SCREENLOCK_CONTENT" desc="Message informing the user that in order to export the passwords, a screen lock needs to be set up on the device. This is shown as an alert message after the user tries to view or copy the password from a settings page. [Length: about two lines]">
         To export passwords, you must first set a passcode on your device.
       </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_SET_DEFAULT_BROWSER.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_SET_DEFAULT_BROWSER.png.sha1
new file mode 100644
index 0000000..e160868
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_SETTINGS_SET_DEFAULT_BROWSER.png.sha1
@@ -0,0 +1 @@
+410c660f6bfe69425c20efc1ecd1e4f675aba70a
\ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
index a06b341..dcfc4f4 100644
--- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -279,7 +279,7 @@
 <translation id="411254640334432676">فشلت عملية التنزيل</translation>
 <translation id="4112644173421521737">بحث</translation>
 <translation id="4113030288477039509">يديره المسؤول</translation>
-<translation id="4121993058175073134">لإرسال بيانات تصدير الشبكة، يُرجى تهيئة حساب بريدك الإلكتروني في التطبيق "الإعدادات".</translation>
+<translation id="4121993058175073134">لإرسال بيانات تصدير الشبكة، يُرجى إعداد حساب بريدك الإلكتروني في التطبيق "الإعدادات".</translation>
 <translation id="4124987746317609294">النطاق الزمني</translation>
 <translation id="4152011295694446843">ستظهر الإشارات المرجعية هنا</translation>
 <translation id="4172051516777682613">الإظهار دائمًا</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb
index d48af74d..8d0630a 100644
--- a/ios/chrome/app/strings/resources/ios_strings_as.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -14,6 +14,7 @@
 <translation id="1084365883616172403">ফেচবুক প’ষ্ট দিয়া হ’ল।</translation>
 <translation id="1103523840287552314"><ph name="LANGUAGE" /> সদাই অনুবাদ কৰক</translation>
 <translation id="1104948393051856124">গ্ৰহণ কৰক আৰু অব্যাহত ৰাখক</translation>
+<translation id="110724200315609752">খোলা থকা ৱিণ্ড’লৈ যাওক</translation>
 <translation id="1112015203684611006">প্ৰিণ্টিং কৰিব পৰা নগ'ল।</translation>
 <translation id="1125564390852150847">নতুন টেব সৃষ্টি কৰক।</translation>
 <translation id="1145536944570833626">পূর্বে থকা ডেটা মচক।</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 83e0440..f50d6cd 100644
--- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
+++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -14,6 +14,7 @@
 <translation id="1084365883616172403">Facebook post completed.</translation>
 <translation id="1103523840287552314">Always translate <ph name="LANGUAGE" /></translation>
 <translation id="1104948393051856124">Accept &amp; Continue</translation>
+<translation id="110724200315609752">Switch to open window</translation>
 <translation id="1112015203684611006">Printing failed.</translation>
 <translation id="1125564390852150847">Create new tab.</translation>
 <translation id="1145536944570833626">Delete existing data.</translation>
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 47aa1eff..cf63965e 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -695,6 +695,9 @@
      flag_descriptions::kDefaultBrowserFullscreenPromoName,
      flag_descriptions::kDefaultBrowserFullscreenPromoDescription,
      flags_ui::kOsIos, FEATURE_VALUE_TYPE(kDefaultBrowserFullscreenPromo)},
+    {"default-browser-setting", flag_descriptions::kDefaultBrowserSettingsName,
+     flag_descriptions::kDefaultBrowserSettingsDescription, flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(kDefaultBrowserSettings)},
 };
 
 bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index bb550a9e..35a421a 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -182,6 +182,11 @@
     "rather than crashing. If enabled, DCHECKs will crash the calling process.";
 #endif  // defined(DCHECK_IS_CONFIGURABLE)
 
+const char kDefaultBrowserSettingsName[] = "Setting to change Default Browser";
+const char kDefaultBrowserSettingsDescription[] =
+    "When enabled, adds a button in the settings to allow changing the default "
+    "browser in the Settings.app.";
+
 const char kDefaultToDesktopOnIPadName[] = "Request desktop version by default";
 const char kDefaultToDesktopOnIPadDescription[] =
     "By default, on iPad, the desktop version of the web sites will be "
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index 1c9b8243..48cec0a6 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -146,6 +146,11 @@
 extern const char kDcheckIsFatalDescription[];
 #endif  // defined(DCHECK_IS_CONFIGURABLE)
 
+// Title and description for the flag to add the button in the settings to send
+// the users in the Settings.app to update the default browser.
+extern const char kDefaultBrowserSettingsName[];
+extern const char kDefaultBrowserSettingsDescription[];
+
 // Title and description for the flag to request the desktop version of web site
 // by default on iPad
 extern const char kDefaultToDesktopOnIPadName[];
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn
index 2a9f2f1c..56fdc65 100644
--- a/ios/chrome/browser/metrics/BUILD.gn
+++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -80,6 +80,7 @@
     "//ios/chrome/browser/sync",
     "//ios/chrome/browser/tabs",
     "//ios/chrome/browser/translate",
+    "//ios/chrome/browser/ui/overscroll_actions",
     "//ios/chrome/browser/ui/util:multiwindow_util",
     "//ios/chrome/browser/ui/whats_new:utils",
     "//ios/chrome/browser/variations",
diff --git a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
index 5cb2044..d564a273 100644
--- a/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
+++ b/ios/chrome/browser/metrics/ios_chrome_metrics_service_client.mm
@@ -17,6 +17,7 @@
 #include "base/command_line.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/persistent_histogram_allocator.h"
 #include "base/path_service.h"
@@ -63,6 +64,9 @@
 #include "ios/chrome/browser/chrome_paths.h"
 #include "ios/chrome/browser/google/google_brand.h"
 #include "ios/chrome/browser/history/history_service_factory.h"
+#import "ios/chrome/browser/main/browser.h"
+#import "ios/chrome/browser/main/browser_list.h"
+#import "ios/chrome/browser/main/browser_list_factory.h"
 #include "ios/chrome/browser/metrics/chrome_browser_state_client.h"
 #import "ios/chrome/browser/metrics/ios_chrome_default_browser_metrics_provider.h"
 #include "ios/chrome/browser/metrics/ios_chrome_stability_metrics_provider.h"
@@ -72,6 +76,8 @@
 #include "ios/chrome/browser/sync/profile_sync_service_factory.h"
 #include "ios/chrome/browser/tabs/tab_parenting_global_observer.h"
 #include "ios/chrome/browser/translate/translate_ranker_metrics_provider.h"
+#import "ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h"
+#include "ios/chrome/browser/web_state_list/web_state_list.h"
 #include "ios/chrome/common/channel_info.h"
 #include "ios/web/public/thread/web_thread.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
@@ -333,17 +339,17 @@
       task_info(mach_task_self(), TASK_VM_INFO,
                 reinterpret_cast<task_info_t>(&task_info_data), &count);
   if (kr == KERN_SUCCESS) {
-    UMA_HISTOGRAM_MEMORY_KB(
+    base::UmaHistogramMemoryKB(
         "Memory.Browser",
         (task_info_data.resident_size - task_info_data.reusable) / 1024);
     mach_vm_size_t footprint_mb = task_info_data.phys_footprint / 1024 / 1024;
-    UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Browser.MemoryFootprint",
-                                  footprint_mb);
+    base::UmaHistogramMemoryLargeMB("Memory.Browser.MemoryFootprint",
+                                    footprint_mb);
 
     switch (UIApplication.sharedApplication.applicationState) {
       case UIApplicationStateActive:
-        UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Browser.MemoryFootprint.Active",
-                                      footprint_mb);
+        base::UmaHistogramMemoryLargeMB("Memory.Browser.MemoryFootprint.Active",
+                                        footprint_mb);
         // According to Apple, apps on iPhone 6 and older devices get terminated
         // by the OS if memory usage crosses 200MB watermark. Obviously this
         // metric will not be recorded with true on iPhone 6 and older devices.
@@ -352,16 +358,43 @@
             footprint_mb >= 200);
         break;
       case UIApplicationStateInactive:
-        UMA_HISTOGRAM_MEMORY_LARGE_MB("Memory.Browser.MemoryFootprint.Inactive",
-                                      footprint_mb);
+        base::UmaHistogramMemoryLargeMB(
+            "Memory.Browser.MemoryFootprint.Inactive", footprint_mb);
         break;
       case UIApplicationStateBackground:
-        UMA_HISTOGRAM_MEMORY_LARGE_MB(
+        base::UmaHistogramMemoryLargeMB(
             "Memory.Browser.MemoryFootprint.Background", footprint_mb);
         break;
     }
   }
 
+  std::vector<ChromeBrowserState*> loaded_browser_states =
+      GetApplicationContext()
+          ->GetChromeBrowserStateManager()
+          ->GetLoadedBrowserStates();
+
+  int open_tabs_count = 0;
+  for (ChromeBrowserState* browser_state : loaded_browser_states) {
+    // Iterate through regular Browser and OTR Browser to find the corresponding
+    // tab.
+    BrowserList* browser_list =
+        BrowserListFactory::GetForBrowserState(browser_state);
+    std::set<Browser*> regular_browsers = browser_list->AllRegularBrowsers();
+    std::set<Browser*> otr_browsers = browser_list->AllIncognitoBrowsers();
+
+    for (Browser* browser : regular_browsers) {
+      open_tabs_count += browser->GetWebStateList()->count();
+    }
+    for (Browser* browser : otr_browsers) {
+      open_tabs_count += browser->GetWebStateList()->count();
+    }
+  }
+  base::UmaHistogramCounts10000("Memory.Browser.MemoryFootprint.NumOpenTabs",
+                                open_tabs_count);
+  base::UmaHistogramCounts10000(
+      "Memory.Browser.MemoryFootprint.NumLiveOverscroll",
+      [OverscrollActionsController instanceCount]);
+
   std::move(collect_final_metrics_done_callback_).Run();
 }
 
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 02aa1e7e..3be50be 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -2325,6 +2325,7 @@
       UIViewController* viewController =
           _ntpCoordinatorsForWebStates[webState].viewController;
       viewController.view.frame = [self ntpFrameForWebState:webState];
+      [viewController.view layoutIfNeeded];
       // TODO(crbug.com/873729): For a newly created WebState, the session will
       // not be restored until LoadIfNecessary call. Remove when fixed.
       webState->GetNavigationManager()->LoadIfNecessary();
@@ -4410,6 +4411,7 @@
     newPage = [self viewForWebState:webState];
     newPage.userInteractionEnabled = NO;
     newPage.frame = self.view.bounds;
+    [newPage layoutIfNeeded];
   } else {
     [self viewForWebState:webState].frame = self.contentArea.bounds;
     // Setting the frame here doesn't trigger a layout pass. Trigger it manually
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
index 059b0fb..5511a4c 100644
--- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
+++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_header_view_controller.mm
@@ -340,7 +340,7 @@
   [self.headerView.voiceSearchButton addTarget:self
                                         action:@selector(preloadVoiceSearch:)
                               forControlEvents:UIControlEventTouchDown];
-  self.headerView.voiceSearchButton.enabled = self.voiceSearchIsEnabled;
+  [self updateVoiceSearchDisplay];
 }
 
 // On NTP in split toolbar mode the omnibox has different location (in the
@@ -476,6 +476,15 @@
   }
 }
 
+// Ensures the state of the Voice Search button matches whether or not it's
+// enabled. If it's not, disables the button and removes it from the a11y loop
+// for VoiceOver.
+- (void)updateVoiceSearchDisplay {
+  self.headerView.voiceSearchButton.enabled = self.voiceSearchIsEnabled;
+  self.headerView.voiceSearchButton.isAccessibilityElement =
+      self.voiceSearchIsEnabled;
+}
+
 // Adds the constraints for the |logoView|, the |fakeomnibox| related to the
 // |headerView|. It also sets the properties constraints related to those views.
 - (void)addConstraintsForLogoView:(UIView*)logoView
@@ -700,7 +709,7 @@
   if (_voiceSearchIsEnabled == voiceSearchIsEnabled)
     return;
   _voiceSearchIsEnabled = voiceSearchIsEnabled;
-  self.headerView.voiceSearchButton.enabled = _voiceSearchIsEnabled;
+  [self updateVoiceSearchDisplay];
 }
 
 #pragma mark - UserAccountImageUpdateDelegate
diff --git a/ios/chrome/browser/ui/main/BUILD.gn b/ios/chrome/browser/ui/main/BUILD.gn
index 7bd1fe19..7a91f3f 100644
--- a/ios/chrome/browser/ui/main/BUILD.gn
+++ b/ios/chrome/browser/ui/main/BUILD.gn
@@ -36,6 +36,20 @@
   ]
 }
 
+source_set("incognito_blocker_scene_agent") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [
+    "incognito_blocker_scene_agent.h",
+    "incognito_blocker_scene_agent.mm",
+  ]
+  deps = [
+    ":scene_state_header",
+    "//base",
+    "//ios/chrome/browser/ui/util:multiwindow_util",
+  ]
+  frameworks = [ "UIKit.framework" ]
+}
+
 source_set("scene") {
   configs += [ "//build/config/compiler:enable_arc" ]
   sources = [
@@ -52,6 +66,7 @@
   ]
 
   deps = [
+    ":incognito_blocker_scene_agent",
     ":main",
     ":scene_guts",
     ":scene_testing",
@@ -193,10 +208,12 @@
   testonly = true
   sources = [
     "browser_view_wrangler_unittest.mm",
+    "incognito_blocker_scene_agent_unittest.mm",
     "scene_controller_unittest.mm",
     "scene_state_browser_agent_unittest.mm",
   ]
   deps = [
+    ":incognito_blocker_scene_agent",
     ":main",
     ":scene",
     "//base",
diff --git a/ios/chrome/browser/ui/main/incognito_blocker_scene_agent.h b/ios/chrome/browser/ui/main/incognito_blocker_scene_agent.h
new file mode 100644
index 0000000..64f213a
--- /dev/null
+++ b/ios/chrome/browser/ui/main/incognito_blocker_scene_agent.h
@@ -0,0 +1,15 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_MAIN_INCOGNITO_BLOCKER_SCENE_AGENT_H_
+#define IOS_CHROME_BROWSER_UI_MAIN_INCOGNITO_BLOCKER_SCENE_AGENT_H_
+
+#import "ios/chrome/browser/ui/main/scene_state.h"
+
+// A scene agent that shows a UI overlay to prevent incognito content from being
+// shown in the task switcher.
+@interface IncognitoBlockerSceneAgent : NSObject <SceneAgent>
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_MAIN_INCOGNITO_BLOCKER_SCENE_AGENT_H_
diff --git a/ios/chrome/browser/ui/main/incognito_blocker_scene_agent.mm b/ios/chrome/browser/ui/main/incognito_blocker_scene_agent.mm
new file mode 100644
index 0000000..57fb4a3
--- /dev/null
+++ b/ios/chrome/browser/ui/main/incognito_blocker_scene_agent.mm
@@ -0,0 +1,124 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/main/incognito_blocker_scene_agent.h"
+
+#include "base/mac/bundle_locations.h"
+#include "base/mac/foundation_util.h"
+#import "ios/chrome/browser/ui/util/multi_window_support.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface IncognitoBlockerSceneAgent () <SceneStateObserver>
+
+// Scene to which this agent is attached.
+// Implements the setter from SceneAgent protocol.
+@property(nonatomic, weak) SceneState* sceneState;
+
+// Interstitial view used to block any incognito tabs after backgrounding.
+@property(nonatomic, strong) UIView* overlayView;
+
+@end
+
+@implementation IncognitoBlockerSceneAgent
+
+#pragma mark - properties
+
+- (UIView*)overlayView {
+  if (!_overlayView) {
+    // Cover the largest area potentially shown in the app switcher, in case
+    // the screenshot is reused in a different orientation or size class.
+    CGRect screenBounds = [[UIScreen mainScreen] bounds];
+    CGFloat maxDimension =
+        std::max(CGRectGetWidth(screenBounds), CGRectGetHeight(screenBounds));
+    _overlayView = [[UIView alloc]
+        initWithFrame:CGRectMake(0, 0, maxDimension, maxDimension)];
+    UIViewController* launchScreenController =
+        [self loadLaunchScreenControllerFromBundle];
+    [_overlayView addSubview:launchScreenController.view];
+    _overlayView.autoresizingMask =
+        UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
+  }
+
+  return _overlayView;
+}
+
+#pragma mark - SceneAgent
+
+- (void)setSceneState:(SceneState*)sceneState {
+  DCHECK(!_sceneState);
+  _sceneState = sceneState;
+  [sceneState addObserver:self];
+}
+
+#pragma mark - SceneStateObserver
+
+- (void)sceneState:(SceneState*)sceneState
+    transitionedToActivationLevel:(SceneActivationLevel)level {
+  if (level == SceneActivationLevelBackground &&
+      sceneState.incognitoContentVisible) {
+    // If the current BVC is incognito, or if we are in the tab switcher and
+    // there are incognito tabs visible, place a full screen view containing
+    // the switcher background to hide any incognito content.
+    [self showOverlay];
+  }
+
+  if (level >= SceneActivationLevelForegroundInactive) {
+    [self hideOverlay];
+  }
+}
+
+#pragma mark - private
+
+- (void)showOverlay {
+  NSArray<UIWindow*>* windows = nil;
+
+  if (@available(iOS 13, *)) {
+    windows = self.sceneState.scene.windows;
+  } else {
+    windows = UIApplication.sharedApplication.windows;
+  }
+
+  // Adding |self.overlayView| to sceneState.window won't cover overlay windows
+  // such as fullscreen video.  Instead use the topmost window.
+
+  NSArray<UIWindow*>* sortedWindows =
+      [windows sortedArrayUsingComparator:^NSComparisonResult(UIWindow* w1,
+                                                              UIWindow* w2) {
+        if (w1.windowLevel == w2.windowLevel) {
+          return NSOrderedSame;
+        }
+        return w1.windowLevel < w2.windowLevel ? NSOrderedAscending
+                                               : NSOrderedDescending;
+      }];
+
+  UIWindow* topWindow = sortedWindows.lastObject;
+  [topWindow addSubview:self.overlayView];
+}
+
+- (void)hideOverlay {
+  if (!self.overlayView) {
+    return;
+  }
+  [self.overlayView removeFromSuperview];
+
+  // Get rid of the view to save memory.
+  self.overlayView = nil;
+}
+
+- (UIViewController*)loadLaunchScreenControllerFromBundle {
+  NSBundle* mainBundle = base::mac::FrameworkBundle();
+  NSArray* topObjects = [mainBundle loadNibNamed:@"LaunchScreen"
+                                           owner:self
+                                         options:nil];
+  UIViewController* launchScreenController =
+      base::mac::ObjCCastStrict<UIViewController>([topObjects lastObject]);
+  launchScreenController.view.autoresizingMask =
+      UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
+  return launchScreenController;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/main/incognito_blocker_scene_agent_unittest.mm b/ios/chrome/browser/ui/main/incognito_blocker_scene_agent_unittest.mm
new file mode 100644
index 0000000..27bb0e2
--- /dev/null
+++ b/ios/chrome/browser/ui/main/incognito_blocker_scene_agent_unittest.mm
@@ -0,0 +1,113 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/main/incognito_blocker_scene_agent.h"
+
+#include "testing/platform_test.h"
+#import "third_party/ocmock/OCMock/OCMock.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+class IncognitoBlockerSceneAgentTest : public PlatformTest {
+ public:
+  IncognitoBlockerSceneAgentTest()
+      : scene_state_([[SceneState alloc] initWithAppState:nil]),
+        scene_state_mock_(OCMPartialMock(scene_state_)),
+        agent_([[IncognitoBlockerSceneAgent alloc] init]) {
+    if (@available(iOS 13, *)) {
+      scene_mock_ = OCMClassMock([UIWindowScene class]);
+      scene_state_.scene = scene_mock_;
+      OCMStub([scene_state_mock_ scene]).andReturn(scene_mock_);
+    }
+    agent_.sceneState = scene_state_;
+  }
+
+ protected:
+  // The scene state that the agent works with.
+  SceneState* scene_state_;
+  // Mock for scene_state_'s underlying UIWindowScene.
+  id scene_mock_;
+  // Partial mock for stubbing scene_state_'s methods
+  id scene_state_mock_;
+  // The tested agent
+  IncognitoBlockerSceneAgent* agent_;
+};
+
+TEST_F(IncognitoBlockerSceneAgentTest, ShowIncognitoBlocker) {
+  // Pretend there's only one window on this scene.
+  UIWindow* window = [[UIWindow alloc] init];
+
+  id applicationWindowMock = nil;
+  if (@available(iOS 13, *)) {
+    OCMStub([scene_mock_ windows]).andReturn(@[ window ]);
+  } else {
+    applicationWindowMock = OCMPartialMock(UIApplication.sharedApplication);
+    OCMStub([applicationWindowMock windows]).andReturn(@[ window ]);
+  }
+
+  // Prepare to go to background with some incognito content.
+  scene_state_.activationLevel = SceneActivationLevelForegroundActive;
+  scene_state_.incognitoContentVisible = YES;
+  EXPECT_EQ(window.subviews.count, 0u);
+
+  // Upon background, the blocker should be added.
+  scene_state_.activationLevel = SceneActivationLevelBackground;
+  EXPECT_EQ(window.subviews.count, 1u);
+
+  // Upon foreground, the blocker should be removed.
+  scene_state_.activationLevel = SceneActivationLevelForegroundActive;
+  EXPECT_EQ(window.subviews.count, 0u);
+
+  // No blocker should be added when no incognito content is shown.
+  scene_state_.incognitoContentVisible = NO;
+  scene_state_.activationLevel = SceneActivationLevelBackground;
+  EXPECT_EQ(window.subviews.count, 0u);
+
+  [applicationWindowMock stopMocking];
+}
+
+// Test that when there are multiple windows, for example when there's a
+// fullscreen video playing in incognito in a scene, the overlay is added to it.
+TEST_F(IncognitoBlockerSceneAgentTest, ShowBlockerOnTopWindow) {
+  // Pretend there's two windows on this scene.
+  UIWindow* bottomWindow = [[UIWindow alloc] init];
+  bottomWindow.windowLevel = UIWindowLevelNormal;
+
+  UIWindow* topWindow = [[UIWindow alloc] init];
+  topWindow.windowLevel = UIWindowLevelStatusBar + 1;
+
+  NSArray* windows = @[ topWindow, bottomWindow ];
+
+  id applicationWindowMock = nil;
+  if (@available(iOS 13, *)) {
+    OCMStub([scene_mock_ windows]).andReturn(windows);
+  } else {
+    applicationWindowMock = OCMPartialMock(UIApplication.sharedApplication);
+    OCMStub([applicationWindowMock windows]).andReturn(windows);
+  }
+
+  // Prepare to go to background with some incognito content.
+  scene_state_.activationLevel = SceneActivationLevelForegroundActive;
+  scene_state_.incognitoContentVisible = YES;
+  EXPECT_EQ(topWindow.subviews.count, 0u);
+  EXPECT_EQ(bottomWindow.subviews.count, 0u);
+
+  // Upon background, the blocker should be added only to the topmost window.
+  scene_state_.activationLevel = SceneActivationLevelBackground;
+  EXPECT_EQ(topWindow.subviews.count, 1u);
+  EXPECT_EQ(bottomWindow.subviews.count, 0u);
+
+  // Upon foreground, the blocker should be removed.
+  scene_state_.activationLevel = SceneActivationLevelForegroundActive;
+  EXPECT_EQ(topWindow.subviews.count, 0u);
+  EXPECT_EQ(bottomWindow.subviews.count, 0u);
+
+  [applicationWindowMock stopMocking];
+}
+
+}  // anonymous namespace
diff --git a/ios/chrome/browser/ui/main/scene_controller.h b/ios/chrome/browser/ui/main/scene_controller.h
index eb260ff9..67f73ed 100644
--- a/ios/chrome/browser/ui/main/scene_controller.h
+++ b/ios/chrome/browser/ui/main/scene_controller.h
@@ -33,10 +33,6 @@
 // The state of the scene controlled by this object.
 @property(nonatomic, weak, readonly) SceneState* sceneState;
 
-// Returns whether the scene is showing or partially showing the
-// incognito panel.
-@property(nonatomic, assign, readonly) BOOL incognitoContentVisible;
-
 // A temporary pointer to MainController.
 @property(nonatomic, weak) id<MainControllerGuts> mainController;
 
diff --git a/ios/chrome/browser/ui/main/scene_controller.mm b/ios/chrome/browser/ui/main/scene_controller.mm
index e309bcfa..299bf3fe 100644
--- a/ios/chrome/browser/ui/main/scene_controller.mm
+++ b/ios/chrome/browser/ui/main/scene_controller.mm
@@ -61,6 +61,7 @@
 #import "ios/chrome/browser/ui/main/browser_interface_provider.h"
 #import "ios/chrome/browser/ui/main/browser_view_wrangler.h"
 #import "ios/chrome/browser/ui/main/default_browser_scene_agent.h"
+#import "ios/chrome/browser/ui/main/incognito_blocker_scene_agent.h"
 #import "ios/chrome/browser/ui/main/ui_blocker_scene_agent.h"
 #import "ios/chrome/browser/ui/scoped_ui_blocker/scoped_ui_blocker.h"
 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
@@ -235,6 +236,7 @@
 
     // Add agents.
     [_sceneState addAgent:[[UIBlockerSceneAgent alloc] init]];
+    [_sceneState addAgent:[[IncognitoBlockerSceneAgent alloc] init]];
   }
   return self;
 }
@@ -1008,7 +1010,7 @@
 }
 
 - (void)setIncognitoContentVisible:(BOOL)incognitoContentVisible {
-  _incognitoContentVisible = incognitoContentVisible;
+  self.sceneState.incognitoContentVisible = incognitoContentVisible;
 }
 
 - (void)startVoiceSearch {
diff --git a/ios/chrome/browser/ui/main/scene_controller_unittest.mm b/ios/chrome/browser/ui/main/scene_controller_unittest.mm
index 29be17d..ef2dbf8 100644
--- a/ios/chrome/browser/ui/main/scene_controller_unittest.mm
+++ b/ios/chrome/browser/ui/main/scene_controller_unittest.mm
@@ -32,4 +32,14 @@
 // open in new window coming from ios dock. 'Dock' is considered the default
 // when the new window opening request is external to chrome and unknown.
 
+// Tests that scene controller updates scene state's incognitoContentVisible
+// when the relevant application command is called.
+TEST_F(SceneControllerTest, UpdatesIncognitoContentVisibility) {
+  EXPECT_FALSE(scene_state_.incognitoContentVisible);
+  [scene_controller_ setIncognitoContentVisible:YES];
+  EXPECT_TRUE(scene_state_.incognitoContentVisible);
+  [scene_controller_ setIncognitoContentVisible:NO];
+  EXPECT_FALSE(scene_state_.incognitoContentVisible);
+}
+
 }  // namespace
diff --git a/ios/chrome/browser/ui/main/scene_state.h b/ios/chrome/browser/ui/main/scene_state.h
index f340f16..992abfe 100644
--- a/ios/chrome/browser/ui/main/scene_state.h
+++ b/ios/chrome/browser/ui/main/scene_state.h
@@ -82,6 +82,10 @@
 // WindowActivityRestoredOrigin.
 @property(nonatomic, assign) WindowActivityOrigin currentOrigin;
 
+// YES if some incognito content is visible, for example an incognito tab or the
+// incognito tab switcher.
+@property(nonatomic) BOOL incognitoContentVisible;
+
 // Window for the associated scene, if any.
 @property(nonatomic, strong) UIWindow* window;
 
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h
index 567cd0e0..6f157d4 100644
--- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h
+++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.h
@@ -98,6 +98,11 @@
 
 - (instancetype)init NS_UNAVAILABLE;
 
+// Investigation into crbug.com/1102494 shows that the most likely issue is
+// that there are many many instances of OverscrollActionsController live at
+// once. This tracks how many live instances there are.
++ (int)instanceCount;
+
 // The scrollview the overscroll controller will control.
 @property(weak, nonatomic, readonly) UIScrollView* scrollView;
 // The current state of the overscroll controller.
diff --git a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
index 567b50d..1ed2673 100644
--- a/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
+++ b/ios/chrome/browser/ui/overscroll_actions/overscroll_actions_controller.mm
@@ -74,6 +74,11 @@
 const CGFloat kSpringTightness = 2;
 const CGFloat kSpringDampiness = 0.5;
 
+// Investigation into crbug.com/1102494 shows that the most likely issue is
+// that there are many many instances of OverscrollActionsController live at
+// once. This tracks how many live instances there are.
+static int gInstanceCount = 0;
+
 // This holds the current state of the bounce back animation.
 typedef struct {
   CGFloat yInset;
@@ -277,6 +282,7 @@
       << "exactly one of scrollView and webViewProxy must be non-nil";
 
   if ((self = [super init])) {
+    gInstanceCount++;
     _overscrollActionView =
         [[OverscrollActionsView alloc] initWithFrame:CGRectZero];
     _overscrollActionView.delegate = self;
@@ -320,6 +326,11 @@
 - (void)dealloc {
   self.overscrollActionView.delegate = nil;
   [self invalidate];
+  gInstanceCount--;
+}
+
++ (int)instanceCount {
+  return gInstanceCount;
 }
 
 - (void)scheduleInvalidate {
diff --git a/ios/chrome/browser/ui/popup_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/BUILD.gn
index 80706ed..f8c47b1 100644
--- a/ios/chrome/browser/ui/popup_menu/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/BUILD.gn
@@ -26,6 +26,7 @@
     "resources:popup_menu_history",
     "resources:popup_menu_new_incognito_tab",
     "resources:popup_menu_new_tab",
+    "resources:popup_menu_new_window",
     "resources:popup_menu_paste_and_go",
     "resources:popup_menu_qr_scanner",
     "resources:popup_menu_read_later",
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
index 63a1db16..f552841f 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_mediator.mm
@@ -894,7 +894,7 @@
   // Create the menu item -- hardcoded string and no accessibility ID.
   PopupMenuToolsItem* openNewWindowItem = CreateTableViewItem(
       IDS_IOS_TOOLS_MENU_NEW_WINDOW, PopupMenuActionOpenNewWindow,
-      @"popup_menu_new_tab", kToolsMenuNewWindow);
+      @"popup_menu_new_window", kToolsMenuNewWindow);
 
   return @[ openNewWindowItem ];
 }
diff --git a/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn b/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn
index 6abd679..cdd05e9 100644
--- a/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/resources/BUILD.gn
@@ -216,6 +216,14 @@
   ]
 }
 
+imageset("popup_menu_new_window") {
+  sources = [
+    "popup_menu_new_window.imageset/Contents.json",
+    "popup_menu_new_window.imageset/popup_menu_new_window@2x.png",
+    "popup_menu_new_window.imageset/popup_menu_new_window@3x.png",
+  ]
+}
+
 imageset("popup_menu_help") {
   sources = [
     "popup_menu_help.imageset/Contents.json",
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_window.imageset/Contents.json b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_window.imageset/Contents.json
new file mode 100644
index 0000000..7caf556
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_window.imageset/Contents.json
@@ -0,0 +1,18 @@
+{
+    "images": [
+        {
+            "idiom": "universal",
+            "scale": "2x",
+            "filename": "popup_menu_new_window@2x.png"
+        },
+        {
+            "idiom": "universal",
+            "scale": "3x",
+            "filename": "popup_menu_new_window@3x.png"
+        }
+    ],
+    "info": {
+        "version": 1,
+        "author": "xcode"
+    }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_window.imageset/popup_menu_new_window@2x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_window.imageset/popup_menu_new_window@2x.png
new file mode 100644
index 0000000..0fb640e
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_window.imageset/popup_menu_new_window@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_window.imageset/popup_menu_new_window@3x.png b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_window.imageset/popup_menu_new_window@3x.png
new file mode 100644
index 0000000..20d58268
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/resources/popup_menu_new_window.imageset/popup_menu_new_window@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
index a0beb1c..6ee3a85 100644
--- a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
+++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
@@ -256,6 +256,23 @@
       assertWithMatcher:grey_notNil()];
 }
 
+// Tests that given two accounts A and B that are available on the device -
+// signing in and out from account A, then signing in to account B, properly
+// identifies the user with account B.
+- (void)testSwitchingAccountsWithClearedData {
+  FakeChromeIdentity* fakeIdentity1 = [SigninEarlGrey fakeIdentity1];
+  FakeChromeIdentity* fakeIdentity2 = [SigninEarlGrey fakeIdentity2];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity1];
+  [SigninEarlGrey addFakeIdentity:fakeIdentity2];
+
+  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity1];
+  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity1];
+  [SigninEarlGreyUI signOutAndClearDataFromDevice];
+
+  [SigninEarlGreyUI signinWithFakeIdentity:fakeIdentity2];
+  [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity2];
+}
+
 // Tests that the user isn't signed out and the UI is correct when the
 // disconnect is cancelled in the Account Settings screen.
 #if !TARGET_IPHONE_SIMULATOR
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
index 4236403f..2485838 100644
--- a/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_view_controller.mm
@@ -498,6 +498,12 @@
 
 - (void)showSignOutWithClearData:(BOOL)forceClearData
                         itemView:(UIView*)itemView {
+  if (_authenticationOperationInProgress || [_alertCoordinator isVisible] ||
+      self != [self.navigationController topViewController]) {
+    // An action is already in progress, ignore user's request.
+    return;
+  }
+
   NSString* alertMessage = nil;
   NSString* signOutTitle = nil;
   UIAlertActionStyle actionStyle = UIAlertActionStyleDefault;
@@ -537,51 +543,6 @@
   [_alertCoordinator start];
 }
 
-- (void)showSignOut {
-  if (_authenticationOperationInProgress || [_alertCoordinator isVisible] ||
-      self != [self.navigationController topViewController]) {
-    // An action is already in progress, ignore user's request.
-    return;
-  }
-
-  NSString* title = nil;
-  NSString* message = nil;
-  NSString* continueButtonTitle = nil;
-
-  if ([self authService] -> IsAuthenticatedIdentityManaged()) {
-    title =
-        l10n_util::GetNSString(IDS_IOS_MANAGED_DISCONNECT_DIALOG_TITLE_UNITY);
-    message = l10n_util::GetNSStringF(
-        IDS_IOS_MANAGED_DISCONNECT_DIALOG_INFO_UNITY, self.hostedDomain);
-    continueButtonTitle =
-        l10n_util::GetNSString(IDS_IOS_MANAGED_DISCONNECT_DIALOG_ACCEPT_UNITY);
-  } else {
-    title = l10n_util::GetNSString(IDS_IOS_DISCONNECT_DIALOG_TITLE_UNITY);
-    message =
-        l10n_util::GetNSString(IDS_IOS_DISCONNECT_DIALOG_INFO_MOBILE_UNITY);
-    continueButtonTitle = l10n_util::GetNSString(
-        IDS_IOS_DISCONNECT_DIALOG_CONTINUE_BUTTON_MOBILE);
-  }
-
-  _alertCoordinator =
-      [[AlertCoordinator alloc] initWithBaseViewController:self
-                                                   browser:_browser
-                                                     title:title
-                                                   message:message];
-
-  __weak AccountsTableViewController* weakSelf = self;
-  [_alertCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL)
-                               action:nil
-                                style:UIAlertActionStyleCancel];
-  [_alertCoordinator addItemWithTitle:continueButtonTitle
-                               action:^{
-                                 [weakSelf handleSignOutWithForceClearData:NO];
-                               }
-                                style:UIAlertActionStyleDefault];
-
-  [_alertCoordinator start];
-}
-
 - (void)handleSignOutWithForceClearData:(BOOL)forceClearData {
   AuthenticationService* authService = [self authService];
   if (authService->IsAuthenticated()) {
@@ -590,10 +551,7 @@
     authService->SignOut(
         signin_metrics::USER_CLICKED_SIGNOUT_SETTINGS, forceClearData, ^{
           [self allowUserInteraction];
-          _authenticationOperationInProgress = NO;
-          [base::mac::ObjCCastStrict<SettingsNavigationController>(
-              self.navigationController)
-              popViewControllerOrCloseSettingsAnimated:YES];
+          [self handleAuthenticationOperationDidFinish];
         });
     // Get UMA metrics on the usage of different options for signout available
     // for users with non-managed accounts.
diff --git a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
index 54dc38f..cfa1d1f 100644
--- a/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/settings_table_view_controller.mm
@@ -78,6 +78,7 @@
 #import "ios/chrome/browser/ui/table_view/cells/table_view_image_item.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_info_button_cell.h"
 #import "ios/chrome/browser/ui/table_view/cells/table_view_info_button_item.h"
+#import "ios/chrome/browser/ui/table_view/cells/table_view_text_item.h"
 #import "ios/chrome/browser/ui/table_view/table_view_model.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
@@ -135,6 +136,7 @@
   SectionIdentifierAdvanced,
   SectionIdentifierInfo,
   SectionIdentifierDebug,
+  SectionIdentifierDefaultBrowser,
 };
 
 typedef NS_ENUM(NSInteger, ItemType) {
@@ -159,6 +161,7 @@
   ItemTypeTableCellCatalog,
   ItemTypeArticlesForYou,
   ItemTypeSafetyCheck,
+  ItemTypeDefaultBrowser,
 };
 
 #if BUILDFLAG(CHROMIUM_BRANDING) && !defined(NDEBUG)
@@ -424,6 +427,14 @@
   [model addItem:[self googleServicesCellItem]
       toSectionWithIdentifier:SectionIdentifierAccount];
 
+  if (@available(iOS 14, *)) {
+    if (base::FeatureList::IsEnabled(kDefaultBrowserSettings)) {
+      [model addSectionWithIdentifier:SectionIdentifierDefaultBrowser];
+      [model addItem:[self defaultBrowserCellItem]
+          toSectionWithIdentifier:SectionIdentifierDefaultBrowser];
+    }
+  }
+
   // Basics section
   [model addSectionWithIdentifier:SectionIdentifierBasics];
   // Show managed UI if default search engine is managed by policy.
@@ -531,6 +542,16 @@
   return googleServicesItem;
 }
 
+- (TableViewItem*)defaultBrowserCellItem {
+  TableViewTextItem* defaultBrowser =
+      [[TableViewTextItem alloc] initWithType:ItemTypeDefaultBrowser];
+  defaultBrowser.text =
+      l10n_util::GetNSString(IDS_IOS_SETTINGS_SET_DEFAULT_BROWSER);
+  defaultBrowser.textColor = [UIColor colorNamed:kBlueColor];
+
+  return defaultBrowser;
+}
+
 - (TableViewItem*)accountCellItem {
   TableViewAccountItem* identityAccountItem =
       [[TableViewAccountItem alloc] initWithType:ItemTypeAccount];
@@ -917,6 +938,15 @@
       base::RecordAction(base::UserMetricsAction("Settings.GoogleServices"));
       [self showSyncGoogleService];
       break;
+    case ItemTypeDefaultBrowser:
+      [tableView deselectRowAtIndexPath:indexPath animated:YES];
+      base::RecordAction(base::UserMetricsAction("Settings.DefaultBrowser"));
+      [[UIApplication sharedApplication]
+                    openURL:
+                        [NSURL URLWithString:UIApplicationOpenSettingsURLString]
+                    options:{}
+          completionHandler:nil];
+      break;
     case ItemTypeSearchEngine:
       base::RecordAction(base::UserMetricsAction("EditSearchEngines"));
       controller = [[SearchEngineTableViewController alloc]
diff --git a/ios/chrome/browser/ui/tab_grid/grid/BUILD.gn b/ios/chrome/browser/ui/tab_grid/grid/BUILD.gn
index 8076b06d..64706a5 100644
--- a/ios/chrome/browser/ui/tab_grid/grid/BUILD.gn
+++ b/ios/chrome/browser/ui/tab_grid/grid/BUILD.gn
@@ -28,6 +28,10 @@
     "grid_theme.h",
     "grid_view_controller.h",
     "grid_view_controller.mm",
+    "horizontal_layout.h",
+    "horizontal_layout.mm",
+    "tab_switcher_layout.h",
+    "tab_switcher_layout.mm",
   ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_layout.h b/ios/chrome/browser/ui/tab_grid/grid/grid_layout.h
index 54c0844..7f0135a2 100644
--- a/ios/chrome/browser/ui/tab_grid/grid/grid_layout.h
+++ b/ios/chrome/browser/ui/tab_grid/grid/grid_layout.h
@@ -5,21 +5,10 @@
 #ifndef IOS_CHROME_BROWSER_UI_TAB_GRID_GRID_GRID_LAYOUT_H_
 #define IOS_CHROME_BROWSER_UI_TAB_GRID_GRID_GRID_LAYOUT_H_
 
-#import <UIKit/UIKit.h>
+#import "ios/chrome/browser/ui/tab_grid/grid/tab_switcher_layout.h"
 
-// Collection view flow layout that displays items in a grid. Items are
-// square-ish. Item sizes adapt to the size classes they are shown in. Item
-// deletions are animated.
-@interface GridLayout : UICollectionViewFlowLayout
-
-// Whether to animate item insertions and deletions.
-@property(nonatomic, assign) BOOL animatesItemUpdates;
-
-@end
-
-// A specialization of GridLayout that shows the UI in its "reordering" state,
-// with the moving cell enlarged and the non-moving cells transparent.
-@interface GridReorderingLayout : GridLayout
+// A specialization of TabSwitcherLayout that displays items in a grid.
+@interface GridLayout : TabSwitcherLayout
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_TAB_GRID_GRID_GRID_LAYOUT_H_
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_layout.mm b/ios/chrome/browser/ui/tab_grid/grid/grid_layout.mm
index 2a7f6e4..738da4a 100644
--- a/ios/chrome/browser/ui/tab_grid/grid/grid_layout.mm
+++ b/ios/chrome/browser/ui/tab_grid/grid/grid_layout.mm
@@ -10,20 +10,8 @@
 #error "This file requires ARC support."
 #endif
 
-@interface GridLayout ()
-@property(nonatomic, strong) NSArray<NSIndexPath*>* indexPathsOfDeletingItems;
-@property(nonatomic, strong) NSArray<NSIndexPath*>* indexPathsOfInsertingItems;
-@end
-
 @implementation GridLayout
 
-- (instancetype)init {
-  if (self = [super init]) {
-    _animatesItemUpdates = YES;
-  }
-  return self;
-}
-
 #pragma mark - UICollectionViewLayout
 
 // This is called whenever the layout is invalidated, including during rotation.
@@ -76,140 +64,5 @@
   }
 }
 
-- (void)prepareForCollectionViewUpdates:
-    (NSArray<UICollectionViewUpdateItem*>*)updateItems {
-  [super prepareForCollectionViewUpdates:updateItems];
-  // Track which items in this update are explicitly being deleted or inserted.
-  NSMutableArray<NSIndexPath*>* deletingItems =
-      [NSMutableArray arrayWithCapacity:updateItems.count];
-  NSMutableArray<NSIndexPath*>* insertingItems =
-      [NSMutableArray arrayWithCapacity:updateItems.count];
-  for (UICollectionViewUpdateItem* item in updateItems) {
-    switch (item.updateAction) {
-      case UICollectionUpdateActionDelete:
-        [deletingItems addObject:item.indexPathBeforeUpdate];
-        break;
-      case UICollectionUpdateActionInsert:
-        [insertingItems addObject:item.indexPathAfterUpdate];
-        break;
-      default:
-        break;
-    }
-  }
-  self.indexPathsOfDeletingItems = [deletingItems copy];
-  self.indexPathsOfInsertingItems = [insertingItems copy];
-}
-
-- (UICollectionViewLayoutAttributes*)
-finalLayoutAttributesForDisappearingItemAtIndexPath:
-    (NSIndexPath*)itemIndexPath {
-  // Return initial layout if animations are disabled.
-  if (!self.animatesItemUpdates) {
-    return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
-  }
-  // Note that this method is called for any item whose index path changing from
-  // |itemIndexPath|, which includes any items that were in the layout and whose
-  // index path is changing. For an item whose index path is changing, this
-  // method is called before
-  // -initialLayoutAttributesForAppearingItemAtIndexPath:
-  UICollectionViewLayoutAttributes* attributes = [[super
-      finalLayoutAttributesForDisappearingItemAtIndexPath:itemIndexPath] copy];
-  // Disappearing items that aren't being deleted just use the default
-  // attributes.
-  if (![self.indexPathsOfDeletingItems containsObject:itemIndexPath]) {
-    return attributes;
-  }
-  // Cells being deleted scale to 0, and are z-positioned behind all others.
-  // (Note that setting the zIndex here actually has no effect, despite what is
-  // implied in the UIKit documentation).
-  attributes.zIndex = -10;
-  // Scaled down to 0% (or near enough).
-  CGAffineTransform transform =
-      CGAffineTransformScale(attributes.transform, /*sx=*/0.01, /*sy=*/0.01);
-  attributes.transform = transform;
-  // Fade out.
-  attributes.alpha = 0.0;
-  return attributes;
-}
-
-- (UICollectionViewLayoutAttributes*)
-initialLayoutAttributesForAppearingItemAtIndexPath:(NSIndexPath*)itemIndexPath {
-  // Return final layout if animations are disabled.
-  if (!self.animatesItemUpdates) {
-    return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
-  }
-  // Note that this method is called for any item whose index path is becoming
-  // |itemIndexPath|, which includes any items that were in the layout but whose
-  // index path is changing. For an item whose index path is changing, this
-  // method is called after
-  // -finalLayoutAttributesForDisappearingItemAtIndexPath:
-  UICollectionViewLayoutAttributes* attributes = [[super
-      initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath] copy];
-  // Appearing items that aren't being inserted just use the default
-  // attributes.
-  if (![self.indexPathsOfInsertingItems containsObject:itemIndexPath]) {
-    return attributes;
-  }
-  // TODO(crbug.com/820410) : Polish the animation, and put constants where they
-  // belong.
-  // Cells being inserted start faded out, scaled down, and drop downwards
-  // slightly.
-  attributes.alpha = 0.0;
-  CGAffineTransform transform =
-      CGAffineTransformScale(attributes.transform, /*sx=*/0.9, /*sy=*/0.9);
-  transform = CGAffineTransformTranslate(transform, /*tx=*/0,
-                                         /*ty=*/attributes.size.height * 0.1);
-  attributes.transform = transform;
-  return attributes;
-}
-
-- (void)finalizeCollectionViewUpdates {
-  self.indexPathsOfDeletingItems = @[];
-  self.indexPathsOfInsertingItems = @[];
-}
-
-@end
-
-@implementation GridReorderingLayout
-
-#pragma mark - UICollectionViewLayout
-
-// Both -layoutAttributesForElementsInRect: and
-// -layoutAttributesForItemAtIndexPath: need to be overridden to change the
-// default layout attributes.
-- (NSArray<__kindof UICollectionViewLayoutAttributes*>*)
-layoutAttributesForElementsInRect:(CGRect)rect {
-  NSArray* baseAttributes = [super layoutAttributesForElementsInRect:rect];
-  NSMutableArray<__kindof UICollectionViewLayoutAttributes*>* attributes =
-      [NSMutableArray array];
-  for (UICollectionViewLayoutAttributes* attribute in baseAttributes) {
-    UICollectionViewLayoutAttributes* newAttribute = [attribute copy];
-    newAttribute.alpha = kReorderingInactiveCellOpacity;
-    [attributes addObject:newAttribute];
-  }
-  return [attributes copy];
-}
-
-- (UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:
-    (NSIndexPath*)indexPath {
-  UICollectionViewLayoutAttributes* attributes =
-      [[super layoutAttributesForItemAtIndexPath:indexPath] copy];
-  attributes.alpha = kReorderingInactiveCellOpacity;
-  return attributes;
-}
-
-- (UICollectionViewLayoutAttributes*)
-layoutAttributesForInteractivelyMovingItemAtIndexPath:(NSIndexPath*)indexPath
-                                   withTargetPosition:(CGPoint)position {
-  UICollectionViewLayoutAttributes* attributes = [[super
-      layoutAttributesForInteractivelyMovingItemAtIndexPath:indexPath
-                                         withTargetPosition:position] copy];
-  // The moving item has regular opacity, but is scaled.
-  attributes.alpha = 1.0;
-  attributes.transform =
-      CGAffineTransformScale(attributes.transform, kReorderingActiveCellScale,
-                             kReorderingActiveCellScale);
-  return attributes;
-}
 
 @end
diff --git a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm
index d951779e..12b477e9 100644
--- a/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm
+++ b/ios/chrome/browser/ui/tab_grid/grid/grid_view_controller.mm
@@ -21,6 +21,7 @@
 #import "ios/chrome/browser/ui/tab_grid/grid/grid_image_data_source.h"
 #import "ios/chrome/browser/ui/tab_grid/grid/grid_item.h"
 #import "ios/chrome/browser/ui/tab_grid/grid/grid_layout.h"
+#import "ios/chrome/browser/ui/tab_grid/grid/tab_switcher_layout.h"
 #import "ios/chrome/browser/ui/tab_grid/transitions/grid_transition_layout.h"
 #include "ios/chrome/browser/ui/ui_feature_flags.h"
 #import "ios/chrome/browser/ui/util/uikit_ui_util.h"
@@ -76,8 +77,8 @@
 @property(nonatomic, assign) CGPoint itemReorderTouchPoint;
 // Animator to show or hide the empty state.
 @property(nonatomic, strong) UIViewPropertyAnimator* emptyStateAnimator;
-// The default layout for the tab grid.
-@property(nonatomic, strong) GridLayout* defaultLayout;
+// The default layout for the tab switcher.
+@property(nonatomic, strong) TabSwitcherLayout* defaultLayout;
 // The layout used while the grid is being reordered.
 @property(nonatomic, strong) UICollectionViewLayout* reorderingLayout;
 // YES if, when reordering is enabled, the order of the cells has changed.
@@ -137,7 +138,7 @@
     collectionView.dropDelegate = self;
     collectionView.dragInteractionEnabled = YES;
   } else {
-    self.reorderingLayout = [[GridReorderingLayout alloc] init];
+    self.reorderingLayout = [[TabSwitcherReorderingLayout alloc] init];
     self.itemReorderRecognizer = [[UILongPressGestureRecognizer alloc]
         initWithTarget:self
                 action:@selector(handleItemReorderingWithGesture:)];
diff --git a/ios/chrome/browser/ui/tab_grid/grid/horizontal_layout.h b/ios/chrome/browser/ui/tab_grid/grid/horizontal_layout.h
new file mode 100644
index 0000000..5566d90f
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_grid/grid/horizontal_layout.h
@@ -0,0 +1,14 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_TAB_GRID_GRID_HORIZONTAL_LAYOUT_H_
+#define IOS_CHROME_BROWSER_UI_TAB_GRID_GRID_HORIZONTAL_LAYOUT_H_
+
+#import "ios/chrome/browser/ui/tab_grid/grid/tab_switcher_layout.h"
+
+// A specialization of TabSwitcherLayout that displays items horizontally.
+@interface HorizontalLayout : TabSwitcherLayout
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_TAB_GRID_GRID_HORIZONTAL_LAYOUT_H_
diff --git a/ios/chrome/browser/ui/tab_grid/grid/horizontal_layout.mm b/ios/chrome/browser/ui/tab_grid/grid/horizontal_layout.mm
new file mode 100644
index 0000000..7ae2e3af
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_grid/grid/horizontal_layout.mm
@@ -0,0 +1,37 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/tab_grid/grid/horizontal_layout.h"
+
+#import "ios/chrome/browser/ui/tab_grid/grid/grid_constants.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation HorizontalLayout
+
+- (instancetype)init {
+  if (self = [super init]) {
+    self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
+  }
+  return self;
+}
+
+#pragma mark - UICollectionViewLayout
+
+// This is called whenever the layout is invalidated, including during rotation.
+// Resizes item, margins, and spacing to fit new size classes and width.
+- (void)prepareLayout {
+  [super prepareLayout];
+
+  self.itemSize = kGridCellSizeSmall;
+  CGFloat height = CGRectGetHeight(self.collectionView.bounds);
+  CGFloat spacing = kGridLayoutLineSpacingCompactCompactLimitedWidth;
+  self.sectionInset = UIEdgeInsets{
+      spacing, spacing, height - self.itemSize.height - 2 * spacing, spacing};
+  self.minimumLineSpacing = kGridLayoutLineSpacingRegularRegular;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/tab_grid/grid/tab_switcher_layout.h b/ios/chrome/browser/ui/tab_grid/grid/tab_switcher_layout.h
new file mode 100644
index 0000000..62e07d0
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_grid/grid/tab_switcher_layout.h
@@ -0,0 +1,25 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_TAB_GRID_GRID_TAB_SWITCHER_LAYOUT_H_
+#define IOS_CHROME_BROWSER_UI_TAB_GRID_GRID_TAB_SWITCHER_LAYOUT_H_
+
+#import <UIKit/UIKit.h>
+
+// Collection view flow layout that displays items in a grid or horizontally.
+// Items are square-ish. Item sizes adapt to the size classes they are shown in.
+// Item deletions are animated.
+@interface TabSwitcherLayout : UICollectionViewFlowLayout
+
+// Whether to animate item insertions and deletions.
+@property(nonatomic, assign) BOOL animatesItemUpdates;
+
+@end
+
+// A specialization of TabSwitcherLayout that shows the UI in its "reordering"
+// state, with the moving cell enlarged and the non-moving cells transparent.
+@interface TabSwitcherReorderingLayout : TabSwitcherLayout
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_TAB_GRID_GRID_TAB_SWITCHER_LAYOUT_H_
diff --git a/ios/chrome/browser/ui/tab_grid/grid/tab_switcher_layout.mm b/ios/chrome/browser/ui/tab_grid/grid/tab_switcher_layout.mm
new file mode 100644
index 0000000..5d08fa0a
--- /dev/null
+++ b/ios/chrome/browser/ui/tab_grid/grid/tab_switcher_layout.mm
@@ -0,0 +1,167 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ui/tab_grid/grid/tab_switcher_layout.h"
+
+#import "ios/chrome/browser/ui/tab_grid/grid/grid_constants.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@interface TabSwitcherLayout ()
+@property(nonatomic, strong) NSArray<NSIndexPath*>* indexPathsOfDeletingItems;
+@property(nonatomic, strong) NSArray<NSIndexPath*>* indexPathsOfInsertingItems;
+@end
+
+@implementation TabSwitcherLayout
+
+- (instancetype)init {
+  if (self = [super init]) {
+    _animatesItemUpdates = YES;
+  }
+  return self;
+}
+
+#pragma mark - UICollectionViewLayout
+
+- (void)prepareForCollectionViewUpdates:
+    (NSArray<UICollectionViewUpdateItem*>*)updateItems {
+  [super prepareForCollectionViewUpdates:updateItems];
+  // Track which items in this update are explicitly being deleted or inserted.
+  NSMutableArray<NSIndexPath*>* deletingItems =
+      [NSMutableArray arrayWithCapacity:updateItems.count];
+  NSMutableArray<NSIndexPath*>* insertingItems =
+      [NSMutableArray arrayWithCapacity:updateItems.count];
+  for (UICollectionViewUpdateItem* item in updateItems) {
+    switch (item.updateAction) {
+      case UICollectionUpdateActionDelete:
+        [deletingItems addObject:item.indexPathBeforeUpdate];
+        break;
+      case UICollectionUpdateActionInsert:
+        [insertingItems addObject:item.indexPathAfterUpdate];
+        break;
+      default:
+        break;
+    }
+  }
+  self.indexPathsOfDeletingItems = [deletingItems copy];
+  self.indexPathsOfInsertingItems = [insertingItems copy];
+}
+
+- (UICollectionViewLayoutAttributes*)
+    finalLayoutAttributesForDisappearingItemAtIndexPath:
+        (NSIndexPath*)itemIndexPath {
+  // Return initial layout if animations are disabled.
+  if (!self.animatesItemUpdates) {
+    return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
+  }
+  // Note that this method is called for any item whose index path changing from
+  // |itemIndexPath|, which includes any items that were in the layout and whose
+  // index path is changing. For an item whose index path is changing, this
+  // method is called before
+  // -initialLayoutAttributesForAppearingItemAtIndexPath:
+  UICollectionViewLayoutAttributes* attributes = [[super
+      finalLayoutAttributesForDisappearingItemAtIndexPath:itemIndexPath] copy];
+  // Disappearing items that aren't being deleted just use the default
+  // attributes.
+  if (![self.indexPathsOfDeletingItems containsObject:itemIndexPath]) {
+    return attributes;
+  }
+  // Cells being deleted scale to 0, and are z-positioned behind all others.
+  // (Note that setting the zIndex here actually has no effect, despite what is
+  // implied in the UIKit documentation).
+  attributes.zIndex = -10;
+  // Scaled down to 0% (or near enough).
+  CGAffineTransform transform =
+      CGAffineTransformScale(attributes.transform, /*sx=*/0.01, /*sy=*/0.01);
+  attributes.transform = transform;
+  // Fade out.
+  attributes.alpha = 0.0;
+  return attributes;
+}
+
+- (UICollectionViewLayoutAttributes*)
+    initialLayoutAttributesForAppearingItemAtIndexPath:
+        (NSIndexPath*)itemIndexPath {
+  // Return final layout if animations are disabled.
+  if (!self.animatesItemUpdates) {
+    return [self layoutAttributesForItemAtIndexPath:itemIndexPath];
+  }
+  // Note that this method is called for any item whose index path is becoming
+  // |itemIndexPath|, which includes any items that were in the layout but whose
+  // index path is changing. For an item whose index path is changing, this
+  // method is called after
+  // -finalLayoutAttributesForDisappearingItemAtIndexPath:
+  UICollectionViewLayoutAttributes* attributes = [[super
+      initialLayoutAttributesForAppearingItemAtIndexPath:itemIndexPath] copy];
+  // Appearing items that aren't being inserted just use the default
+  // attributes.
+  if (![self.indexPathsOfInsertingItems containsObject:itemIndexPath]) {
+    return attributes;
+  }
+  // TODO(crbug.com/820410) : Polish the animation, and put constants where they
+  // belong.
+  // Cells being inserted start faded out, scaled down, and drop downwards
+  // slightly.
+  attributes.alpha = 0.0;
+  CGAffineTransform transform =
+      CGAffineTransformScale(attributes.transform, /*sx=*/0.9, /*sy=*/0.9);
+  transform = CGAffineTransformTranslate(transform, /*tx=*/0,
+                                         /*ty=*/attributes.size.height * 0.1);
+  attributes.transform = transform;
+  return attributes;
+}
+
+- (void)finalizeCollectionViewUpdates {
+  self.indexPathsOfDeletingItems = @[];
+  self.indexPathsOfInsertingItems = @[];
+}
+
+@end
+
+@implementation TabSwitcherReorderingLayout
+
+#pragma mark - UICollectionViewLayout
+
+// Both -layoutAttributesForElementsInRect: and
+// -layoutAttributesForItemAtIndexPath: need to be overridden to change the
+// default layout attributes.
+- (NSArray<__kindof UICollectionViewLayoutAttributes*>*)
+    layoutAttributesForElementsInRect:(CGRect)rect {
+  NSArray* baseAttributes = [super layoutAttributesForElementsInRect:rect];
+  NSMutableArray<__kindof UICollectionViewLayoutAttributes*>* attributes =
+      [NSMutableArray array];
+  for (UICollectionViewLayoutAttributes* attribute in baseAttributes) {
+    UICollectionViewLayoutAttributes* newAttribute = [attribute copy];
+    newAttribute.alpha = kReorderingInactiveCellOpacity;
+    [attributes addObject:newAttribute];
+  }
+  return [attributes copy];
+}
+
+- (UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:
+    (NSIndexPath*)indexPath {
+  UICollectionViewLayoutAttributes* attributes =
+      [[super layoutAttributesForItemAtIndexPath:indexPath] copy];
+  attributes.alpha = kReorderingInactiveCellOpacity;
+  return attributes;
+}
+
+- (UICollectionViewLayoutAttributes*)
+    layoutAttributesForInteractivelyMovingItemAtIndexPath:
+        (NSIndexPath*)indexPath
+                                       withTargetPosition:(CGPoint)position {
+  UICollectionViewLayoutAttributes* attributes = [[super
+      layoutAttributesForInteractivelyMovingItemAtIndexPath:indexPath
+                                         withTargetPosition:position] copy];
+  // The moving item has regular opacity, but is scaled.
+  attributes.alpha = 1.0;
+  attributes.transform =
+      CGAffineTransformScale(attributes.transform, kReorderingActiveCellScale,
+                             kReorderingActiveCellScale);
+  return attributes;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/ui_feature_flags.cc b/ios/chrome/browser/ui/ui_feature_flags.cc
index fd920e7..a6a02add 100644
--- a/ios/chrome/browser/ui/ui_feature_flags.cc
+++ b/ios/chrome/browser/ui/ui_feature_flags.cc
@@ -65,3 +65,6 @@
 
 const base::Feature kDefaultBrowserFullscreenPromo{
     "DefaultBrowserFullscreenPromo", base::FEATURE_DISABLED_BY_DEFAULT};
+
+const base::Feature kDefaultBrowserSettings{"DefaultBrowserSettings",
+                                            base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/ios/chrome/browser/ui/ui_feature_flags.h b/ios/chrome/browser/ui/ui_feature_flags.h
index e4ed648..71ceaeaa 100644
--- a/ios/chrome/browser/ui/ui_feature_flags.h
+++ b/ios/chrome/browser/ui/ui_feature_flags.h
@@ -73,4 +73,8 @@
 // users in the Settings.app to update the default browser.
 extern const base::Feature kDefaultBrowserFullscreenPromo;
 
+// Feature flag that enables the button in the settings to send the users in the
+// Settings.app to update the default browser.
+extern const base::Feature kDefaultBrowserSettings;
+
 #endif  // IOS_CHROME_BROWSER_UI_UI_FEATURE_FLAGS_H_
diff --git a/ios/chrome/browser/ui/whats_new/default_browser_promo_coordinator.mm b/ios/chrome/browser/ui/whats_new/default_browser_promo_coordinator.mm
index 05d02ec..49383ff 100644
--- a/ios/chrome/browser/ui/whats_new/default_browser_promo_coordinator.mm
+++ b/ios/chrome/browser/ui/whats_new/default_browser_promo_coordinator.mm
@@ -50,6 +50,8 @@
   self.defaultBrowerPromoViewController =
       [[DefaultBrowserPromoViewController alloc] init];
   self.defaultBrowerPromoViewController.actionHandler = self;
+  self.defaultBrowerPromoViewController.modalPresentationStyle =
+      UIModalPresentationFormSheet;
   [self.baseViewController
       presentViewController:self.defaultBrowerPromoViewController
                    animated:YES
diff --git a/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_dark@2x.png b/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_dark@2x.png
index 1b1b7ec..c3537cb6 100644
--- a/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_dark@2x.png
+++ b/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_dark@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_dark@3x.png b/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_dark@3x.png
index 600a670..724b7e7 100644
--- a/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_dark@3x.png
+++ b/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_dark@3x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_light@2x.png b/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_light@2x.png
index fa436d2..7a6cad4c 100644
--- a/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_light@2x.png
+++ b/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_light@2x.png
Binary files differ
diff --git a/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_light@3x.png b/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_light@3x.png
index 3918cc4..78afb5c 100644
--- a/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_light@3x.png
+++ b/ios/chrome/browser/ui/whats_new/resources/default_browser_illustration.imageset/default_browser_light@3x.png
Binary files differ
diff --git a/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm b/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm
index 503d20d..bd85e25 100644
--- a/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm
+++ b/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm
@@ -288,7 +288,12 @@
 - (void)updateViewConstraints {
   CGFloat marginValue =
       self.view.layoutMargins.left - self.view.safeAreaInsets.left;
-  self.buttonBottomVerticalConstraint.constant = -marginValue;
+  if (!self.secondaryActionAvailable) {
+    // Do not add margin badding between the bottom button and the containing
+    // view if there is a secondary action button to allow for more spacing
+    // between the content and buttons.
+    self.buttonBottomVerticalConstraint.constant = -marginValue;
+  }
   if (self.traitCollection.horizontalSizeClass ==
       UIUserInterfaceSizeClassCompact) {
     [NSLayoutConstraint deactivateConstraints:self.regularWidthConstraints];
@@ -319,7 +324,9 @@
     [self.topToolbar setItems:self.regularHeightToolbarItems animated:YES];
   }
 
-  newBottomConstraint.constant = -marginValue;
+  if (!self.secondaryActionAvailable) {
+    newBottomConstraint.constant = -marginValue;
+  }
   [NSLayoutConstraint deactivateConstraints:@[ oldBottomConstraint ]];
   [NSLayoutConstraint activateConstraints:@[ newBottomConstraint ]];
 
@@ -584,7 +591,7 @@
   [secondaryActionButton setTitleColor:titleColor
                               forState:UIControlStateNormal];
   secondaryActionButton.titleLabel.font =
-      [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
+      [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
   secondaryActionButton.layer.cornerRadius = kPrimaryButtonCornerRadius;
   secondaryActionButton.titleLabel.adjustsFontForContentSizeCategory = NO;
   secondaryActionButton.translatesAutoresizingMaskIntoConstraints = NO;
diff --git a/ios/chrome/common/ui/elements/popover_label_view_controller.mm b/ios/chrome/common/ui/elements/popover_label_view_controller.mm
index d393141..8b7a4be 100644
--- a/ios/chrome/common/ui/elements/popover_label_view_controller.mm
+++ b/ios/chrome/common/ui/elements/popover_label_view_controller.mm
@@ -19,6 +19,8 @@
 constexpr CGFloat kHorizontalInsetValue = 16;
 // Desired percentage of the width of the presented view controller.
 constexpr CGFloat kWidthProportion = 0.75;
+// Max width for the popover.
+constexpr CGFloat kMaxWidth = 300;
 // Distance between the primary text label and the secondary text label.
 constexpr CGFloat kVerticalDistance = 24;
 
@@ -220,6 +222,10 @@
   // Expected width of the |self.scrollView|.
   CGFloat width =
       self.presentingViewController.view.bounds.size.width * kWidthProportion;
+  // Cap max width at 300pt.
+  if (width > kMaxWidth) {
+    width = kMaxWidth;
+  }
   // |scrollView| is used here instead of |self.view|, because |self.view|
   // includes arrow size during calculation although it's being added to the
   // result size anyway.
diff --git a/ios/web/webui/url_data_manager_ios_backend.mm b/ios/web/webui/url_data_manager_ios_backend.mm
index 3156586..853d7f77 100644
--- a/ios/web/webui/url_data_manager_ios_backend.mm
+++ b/ios/web/webui/url_data_manager_ios_backend.mm
@@ -96,6 +96,8 @@
                       BrowserState* browser_state,
                       bool is_incognito);
 
+  ~URLRequestChromeJob() override;
+
   // net::URLRequestJob implementation.
   void Start() override;
   void Kill() override;
@@ -146,8 +148,6 @@
  private:
   friend class URLDataManagerIOSBackend;
 
-  ~URLRequestChromeJob() override;
-
   // Do the actual copy from data_ (the data we're serving) into |buf|.
   // Separate from ReadRawData so we can handle async I/O.
   int CompleteRead(net::IOBuffer* buf, int buf_size);
@@ -400,13 +400,13 @@
       : browser_state_(browser_state), is_incognito_(is_incognito) {}
   ~ChromeProtocolHandler() override {}
 
-  net::URLRequestJob* MaybeCreateJob(
+  std::unique_ptr<net::URLRequestJob> CreateJob(
       net::URLRequest* request,
       net::NetworkDelegate* network_delegate) const override {
     DCHECK(request);
 
-    return new URLRequestChromeJob(request, network_delegate, browser_state_,
-                                   is_incognito_);
+    return std::make_unique<URLRequestChromeJob>(request, network_delegate,
+                                                 browser_state_, is_incognito_);
   }
 
   bool IsSafeRedirectTarget(const GURL& location) const override {
diff --git a/net/url_request/ftp_protocol_handler.cc b/net/url_request/ftp_protocol_handler.cc
index 1adbb8a..a052bfa5 100644
--- a/net/url_request/ftp_protocol_handler.cc
+++ b/net/url_request/ftp_protocol_handler.cc
@@ -34,17 +34,20 @@
 
 FtpProtocolHandler::~FtpProtocolHandler() = default;
 
-URLRequestJob* FtpProtocolHandler::MaybeCreateJob(
-    URLRequest* request, NetworkDelegate* network_delegate) const {
+std::unique_ptr<URLRequestJob> FtpProtocolHandler::CreateJob(
+    URLRequest* request,
+    NetworkDelegate* network_delegate) const {
   DCHECK_EQ("ftp", request->url().scheme());
 
   if (!IsPortAllowedForScheme(request->url().EffectiveIntPort(),
                               request->url().scheme_piece())) {
-    return new URLRequestErrorJob(request, network_delegate, ERR_UNSAFE_PORT);
+    return std::make_unique<URLRequestErrorJob>(request, network_delegate,
+                                                ERR_UNSAFE_PORT);
   }
 
-  return new URLRequestFtpJob(request, network_delegate,
-                              ftp_transaction_factory_.get(), ftp_auth_cache_);
+  return std::make_unique<URLRequestFtpJob>(request, network_delegate,
+                                            ftp_transaction_factory_.get(),
+                                            ftp_auth_cache_);
 }
 
 FtpProtocolHandler::FtpProtocolHandler(
diff --git a/net/url_request/ftp_protocol_handler.h b/net/url_request/ftp_protocol_handler.h
index e8843be3..d1e1906 100644
--- a/net/url_request/ftp_protocol_handler.h
+++ b/net/url_request/ftp_protocol_handler.h
@@ -37,7 +37,7 @@
       std::unique_ptr<FtpTransactionFactory> ftp_transaction_factory,
       FtpAuthCache* auth_cache);
 
-  URLRequestJob* MaybeCreateJob(
+  std::unique_ptr<URLRequestJob> CreateJob(
       URLRequest* request,
       NetworkDelegate* network_delegate) const override;
 
diff --git a/net/url_request/url_request.cc b/net/url_request/url_request.cc
index efe47096..87cc2d7a 100644
--- a/net/url_request/url_request.cc
+++ b/net/url_request/url_request.cc
@@ -588,24 +588,24 @@
   if (error != OK) {
     net_log_.AddEventWithStringParams(NetLogEventType::CANCELLED, "source",
                                       "delegate");
-    StartJob(new URLRequestErrorJob(this, network_delegate_, error));
+    StartJob(
+        std::make_unique<URLRequestErrorJob>(this, network_delegate_, error));
   } else if (!delegate_redirect_url_.is_empty()) {
     GURL new_url;
     new_url.Swap(&delegate_redirect_url_);
 
-    URLRequestRedirectJob* job = new URLRequestRedirectJob(
+    StartJob(std::make_unique<URLRequestRedirectJob>(
         this, network_delegate_, new_url,
         // Use status code 307 to preserve the method, so POST requests work.
-        URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT, "Delegate");
-    StartJob(job);
+        URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT, "Delegate"));
   } else {
     StartJob(context_->job_factory()->CreateJob(this, network_delegate_));
   }
 }
 
-void URLRequest::StartJob(URLRequestJob* job) {
+void URLRequest::StartJob(std::unique_ptr<URLRequestJob> job) {
   DCHECK(!is_pending_);
-  DCHECK(!job_.get());
+  DCHECK(!job_);
 
   privacy_mode_ = DeterminePrivacyMode();
 
@@ -616,7 +616,7 @@
         upload_data_stream_ ? upload_data_stream_->identifier() : -1);
   });
 
-  job_.reset(job);
+  job_ = std::move(job);
   job_->SetExtraRequestHeaders(extra_request_headers_);
   job_->SetPriority(priority_);
   job_->SetRequestHeadersCallback(request_headers_callback_);
@@ -649,8 +649,8 @@
       referrer_.clear();
       net_log_.AddEventWithStringParams(NetLogEventType::CANCELLED, "source",
                                         "delegate");
-      RestartWithJob(new URLRequestErrorJob(this, network_delegate_,
-                                            ERR_BLOCKED_BY_CLIENT));
+      RestartWithJob(std::make_unique<URLRequestErrorJob>(
+          this, network_delegate_, ERR_BLOCKED_BY_CLIENT));
       return;
     }
   }
@@ -667,10 +667,10 @@
   job_->Start();
 }
 
-void URLRequest::RestartWithJob(URLRequestJob* job) {
+void URLRequest::RestartWithJob(std::unique_ptr<URLRequestJob> job) {
   DCHECK(job->request() == this);
   PrepareToRestart();
-  StartJob(job);
+  StartJob(std::move(job));
 }
 
 int URLRequest::Cancel() {
diff --git a/net/url_request/url_request.h b/net/url_request/url_request.h
index 262f6300..2df95bb9 100644
--- a/net/url_request/url_request.h
+++ b/net/url_request/url_request.h
@@ -763,12 +763,11 @@
   // paused).
   void BeforeRequestComplete(int error);
 
-  // TODO(mmenke):  Make this take a scoped_ptr.
-  void StartJob(URLRequestJob* job);
+  void StartJob(std::unique_ptr<URLRequestJob> job);
 
   // Restarting involves replacing the current job with a new one such as what
   // happens when following a HTTP redirect.
-  void RestartWithJob(URLRequestJob* job);
+  void RestartWithJob(std::unique_ptr<URLRequestJob> job);
   void PrepareToRestart();
 
   // Cancels the request and set the error and ssl info for this request to the
diff --git a/net/url_request/url_request_error_job.h b/net/url_request/url_request_error_job.h
index 2ce3f8d..c180442 100644
--- a/net/url_request/url_request_error_job.h
+++ b/net/url_request/url_request_error_job.h
@@ -19,13 +19,12 @@
   URLRequestErrorJob(URLRequest* request,
                      NetworkDelegate* network_delegate,
                      int error);
+  ~URLRequestErrorJob() override;
 
   void Start() override;
   void Kill() override;
 
  private:
-  ~URLRequestErrorJob() override;
-
   void StartAsync();
 
   int error_;
diff --git a/net/url_request/url_request_ftp_job_unittest.cc b/net/url_request/url_request_ftp_job_unittest.cc
index 511f636..7ce0eba8 100644
--- a/net/url_request/url_request_ftp_job_unittest.cc
+++ b/net/url_request/url_request_ftp_job_unittest.cc
@@ -120,9 +120,11 @@
     delete factory;
   }
 
-  URLRequestJob* CreateJob(URLRequest* request,
-                           NetworkDelegate* network_delegate) const override {
-    return new URLRequestFtpJob(request, network_delegate, factory, auth_cache);
+  std::unique_ptr<URLRequestJob> CreateJob(
+      URLRequest* request,
+      NetworkDelegate* network_delegate) const override {
+    return std::make_unique<URLRequestFtpJob>(request, network_delegate,
+                                              factory, auth_cache);
   }
 
   bool IsSafeRedirectTarget(const GURL& location) const override {
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc
index 3210babd..4b58106 100644
--- a/net/url_request/url_request_http_job.cc
+++ b/net/url_request/url_request_http_job.cc
@@ -216,22 +216,15 @@
 
 namespace net {
 
-// TODO(darin): make sure the port blocking code is not lost
-// static
-URLRequestJob* URLRequestHttpJob::Factory(URLRequest* request,
-                                          NetworkDelegate* network_delegate,
-                                          const std::string& scheme) {
-  DCHECK(scheme == "http" || scheme == "https" || scheme == "ws" ||
-         scheme == "wss");
-
-  if (!request->context()->http_transaction_factory()) {
-    NOTREACHED() << "requires a valid context";
-    return new URLRequestErrorJob(
-        request, network_delegate, ERR_INVALID_ARGUMENT);
-  }
-
+std::unique_ptr<URLRequestJob> URLRequestHttpJob::Create(
+    URLRequest* request,
+    NetworkDelegate* network_delegate) {
   const GURL& url = request->url();
 
+  // URLRequestContext must have been initialized.
+  DCHECK(request->context()->http_transaction_factory());
+  DCHECK(url.SchemeIsHTTPOrHTTPS() || url.SchemeIsWSOrWSS());
+
   // Check for reasons not to return a URLRequestHttpJob. These don't apply to
   // https and wss requests.
   if (!url.SchemeIsCryptographic()) {
@@ -241,9 +234,8 @@
     if (hsts && hsts->ShouldUpgradeToSSL(url.host())) {
       GURL::Replacements replacements;
       replacements.SetSchemeStr(
-
           url.SchemeIs(url::kHttpScheme) ? url::kHttpsScheme : url::kWssScheme);
-      return new URLRequestRedirectJob(
+      return std::make_unique<URLRequestRedirectJob>(
           request, network_delegate, url.ReplaceComponents(replacements),
           // Use status code 307 to preserve the method, so POST requests work.
           URLRequestRedirectJob::REDIRECT_307_TEMPORARY_REDIRECT, "HSTS");
@@ -254,15 +246,15 @@
     // ERR_CLEARTEXT_NOT_PERMITTED if not.
     if (request->context()->check_cleartext_permitted() &&
         !android::IsCleartextPermitted(url.host())) {
-      return new URLRequestErrorJob(request, network_delegate,
-                                    ERR_CLEARTEXT_NOT_PERMITTED);
+      return std::make_unique<URLRequestErrorJob>(request, network_delegate,
+                                                  ERR_CLEARTEXT_NOT_PERMITTED);
     }
 #endif
   }
 
-  return new URLRequestHttpJob(request,
-                               network_delegate,
-                               request->context()->http_user_agent_settings());
+  return base::WrapUnique<URLRequestJob>(
+      new URLRequestHttpJob(request, network_delegate,
+                            request->context()->http_user_agent_settings()));
 }
 
 URLRequestHttpJob::URLRequestHttpJob(
diff --git a/net/url_request/url_request_http_job.h b/net/url_request/url_request_http_job.h
index ef89c70..183b6da 100644
--- a/net/url_request/url_request_http_job.h
+++ b/net/url_request/url_request_http_job.h
@@ -43,9 +43,13 @@
 // provides an implementation for both HTTP and HTTPS.
 class NET_EXPORT_PRIVATE URLRequestHttpJob : public URLRequestJob {
  public:
-  static URLRequestJob* Factory(URLRequest* request,
-                                NetworkDelegate* network_delegate,
-                                const std::string& scheme);
+  // Creates URLRequestJob for the specified HTTP, HTTPS, WS, or WSS URL.
+  // Returns a job that returns a redirect in the case of HSTS, and returns a
+  // job that fails for unencrypted requests if current settings dont allow
+  // them. Never returns nullptr.
+  static std::unique_ptr<URLRequestJob> Create(
+      URLRequest* request,
+      NetworkDelegate* network_delegate);
 
   void SetRequestHeadersCallback(RequestHeadersCallback callback) override;
   void SetResponseHeadersCallback(ResponseHeadersCallback callback) override;
diff --git a/net/url_request/url_request_job_factory.cc b/net/url_request/url_request_job_factory.cc
index e53d20f..d850556b 100644
--- a/net/url_request/url_request_job_factory.cc
+++ b/net/url_request/url_request_job_factory.cc
@@ -30,11 +30,10 @@
   HttpProtocolHandler& operator=(const HttpProtocolHandler&) = delete;
   ~HttpProtocolHandler() override = default;
 
-  URLRequestJob* MaybeCreateJob(
+  std::unique_ptr<URLRequestJob> CreateJob(
       URLRequest* request,
       NetworkDelegate* network_delegate) const override {
-    return URLRequestHttpJob::Factory(request, network_delegate,
-                                      request->url().scheme());
+    return URLRequestHttpJob::Create(request, network_delegate);
   }
 };
 
@@ -81,29 +80,31 @@
   return true;
 }
 
-URLRequestJob* URLRequestJobFactory::CreateJob(
+std::unique_ptr<URLRequestJob> URLRequestJobFactory::CreateJob(
     URLRequest* request,
     NetworkDelegate* network_delegate) const {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
 
   // If we are given an invalid URL, then don't even try to inspect the scheme.
   if (!request->url().is_valid())
-    return new URLRequestErrorJob(request, network_delegate, ERR_INVALID_URL);
+    return std::make_unique<URLRequestErrorJob>(request, network_delegate,
+                                                ERR_INVALID_URL);
 
   if (g_interceptor_for_testing) {
-    URLRequestJob* job = g_interceptor_for_testing->MaybeInterceptRequest(
-        request, network_delegate);
+    std::unique_ptr<URLRequestJob> job(
+        g_interceptor_for_testing->MaybeInterceptRequest(request,
+                                                         network_delegate));
     if (job)
       return job;
   }
 
   auto it = protocol_handler_map_.find(request->url().scheme());
   if (it == protocol_handler_map_.end()) {
-    return new URLRequestErrorJob(request, network_delegate,
-                                  ERR_UNKNOWN_URL_SCHEME);
+    return std::make_unique<URLRequestErrorJob>(request, network_delegate,
+                                                ERR_UNKNOWN_URL_SCHEME);
   }
 
-  return it->second->MaybeCreateJob(request, network_delegate);
+  return it->second->CreateJob(request, network_delegate);
 }
 
 bool URLRequestJobFactory::IsSafeRedirectTarget(const GURL& location) const {
diff --git a/net/url_request/url_request_job_factory.h b/net/url_request/url_request_job_factory.h
index 20826d4..58a55b1c 100644
--- a/net/url_request/url_request_job_factory.h
+++ b/net/url_request/url_request_job_factory.h
@@ -31,8 +31,11 @@
    public:
     virtual ~ProtocolHandler();
 
-    virtual URLRequestJob* MaybeCreateJob(
-        URLRequest* request, NetworkDelegate* network_delegate) const = 0;
+    // Creates a URLRequestJob for the particular protocol. Never returns
+    // nullptr.
+    virtual std::unique_ptr<URLRequestJob> CreateJob(
+        URLRequest* request,
+        NetworkDelegate* network_delegate) const = 0;
 
     // Indicates if it should be safe to redirect to |location|. Should handle
     // protocols handled by MaybeCreateJob().
@@ -51,8 +54,9 @@
   // with net::Error code if unable to handle request->url().
   //
   // Virtual for tests.
-  virtual URLRequestJob* CreateJob(URLRequest* request,
-                                   NetworkDelegate* network_delegate) const;
+  virtual std::unique_ptr<URLRequestJob> CreateJob(
+      URLRequest* request,
+      NetworkDelegate* network_delegate) const;
 
   // Returns true if it's safe to redirect to |location|.
   //
diff --git a/net/url_request/url_request_job_factory_unittest.cc b/net/url_request/url_request_job_factory_unittest.cc
index 2334f99..5ce221b 100644
--- a/net/url_request/url_request_job_factory_unittest.cc
+++ b/net/url_request/url_request_job_factory_unittest.cc
@@ -32,6 +32,8 @@
   MockURLRequestJob(URLRequest* request, NetworkDelegate* network_delegate)
       : URLRequestJob(request, network_delegate) {}
 
+  ~MockURLRequestJob() override = default;
+
   void Start() override {
     // Start reading asynchronously so that all error reporting and data
     // callbacks happen as they would for network requests.
@@ -40,9 +42,6 @@
                                   weak_factory_.GetWeakPtr()));
   }
 
- protected:
-  ~MockURLRequestJob() override = default;
-
  private:
   void StartAsync() { NotifyHeadersComplete(); }
 
@@ -51,10 +50,10 @@
 
 class DummyProtocolHandler : public URLRequestJobFactory::ProtocolHandler {
  public:
-  URLRequestJob* MaybeCreateJob(
+  std::unique_ptr<URLRequestJob> CreateJob(
       URLRequest* request,
       NetworkDelegate* network_delegate) const override {
-    return new MockURLRequestJob(request, network_delegate);
+    return std::make_unique<MockURLRequestJob>(request, network_delegate);
   }
 };
 
diff --git a/net/url_request/url_request_test_job.cc b/net/url_request/url_request_test_job.cc
index a08827f..d1f6d4a 100644
--- a/net/url_request/url_request_test_job.cc
+++ b/net/url_request/url_request_test_job.cc
@@ -29,16 +29,6 @@
 base::LazyInstance<URLRequestJobList>::Leaky
     g_pending_jobs = LAZY_INSTANCE_INITIALIZER;
 
-class TestJobProtocolHandler : public URLRequestJobFactory::ProtocolHandler {
- public:
-  // URLRequestJobFactory::ProtocolHandler implementation:
-  URLRequestJob* MaybeCreateJob(
-      URLRequest* request,
-      NetworkDelegate* network_delegate) const override {
-    return new URLRequestTestJob(request, network_delegate);
-  }
-};
-
 }  // namespace
 
 // static getters for known URLs
@@ -136,12 +126,6 @@
   return std::string(kHeaders, base::size(kHeaders));
 }
 
-// static
-std::unique_ptr<URLRequestJobFactory::ProtocolHandler>
-URLRequestTestJob::CreateProtocolHandler() {
-  return std::make_unique<TestJobProtocolHandler>();
-}
-
 URLRequestTestJob::URLRequestTestJob(URLRequest* request,
                                      NetworkDelegate* network_delegate)
     : URLRequestTestJob(request, network_delegate, false) {}
diff --git a/net/url_request/url_request_test_job.h b/net/url_request/url_request_test_job.h
index 59e91cc6..22f30ca 100644
--- a/net/url_request/url_request_test_job.h
+++ b/net/url_request/url_request_test_job.h
@@ -12,7 +12,6 @@
 #include "net/base/net_export.h"
 #include "net/url_request/url_request.h"
 #include "net/url_request/url_request_job.h"
-#include "net/url_request/url_request_job_factory.h"
 
 namespace net {
 
@@ -126,10 +125,6 @@
 
   RequestPriority priority() const { return priority_; }
 
-  // Create a protocol handler for callers that don't subclass.
-  static std::unique_ptr<URLRequestJobFactory::ProtocolHandler>
-  CreateProtocolHandler();
-
   // Job functions
   void SetPriority(RequestPriority priority) override;
   void Start() override;
diff --git a/net/url_request/url_request_unittest.cc b/net/url_request/url_request_unittest.cc
index 8291f69c..6a9ed04 100644
--- a/net/url_request/url_request_unittest.cc
+++ b/net/url_request/url_request_unittest.cc
@@ -2883,7 +2883,7 @@
 
     // URLRequestJobFactory::ProtocolHandler implementation:
 
-    URLRequestJob* MaybeCreateJob(
+    std::unique_ptr<URLRequestJob> CreateJob(
         URLRequest* request,
         NetworkDelegate* network_delegate) const override {
       NOTREACHED();
diff --git a/remoting/resources/remoting_strings_ar.xtb b/remoting/resources/remoting_strings_ar.xtb
index 32e6cfe..4c8ea11 100644
--- a/remoting/resources/remoting_strings_ar.xtb
+++ b/remoting/resources/remoting_strings_ar.xtb
@@ -25,7 +25,7 @@
 <translation id="225614027745146050">مرحبًا</translation>
 <translation id="2320166752086256636">إخفاء لوحة المفاتيح</translation>
 <translation id="2359808026110333948">متابعة</translation>
-<translation id="2366718077645204424">يتعذر الوصول إلى المضيف. ربما يرجع ذلك إلى تهيئة الشبكة التي تستخدمها.</translation>
+<translation id="2366718077645204424">يتعذر الوصول إلى المضيف. ربما يرجع ذلك إلى إعداد الشبكة التي تستخدمها.</translation>
 <translation id="2370754117186920852"><ph name="OPTIONAL_OFFLINE_REASON" />  شوهد متصلاً آخر مرة <ph name="RELATIVE_TIMESTAMP" />.</translation>
 <translation id="2504109125669302160">منح إذن "أدوات تمكين الوصول" إلى <ph name="PRODUCT_NAME" /></translation>
 <translation id="2509394361235492552">متصل بـ <ph name="HOSTNAME" /></translation>
@@ -59,7 +59,7 @@
 <translation id="3905196214175737742">نطاق مالك المضيف غير صالح.</translation>
 <translation id="3931191050278863510">المضيف توقف.</translation>
 <translation id="3950820424414687140">تسجيل الدخول</translation>
-<translation id="405887016757208221">قد فشل الكمبيوتر البعيد في تهيئة الجلسة. وإذا استمرت المشكلة، يُرجى محاولة تهيئة المضيف مرة أخرى.</translation>
+<translation id="405887016757208221">تعذّر على الكمبيوتر البعيد إعداد الجلسة. وإذا استمرت المشكلة، يُرجى محاولة إعداد المضيف مرة أخرى.</translation>
 <translation id="4060747889721220580">تنزيل الملف</translation>
 <translation id="4126409073460786861">بعد اكتمال الإعداد، يمكنك إعادة تحميل هذه الصفحة وستتمكّن بعد ذلك من الوصول إلى جهاز الكمبيوتر من خلال اختيار جهازك وإدخال رقم التعريف الشخصي</translation>
 <translation id="4145029455188493639">تم تسجيل الدخول باسم <ph name="EMAIL_ADDRESS" />.</translation>
@@ -107,7 +107,7 @@
 <translation id="5841343754884244200">خيارات العرض</translation>
 <translation id="6033507038939587647">خيارات لوحة المفاتيح</translation>
 <translation id="6040143037577758943">إغلاق</translation>
-<translation id="6062854958530969723">فشلت تهيئة المضيف.</translation>
+<translation id="6062854958530969723">تعذّر إعداد المضيف.</translation>
 <translation id="6099500228377758828">‏خدمة سطح المكتب البعيد من Chrome</translation>
 <translation id="6122191549521593678">متصل</translation>
 <translation id="6178645564515549384">مضيف الرسائل الأصلي للمساعدة عن بُعد</translation>
@@ -162,7 +162,7 @@
 
 في حال سبق ووضعت علامة في المربّع بجانب "<ph name="SERVICE_SCRIPT_NAME" />"، عليك إزالة العلامة ثم وضعها مرة أخرى.</translation>
 <translation id="8383794970363966105">‏لاستخدام التوافق مع نظام التشغيل Chrome، يجب إضافة حساب في Google إلى جهازك.</translation>
-<translation id="8386846956409881180">‏تمت تهيئة المضيف بواسطة بيانات اعتماد OAuth غير صالحة.</translation>
+<translation id="8386846956409881180">‏تم إعداد المضيف بواسطة بيانات اعتماد OAuth غير صالحة.</translation>
 <translation id="8397385476380433240">منح الإذن إلى <ph name="PRODUCT_NAME" /></translation>
 <translation id="8406498562923498210">‏عليك اختيار جلسة لإطلاقها ضمن بيئة "سطح المكتب البعيد من Chrome". (تجدر الإشارة إلى أنه يمكن ألا تدعم بعض أنواع الجلسات التشغيل ضمن "سطح المكتب البعيد من Chrome" وعلى وحدة التحكّم المحلية في آنٍ واحد.)</translation>
 <translation id="8428213095426709021">الإعدادات</translation>
@@ -178,7 +178,7 @@
 <translation id="9126115402994542723">عدم المطالبة برقم التعريف الشخصي مرة أخرى عند الاتصال بهذا المضيف من هذا الجهاز.</translation>
 <translation id="916856682307586697">‏إطلاق جلسة Xsession التلقائية</translation>
 <translation id="9187628920394877737">منح إذن "تسجيل الشاشة" إلى <ph name="PRODUCT_NAME" /></translation>
-<translation id="9213184081240281106">تهيئة المضيف غير صالحة.</translation>
+<translation id="9213184081240281106">إعداد المضيف غير صالح.</translation>
 <translation id="981121421437150478">بلا اتصال</translation>
 <translation id="985602178874221306">The Chromium Authors</translation>
 <translation id="992215271654996353"><ph name="HOSTNAME" /> (آخر دخول على الإنترنت في تمام <ph name="DATE_OR_TIME" />)</translation>
diff --git a/rlz/BUILD.gn b/rlz/BUILD.gn
index 175536b5..37247ec 100644
--- a/rlz/BUILD.gn
+++ b/rlz/BUILD.gn
@@ -5,8 +5,15 @@
 # Note that this build file assumes rlz_use_chrome_net which is a condition in
 # the GYP file, but is always true for Chrome builds.
 
+import("//rlz/buildflags/buildflags.gni")
 import("//testing/test.gni")
 
+# Reset sources_assignment_filter for the BUILD.gn file to prevent
+# regression during the migration of Chromium away from the feature.
+# See docs/no_sources_assignment_filter.md for more information.
+# TODO(crbug.com/1018739): remove this when migration is done.
+set_sources_assignment_filter([])
+
 config("rlz_lib_config") {
   defines = [ "RLZ_NETWORK_IMPLEMENTATION_CHROME_NET" ]
 }
@@ -32,12 +39,9 @@
   deps = [ "//third_party/zlib" ]
 }
 
-if (!is_android) {
+if (enable_rlz_support) {
   source_set("rlz_lib_no_network") {
     sources = [
-      "chromeos/lib/rlz_value_store_chromeos.cc",
-      "chromeos/lib/rlz_value_store_chromeos.h",
-      "ios/lib/machine_id_ios.cc",
       "lib/crc8.cc",
       "lib/crc8.h",
       "lib/machine_deal_win.h",
@@ -49,25 +53,24 @@
       "lib/supplementary_branding.cc",
       "lib/supplementary_branding.h",
       "lib/time_util.h",
-      "mac/lib/machine_id_mac.cc",
-      "mac/lib/rlz_value_store_mac.h",
-      "mac/lib/rlz_value_store_mac.mm",
-      "win/lib/lib_mutex.cc",
-      "win/lib/lib_mutex.h",
-      "win/lib/machine_deal.cc",
-      "win/lib/machine_deal.h",
-      "win/lib/machine_id_win.cc",
-      "win/lib/process_info.cc",
-      "win/lib/process_info.h",
-      "win/lib/registry_util.cc",
-      "win/lib/registry_util.h",
-      "win/lib/rlz_lib_win.cc",
-      "win/lib/rlz_value_store_registry.cc",
-      "win/lib/rlz_value_store_registry.h",
     ]
 
     if (is_win) {
-      sources += [ "lib/time_util_win.cc" ]
+      sources += [
+        "lib/time_util_win.cc",
+        "win/lib/lib_mutex.cc",
+        "win/lib/lib_mutex.h",
+        "win/lib/machine_deal.cc",
+        "win/lib/machine_deal.h",
+        "win/lib/machine_id_win.cc",
+        "win/lib/process_info.cc",
+        "win/lib/process_info.h",
+        "win/lib/registry_util.cc",
+        "win/lib/registry_util.h",
+        "win/lib/rlz_lib_win.cc",
+        "win/lib/rlz_value_store_registry.cc",
+        "win/lib/rlz_value_store_registry.h",
+      ]
     } else {
       sources += [ "lib/time_util_base.cc" ]
     }
@@ -78,27 +81,32 @@
     ]
 
     if (is_chromeos) {
+      sources += [
+        "chromeos/lib/rlz_value_store_chromeos.cc",
+        "chromeos/lib/rlz_value_store_chromeos.h",
+      ]
       deps += [
         "//chromeos/dbus",
         "//chromeos/system",
       ]
     }
 
-    if (is_mac) {
-      frameworks = [
-        "Foundation.framework",
-        "IOKit.framework",
-      ]
-    }
-
-    if (is_ios) {
-      # These _mac files are also used on iOS.
-      set_sources_assignment_filter([])
+    if (is_apple) {
       sources += [
         "mac/lib/rlz_value_store_mac.h",
         "mac/lib/rlz_value_store_mac.mm",
       ]
-      set_sources_assignment_filter(sources_assignment_filter)
+
+      frameworks = [ "Foundation.framework" ]
+
+      if (is_mac) {
+        sources += [ "mac/lib/machine_id_mac.cc" ]
+        frameworks += [ "IOKit.framework" ]
+      }
+
+      if (is_ios) {
+        sources += [ "ios/lib/machine_id_ios.cc" ]
+      }
     }
 
     if (is_posix) {
@@ -171,9 +179,12 @@
       "lib/rlz_lib_test.cc",
       "lib/string_utils_unittest.cc",
       "test/rlz_unittest_main.cc",
-      "win/lib/machine_deal_test.cc",
     ]
 
+    if (is_win) {
+      sources += [ "win/lib/machine_deal_test.cc" ]
+    }
+
     # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
     configs += [ "//build/config/compiler:no_size_t_to_int_warning" ]
 
diff --git a/services/device/generic_sensor/sensor_impl.h b/services/device/generic_sensor/sensor_impl.h
index 3ff0672..73586e83 100644
--- a/services/device/generic_sensor/sensor_impl.h
+++ b/services/device/generic_sensor/sensor_impl.h
@@ -34,7 +34,7 @@
   void Resume() override;
   void ConfigureReadingChangeNotifications(bool enabled) override;
 
-  // device::Sensor::Client implementation.
+  // device::PlatformSensor::Client implementation.
   void OnSensorReadingChanged(mojom::SensorType type) override;
   void OnSensorError() override;
   bool IsSuspended() override;
diff --git a/services/network/public/cpp/cors/preflight_result.cc b/services/network/public/cpp/cors/preflight_result.cc
index 022ff804..b31b171 100644
--- a/services/network/public/cpp/cors/preflight_result.cc
+++ b/services/network/public/cpp/cors/preflight_result.cc
@@ -4,7 +4,6 @@
 
 #include "services/network/public/cpp/cors/preflight_result.h"
 
-#include "base/feature_list.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/string_split.h"
@@ -15,7 +14,6 @@
 #include "net/http/http_request_headers.h"
 #include "net/http/http_util.h"
 #include "services/network/public/cpp/cors/cors.h"
-#include "services/network/public/cpp/features.h"
 
 namespace network {
 
@@ -61,12 +59,8 @@
 }
 
 // Parses |string| as a Access-Control-Allow-* header value, storing the result
-// in |set|.
-//
-// If the |kStrictAccessControlAllowListCheck| feature is enabled,
-// this function returns false when |string| does not satisfy the syntax
-// here: https://fetch.spec.whatwg.org/#http-new-header-syntax.
-// The function always succeeds if the feature is disabled.
+// in |set|. This function returns false when |string| does not satisfy the
+// syntax here: https://fetch.spec.whatwg.org/#http-new-header-syntax.
 bool ParseAccessControlAllowList(const base::Optional<std::string>& string,
                                  base::flat_set<std::string>* set,
                                  bool insert_in_lower_case) {
@@ -75,13 +69,10 @@
   if (!string)
     return true;
 
-  const bool enable_strict_check = base::FeatureList::IsEnabled(
-      features::kStrictAccessControlAllowListCheck);
-
   net::HttpUtil::ValuesIterator it(string->begin(), string->end(), ',', true);
   while (it.GetNext()) {
     base::StringPiece value = it.value_piece();
-    if (enable_strict_check && !net::HttpUtil::IsToken(value)) {
+    if (!net::HttpUtil::IsToken(value)) {
       set->clear();
       return false;
     }
diff --git a/services/network/public/cpp/cors/preflight_result_unittest.cc b/services/network/public/cpp/cors/preflight_result_unittest.cc
index 0d7069b..6706561 100644
--- a/services/network/public/cpp/cors/preflight_result_unittest.cc
+++ b/services/network/public/cpp/cors/preflight_result_unittest.cc
@@ -4,12 +4,9 @@
 
 #include "services/network/public/cpp/cors/preflight_result.h"
 
-#include "base/feature_list.h"
-#include "base/test/scoped_feature_list.h"
 #include "base/test/simple_test_tick_clock.h"
 #include "base/time/time.h"
 #include "net/http/http_request_headers.h"
-#include "services/network/public/cpp/features.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace network {
@@ -291,11 +288,7 @@
     {"", {}, kNoError},
     {", GET, POST, ,", {"GET", "POST"}, kNoError}};
 
-TEST_F(PreflightResultTest, ParseAllowControlAllowHeadersStrict) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kStrictAccessControlAllowListCheck);
-
+TEST_F(PreflightResultTest, ParseAllowControlAllowHeaders) {
   for (const auto& test : kParseHeadersCases) {
     base::Optional<mojom::CorsError> error;
     std::unique_ptr<PreflightResult> result = PreflightResult::Create(
@@ -314,32 +307,7 @@
   }
 }
 
-TEST_F(PreflightResultTest, ParseAllowControlAllowHeadersLax) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(
-      features::kStrictAccessControlAllowListCheck);
-
-  for (const auto& test : kParseHeadersCases) {
-    base::Optional<mojom::CorsError> error;
-    std::unique_ptr<PreflightResult> result = PreflightResult::Create(
-        mojom::CredentialsMode::kOmit, /*allow_methods_header=*/base::nullopt,
-        test.input, /*max_age_header=*/base::nullopt, &error);
-    EXPECT_EQ(error, kNoError);
-
-    for (const auto& request_header : test.values_to_be_accepted) {
-      net::HttpRequestHeaders headers;
-      headers.AddHeadersFromString(request_header);
-      EXPECT_EQ(base::nullopt,
-                result->EnsureAllowedCrossOriginHeaders(headers, false));
-    }
-  }
-}
-
-TEST_F(PreflightResultTest, ParseAllowControlAllowMethodsStrict) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndEnableFeature(
-      features::kStrictAccessControlAllowListCheck);
-
+TEST_F(PreflightResultTest, ParseAllowControlAllowMethods) {
   for (const auto& test : kParseMethodsCases) {
     base::Optional<mojom::CorsError> error;
     std::unique_ptr<PreflightResult> result =
@@ -357,26 +325,6 @@
   }
 }
 
-TEST_F(PreflightResultTest, ParseAllowControlAllowMethodsLax) {
-  base::test::ScopedFeatureList feature_list;
-  feature_list.InitAndDisableFeature(
-      features::kStrictAccessControlAllowListCheck);
-
-  for (const auto& test : kParseMethodsCases) {
-    base::Optional<mojom::CorsError> error;
-    std::unique_ptr<PreflightResult> result =
-        PreflightResult::Create(mojom::CredentialsMode::kOmit, test.input,
-                                /*allow_headers_header=*/base::nullopt,
-                                /*max_age_header=*/base::nullopt, &error);
-    EXPECT_EQ(error, kNoError);
-
-    for (const auto& request_method : test.values_to_be_accepted) {
-      EXPECT_EQ(base::nullopt,
-                result->EnsureAllowedCrossOriginMethod(request_method));
-    }
-  }
-}
-
 }  // namespace
 
 }  // namespace cors
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc
index 97eee7f8..d56dd48 100644
--- a/services/network/public/cpp/features.cc
+++ b/services/network/public/cpp/features.cc
@@ -188,13 +188,6 @@
     base::FEATURE_ENABLED_BY_DEFAULT};
 #endif
 
-// The preflight parser should reject Access-Control-Allow-* headers which do
-// not conform to ABNF. But if the strict check is applied directly, some
-// existing sites might fail to load. The feature flag controls whether a strict
-// check will be used or not.
-const base::Feature kStrictAccessControlAllowListCheck = {
-    "StrictAccessControlAllowListCheck", base::FEATURE_ENABLED_BY_DEFAULT};
-
 // When the CertVerifierService is enabled, certificate verification will not be
 // performed in the network service, but will instead be brokered to a separate
 // cert verification service potentially running in a different process.
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h
index bf27faf..2c2fff5 100644
--- a/services/network/public/cpp/features.h
+++ b/services/network/public/cpp/features.h
@@ -74,8 +74,6 @@
 COMPONENT_EXPORT(NETWORK_CPP)
 extern const base::Feature kRequestInitiatorSiteLockEnfocement;
 COMPONENT_EXPORT(NETWORK_CPP)
-extern const base::Feature kStrictAccessControlAllowListCheck;
-COMPONENT_EXPORT(NETWORK_CPP)
 extern const base::Feature kCertVerifierService;
 
 COMPONENT_EXPORT(NETWORK_CPP)
diff --git a/services/network/udp_socket_unittest.cc b/services/network/udp_socket_unittest.cc
index 9dffd0a..54640ee1 100644
--- a/services/network/udp_socket_unittest.cc
+++ b/services/network/udp_socket_unittest.cc
@@ -691,8 +691,7 @@
   mojom::UDPSocketOptionsPtr options = mojom::UDPSocketOptions::New();
   options->allow_address_sharing_for_multicast = true;
 
-  net::IPAddress bind_ip_address;
-  EXPECT_TRUE(bind_ip_address.AssignFromIPLiteral("0.0.0.0"));
+  net::IPAddress bind_ip_address = net::IPAddress::AllZeros(group_ip.size());
   net::IPEndPoint socket_address(bind_ip_address, 0);
   ASSERT_EQ(net::OK, helper.BindSync(socket_address, std::move(options),
                                      &socket_address));
@@ -741,10 +740,14 @@
 
   // No longer can receive messages from itself or from second socket.
   EXPECT_EQ(net::OK, helper.SendToSync(group_alias, test_msg));
-  ASSERT_EQ(net::OK, second_socket_helper.SendToSync(group_alias, test_msg));
   socket_remote->ReceiveMore(1);
   socket_remote.FlushForTesting();
-  ASSERT_EQ(2u, listener.results().size());
+  EXPECT_EQ(2u, listener.results().size());
+
+  EXPECT_EQ(net::OK, second_socket_helper.SendToSync(group_alias, test_msg));
+  socket_remote->ReceiveMore(1);
+  socket_remote.FlushForTesting();
+  EXPECT_EQ(2u, listener.results().size());
 }
 
 TEST_F(UDPSocketTest, ErrorHappensDuringSocketOptionsConfiguration) {
diff --git a/skia/BUILD.gn b/skia/BUILD.gn
index 5216f77..efee7b7 100644
--- a/skia/BUILD.gn
+++ b/skia/BUILD.gn
@@ -268,7 +268,7 @@
     "ext/skia_utils_base.cc",
     "ext/skia_utils_base.h",
   ]
-  if (!is_mac && !is_ios) {
+  if (!is_apple) {
     sources += [
       "ext/fontmgr_default.cc",
       "ext/fontmgr_default.h",
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index c93e7523..5e967a9 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -6068,6 +6068,28 @@
             ]
         }
     ],
+    "SafeBrowsingDelayedWarnings": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "params": {
+                        "mouse": "true"
+                    },
+                    "enable_features": [
+                        "SafeBrowsingDelayedWarnings"
+                    ]
+                }
+            ]
+        }
+    ],
     "SafeBrowsingEnhancedProtectionAndroid": [
         {
             "platforms": [
@@ -6450,27 +6472,6 @@
             ]
         }
     ],
-    "SimplifiedUrlDisplay": [
-        {
-            "platforms": [
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "AllDisplayExperimentsEnabled",
-                    "enable_features": [
-                        "OmniboxUIExperimentElideToRegistrableDomain",
-                        "OmniboxUIExperimentHideSteadyStateUrlPathQueryAndRefOnInteraction",
-                        "OmniboxUIExperimentRevealSteadyStateUrlPathQueryAndRefOnHover",
-                        "SafeBrowsingDelayedWarnings"
-                    ]
-                }
-            ]
-        }
-    ],
     "SmartDimModelV3": [
         {
             "platforms": [
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium
index 9312fe04..ddd09b3 100644
--- a/third_party/abseil-cpp/README.chromium
+++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@
 License: Apache 2.0
 License File: LICENSE
 Version: 0
-Revision: 3c8b5d7587dc8ecf730ce9996c89e156e408c3ed
+Revision: 6af91b35109cb35ae53cfe908e31a0c31c4a47f3
 Security Critical: yes
 
 Description:
diff --git a/third_party/abseil-cpp/absl/base/config.h b/third_party/abseil-cpp/absl/base/config.h
index b1e095d3..c1d0494 100644
--- a/third_party/abseil-cpp/absl/base/config.h
+++ b/third_party/abseil-cpp/absl/base/config.h
@@ -474,9 +474,9 @@
   (defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__) && \
    __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ < 120000) || \
   (defined(__ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__) && \
-   __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 120000) || \
+   __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ < 50000) || \
   (defined(__ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__) && \
-   __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 50000))
+   __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ < 120000))
 #define ABSL_INTERNAL_APPLE_CXX17_TYPES_UNAVAILABLE 1
 #else
 #define ABSL_INTERNAL_APPLE_CXX17_TYPES_UNAVAILABLE 0
diff --git a/third_party/abseil-cpp/absl/container/btree_test.cc b/third_party/abseil-cpp/absl/container/btree_test.cc
index 43704206..1bfa0c2 100644
--- a/third_party/abseil-cpp/absl/container/btree_test.cc
+++ b/third_party/abseil-cpp/absl/container/btree_test.cc
@@ -2580,6 +2580,40 @@
 }
 #endif
 
+struct MultiKey {
+  int i1;
+  int i2;
+};
+
+struct MultiKeyComp {
+  using is_transparent = void;
+  bool operator()(const MultiKey a, const MultiKey b) const {
+    if (a.i1 != b.i1) return a.i1 < b.i1;
+    return a.i2 < b.i2;
+  }
+  bool operator()(const int a, const MultiKey b) const { return a < b.i1; }
+  bool operator()(const MultiKey a, const int b) const { return a.i1 < b; }
+};
+
+// Test that when there's a heterogeneous comparator that behaves differently
+// for some heterogeneous operators, we get equal_range() right.
+TEST(Btree, MultiKeyEqualRange) {
+  absl::btree_set<MultiKey, MultiKeyComp> set;
+
+  for (int i = 0; i < 100; ++i) {
+    for (int j = 0; j < 100; ++j) {
+      set.insert({i, j});
+    }
+  }
+
+  for (int i = 0; i < 100; ++i) {
+    auto equal_range = set.equal_range(i);
+    EXPECT_EQ(equal_range.first->i1, i);
+    EXPECT_EQ(equal_range.first->i2, 0);
+    EXPECT_EQ(std::distance(equal_range.first, equal_range.second), 100) << i;
+  }
+}
+
 }  // namespace
 }  // namespace container_internal
 ABSL_NAMESPACE_END
diff --git a/third_party/abseil-cpp/absl/container/internal/btree.h b/third_party/abseil-cpp/absl/container/internal/btree.h
index 5986bb2..002ccc1 100644
--- a/third_party/abseil-cpp/absl/container/internal/btree.h
+++ b/third_party/abseil-cpp/absl/container/internal/btree.h
@@ -137,15 +137,14 @@
 };
 
 // A helper class to convert a boolean comparison into a three-way "compare-to"
-// comparison that returns a negative value to indicate less-than, zero to
-// indicate equality and a positive value to indicate greater-than. This helper
+// comparison that returns an `absl::weak_ordering`. This helper
 // class is specialized for less<std::string>, greater<std::string>,
 // less<string_view>, greater<string_view>, less<absl::Cord>, and
 // greater<absl::Cord>.
 //
 // key_compare_to_adapter is provided so that btree users
 // automatically get the more efficient compare-to code when using common
-// google string types with common comparison functors.
+// Abseil string types with common comparison functors.
 // These string-like specializations also turn on heterogeneous lookup by
 // default.
 template <typename Compare>
@@ -189,6 +188,9 @@
   // If Compare is a common comparator for a string-like type, then we adapt it
   // to use heterogeneous lookup and to be a key-compare-to comparator.
   using key_compare = typename key_compare_to_adapter<Compare>::type;
+  // True when key_compare has been adapted to StringBtreeDefault{Less,Greater}.
+  using is_key_compare_adapted =
+      absl::negation<std::is_same<key_compare, Compare>>;
   // A type which indicates if we have a key-compare-to functor or a plain old
   // key-compare functor.
   using is_key_compare_to = btree_is_key_compare_to<key_compare, Key>;
@@ -1015,6 +1017,8 @@
   using is_key_compare_to = typename Params::is_key_compare_to;
   using init_type = typename Params::init_type;
   using field_type = typename node_type::field_type;
+  using is_multi_container = typename Params::is_multi_container;
+  using is_key_compare_adapted = typename Params::is_key_compare_adapted;
 
   // We use a static empty node for the root/leftmost/rightmost of empty btrees
   // in order to avoid branching in begin()/end().
@@ -1164,15 +1168,13 @@
   }
 
   // Finds the range of values which compare equal to key. The first member of
-  // the returned pair is equal to lower_bound(key). The second member pair of
-  // the pair is equal to upper_bound(key).
+  // the returned pair is equal to lower_bound(key). The second member of the
+  // pair is equal to upper_bound(key).
   template <typename K>
-  std::pair<iterator, iterator> equal_range(const K &key) {
-    return {lower_bound(key), upper_bound(key)};
-  }
+  std::pair<iterator, iterator> equal_range(const K &key);
   template <typename K>
   std::pair<const_iterator, const_iterator> equal_range(const K &key) const {
-    return {lower_bound(key), upper_bound(key)};
+    return const_cast<btree *>(this)->equal_range(key);
   }
 
   // Inserts a value into the btree only if it does not already exist. The
@@ -1891,6 +1893,40 @@
 }
 
 template <typename P>
+template <typename K>
+auto btree<P>::equal_range(const K &key) -> std::pair<iterator, iterator> {
+  const iterator lower = lower_bound(key);
+  // TODO(ezb): we should be able to avoid this comparison when there's a
+  // three-way comparator.
+  if (lower == end() || compare_keys(key, lower.key())) return {lower, lower};
+
+  const iterator next = std::next(lower);
+  // When the comparator is heterogeneous, we can't assume that comparison with
+  // non-`key_type` will be equivalent to `key_type` comparisons so there
+  // could be multiple equivalent keys even in a unique-container. But for
+  // heterogeneous comparisons from the default string adapted comparators, we
+  // don't need to worry about this.
+  if (!is_multi_container::value &&
+      (std::is_same<K, key_type>::value || is_key_compare_adapted::value)) {
+    // The next iterator after lower must point to a key greater than `key`.
+    // Note: if this assert fails, then it may indicate that the comparator does
+    // not meet the equivalence requirements for Compare
+    // (see https://en.cppreference.com/w/cpp/named_req/Compare).
+    assert(next == end() || compare_keys(key, next.key()));
+    return {lower, next};
+  }
+  // Try once more to avoid the call to upper_bound() if there's only one
+  // equivalent key. This should prevent all calls to upper_bound() in cases of
+  // unique-containers with heterogeneous comparators in which all comparison
+  // operators are equivalent.
+  if (next == end() || compare_keys(key, next.key())) return {lower, next};
+
+  // In this case, we need to call upper_bound() to avoid worst case O(N)
+  // behavior if we were to iterate over equal keys.
+  return {lower, upper_bound(key)};
+}
+
+template <typename P>
 template <typename K, typename... Args>
 auto btree<P>::insert_unique(const K &key, Args &&... args)
     -> std::pair<iterator, bool> {
diff --git a/third_party/abseil-cpp/absl/container/internal/btree_container.h b/third_party/abseil-cpp/absl/container/internal/btree_container.h
index 3b2e8a9..137614f8 100644
--- a/third_party/abseil-cpp/absl/container/internal/btree_container.h
+++ b/third_party/abseil-cpp/absl/container/internal/btree_container.h
@@ -314,6 +314,8 @@
   }
 
   // Deletion routines.
+  // TODO(ezb): we should support heterogeneous comparators that have different
+  // behavior for K!=key_type.
   template <typename K = key_type>
   size_type erase(const key_arg<K> &key) {
     return this->tree_.erase_unique(key);
diff --git a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h
index b2a30c9..394348da 100644
--- a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h
+++ b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h
@@ -139,6 +139,11 @@
 HashtablezInfo* SampleSlow(int64_t* next_sample);
 void UnsampleSlow(HashtablezInfo* info);
 
+#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
+#error ABSL_INTERNAL_HASHTABLEZ_SAMPLE cannot be directly set
+#endif  // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
+
+#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
 class HashtablezInfoHandle {
  public:
   explicit HashtablezInfoHandle() : info_(nullptr) {}
@@ -190,9 +195,22 @@
   friend class HashtablezInfoHandlePeer;
   HashtablezInfo* info_;
 };
+#else
+// Ensure that when Hashtablez is turned off at compile time, HashtablezInfo can
+// be removed by the linker, in order to reduce the binary size.
+class HashtablezInfoHandle {
+ public:
+  explicit HashtablezInfoHandle() = default;
+  explicit HashtablezInfoHandle(std::nullptr_t) {}
 
-#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
-#error ABSL_INTERNAL_HASHTABLEZ_SAMPLE cannot be directly set
+  inline void RecordStorageChanged(size_t /*size*/, size_t /*capacity*/) {}
+  inline void RecordRehash(size_t /*total_probe_length*/) {}
+  inline void RecordInsert(size_t /*hash*/, size_t /*distance_from_desired*/) {}
+  inline void RecordErase() {}
+
+  friend inline void swap(HashtablezInfoHandle& /*lhs*/,
+                          HashtablezInfoHandle& /*rhs*/) {}
+};
 #endif  // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
 
 #if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
diff --git a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc
index 04a26cb..8d10a1e 100644
--- a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc
+++ b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_test.cc
@@ -38,6 +38,7 @@
 namespace absl {
 ABSL_NAMESPACE_BEGIN
 namespace container_internal {
+#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
 class HashtablezInfoHandlePeer {
  public:
   static bool IsSampled(const HashtablezInfoHandle& h) {
@@ -46,6 +47,13 @@
 
   static HashtablezInfo* GetInfo(HashtablezInfoHandle* h) { return h->info_; }
 };
+#else
+class HashtablezInfoHandlePeer {
+ public:
+  static bool IsSampled(const HashtablezInfoHandle&) { return false; }
+  static HashtablezInfo* GetInfo(HashtablezInfoHandle*) { return nullptr; }
+};
+#endif  // defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
 
 namespace {
 using ::absl::synchronization_internal::ThreadPool;
@@ -172,7 +180,7 @@
   EXPECT_EQ(info.num_rehashes.load(), 1);
 }
 
-#if defined(ABSL_HASHTABLEZ_SAMPLE)
+#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
 TEST(HashtablezSamplerTest, SmallSampleParameter) {
   SetHashtablezEnabled(true);
   SetHashtablezSampleParameter(100);
@@ -216,7 +224,6 @@
   }
   EXPECT_NEAR(sample_rate, 0.01, 0.005);
 }
-#endif
 
 TEST(HashtablezSamplerTest, Handle) {
   auto& sampler = HashtablezSampler::Global();
@@ -246,6 +253,8 @@
   });
   EXPECT_FALSE(found);
 }
+#endif
+
 
 TEST(HashtablezSamplerTest, Registration) {
   HashtablezSampler sampler;
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
index e3279301..f5ae83c4 100644
--- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
@@ -1796,7 +1796,7 @@
   EXPECT_DEATH_IF_SUPPORTED(t.erase(t.end()), kDeathMsg);
 }
 
-#if defined(ABSL_HASHTABLEZ_SAMPLE)
+#if defined(ABSL_INTERNAL_HASHTABLEZ_SAMPLE)
 TEST(RawHashSamplerTest, Sample) {
   // Enable the feature even if the prod default is off.
   SetHashtablezEnabled(true);
@@ -1817,7 +1817,7 @@
   EXPECT_NEAR((end_size - start_size) / static_cast<double>(tables.size()),
               0.01, 0.005);
 }
-#endif  // ABSL_HASHTABLEZ_SAMPLER
+#endif  // ABSL_INTERNAL_HASHTABLEZ_SAMPLE
 
 TEST(RawHashSamplerTest, DoNotSampleCustomAllocators) {
   // Enable the feature even if the prod default is off.
diff --git a/third_party/abseil-cpp/absl/flags/flag.h b/third_party/abseil-cpp/absl/flags/flag.h
index cdac545b9..a9cb2b7 100644
--- a/third_party/abseil-cpp/absl/flags/flag.h
+++ b/third_party/abseil-cpp/absl/flags/flag.h
@@ -144,11 +144,17 @@
   inline bool IsOfType() const {
     return GetImpl().template IsOfType<U>();
   }
-  T Get() const { return GetImpl().Get(); }
-  void Set(const T& v) { GetImpl().Set(v); }
+  T Get() const {
+    return flags_internal::FlagImplPeer::InvokeGet<T>(GetImpl());
+  }
+  void Set(const T& v) {
+    flags_internal::FlagImplPeer::InvokeSet(GetImpl(), v);
+  }
   void InvokeCallback() { GetImpl().InvokeCallback(); }
 
-  const CommandLineFlag& Reflect() const { return GetImpl().Reflect(); }
+  const CommandLineFlag& Reflect() const {
+    return flags_internal::FlagImplPeer::InvokeReflect(GetImpl());
+  }
 
   // The data members are logically private, but they need to be public for
   // this to be an aggregate type.
@@ -180,7 +186,7 @@
 //   std::string first_name = absl::GetFlag(FLAGS_firstname);
 template <typename T>
 ABSL_MUST_USE_RESULT T GetFlag(const absl::Flag<T>& flag) {
-  return flag.Get();
+  return flags_internal::FlagImplPeer::InvokeGet<T>(flag);
 }
 
 // SetFlag()
@@ -192,7 +198,7 @@
 // but especially within performance-critical code.
 template <typename T>
 void SetFlag(absl::Flag<T>* flag, const T& v) {
-  flag->Set(v);
+  flags_internal::FlagImplPeer::InvokeSet(*flag, v);
 }
 
 // Overload of `SetFlag()` to allow callers to pass in a value that is
@@ -201,7 +207,7 @@
 template <typename T, typename V>
 void SetFlag(absl::Flag<T>* flag, const V& v) {
   T value(v);
-  flag->Set(value);
+  flags_internal::FlagImplPeer::InvokeSet(*flag, value);
 }
 
 // GetFlagReflectionHandle()
@@ -216,7 +222,7 @@
 
 template <typename T>
 const CommandLineFlag& GetFlagReflectionHandle(const absl::Flag<T>& f) {
-  return f.Reflect();
+  return flags_internal::FlagImplPeer::InvokeReflect(f);
 }
 
 ABSL_NAMESPACE_END
diff --git a/third_party/abseil-cpp/absl/flags/internal/flag.h b/third_party/abseil-cpp/absl/flags/internal/flag.h
index 89e43ad..370d8a0 100644
--- a/third_party/abseil-cpp/absl/flags/internal/flag.h
+++ b/third_party/abseil-cpp/absl/flags/internal/flag.h
@@ -632,20 +632,9 @@
   std::string CurrentValue() const { return impl_.CurrentValue(); }
 
  private:
-  template <typename U, bool do_register>
+  template <typename, bool>
   friend class FlagRegistrar;
-
-#if !defined(_MSC_VER) || defined(__clang__)
-  template <typename U>
-  friend U absl::GetFlag(const flags_internal::Flag<U>& flag);
-  template <typename U>
-  friend void absl::SetFlag(flags_internal::Flag<U>* flag, const U& v);
-  template <typename U, typename V>
-  friend void absl::SetFlag(flags_internal::Flag<U>* flag, const V& v);
-#else
-  template <typename U>
-  friend class absl::Flag;
-#endif
+  friend class FlagImplPeer;
 
   T Get() const {
     // See implementation notes in CommandLineFlag::Get().
@@ -668,10 +657,6 @@
     impl_.Write(&v);
   }
 
-  template <typename U>
-  friend const CommandLineFlag& absl::GetFlagReflectionHandle(
-      const absl::Flag<U>& f);
-
   // Access to the reflection.
   const CommandLineFlag& Reflect() const { return impl_; }
 
@@ -684,6 +669,25 @@
 };
 
 ///////////////////////////////////////////////////////////////////////////////
+// Trampoline for friend access
+
+class FlagImplPeer {
+ public:
+  template <typename T, typename FlagType>
+  static T InvokeGet(const FlagType& flag) {
+    return flag.Get();
+  }
+  template <typename FlagType, typename T>
+  static void InvokeSet(FlagType& flag, const T& v) {
+    flag.Set(v);
+  }
+  template <typename FlagType>
+  static const CommandLineFlag& InvokeReflect(const FlagType& f) {
+    return f.Reflect();
+  }
+};
+
+///////////////////////////////////////////////////////////////////////////////
 // Implementation of Flag value specific operations routine.
 template <typename T>
 void* FlagOps(FlagOp op, const void* v1, void* v2, void* v3) {
diff --git a/third_party/abseil-cpp/ci/linux_docker_containers.sh b/third_party/abseil-cpp/ci/linux_docker_containers.sh
index 483ce2a..e42fa58 100644
--- a/third_party/abseil-cpp/ci/linux_docker_containers.sh
+++ b/third_party/abseil-cpp/ci/linux_docker_containers.sh
@@ -16,6 +16,6 @@
 # Test scripts should source this file to get the identifiers.
 
 readonly LINUX_ALPINE_CONTAINER="gcr.io/google.com/absl-177019/alpine:20191016"
-readonly LINUX_CLANG_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20200710"
-readonly LINUX_GCC_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20200710"
+readonly LINUX_CLANG_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20200909"
+readonly LINUX_GCC_LATEST_CONTAINER="gcr.io/google.com/absl-177019/linux_hybrid-latest:20200909"
 readonly LINUX_GCC_49_CONTAINER="gcr.io/google.com/absl-177019/linux_gcc-4.9:20191018"
diff --git a/third_party/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh b/third_party/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh
index 3ec0226..cd15f710 100755
--- a/third_party/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh
+++ b/third_party/abseil-cpp/ci/linux_gcc-latest_libstdcxx_bazel.sh
@@ -25,7 +25,7 @@
 fi
 
 if [[ -z ${STD:-} ]]; then
-  STD="c++11 c++14 c++17 c++2a"
+  STD="c++11 c++14 c++17 c++20"
 fi
 
 if [[ -z ${COMPILATION_MODE:-} ]]; then
diff --git a/third_party/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh b/third_party/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh
index db5f691..1ba02b2 100755
--- a/third_party/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh
+++ b/third_party/abseil-cpp/ci/linux_gcc-latest_libstdcxx_cmake.sh
@@ -27,7 +27,7 @@
 fi
 
 if [[ -z ${ABSL_CMAKE_CXX_STANDARDS:-} ]]; then
-  ABSL_CMAKE_CXX_STANDARDS="11 14 17"
+  ABSL_CMAKE_CXX_STANDARDS="11 14 17 20"
 fi
 
 if [[ -z ${ABSL_CMAKE_BUILD_TYPES:-} ]]; then
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index c9d56f6..8df7dd6f 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -5427,6 +5427,8 @@
       optional DOM.RGBA columnHatchColor
       # The named grid areas border color (Default: transparent).
       optional DOM.RGBA areaBorderColor
+      # The grid container background color (Default: transparent).
+      optional DOM.RGBA gridBackgroundColor
 
   # Configuration data for the highlighting of page elements.
   type HighlightConfig extends object
diff --git a/third_party/blink/public/strings/translations/blink_strings_as.xtb b/third_party/blink/public/strings/translations/blink_strings_as.xtb
index ee569ad..00199dc 100644
--- a/third_party/blink/public/strings/translations/blink_strings_as.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_as.xtb
@@ -13,6 +13,7 @@
 <translation id="1211441953136645838">এণ্ডন‘ট</translation>
 <translation id="1281252709823657822">ডায়ল’গ</translation>
 <translation id="1306460908038601864">অফ</translation>
+<translation id="1311894908970423688">মানটো <ph name="VALUE_DATE_OR_TIME" /> হ’বই লাগিব।</translation>
 <translation id="1335095011850992622">ক্ৰেডিট</translation>
 <translation id="1342835525016946179">প্ৰৱন্ধ</translation>
 <translation id="1359897965706325498">বেনাৰ</translation>
@@ -184,6 +185,7 @@
 <translation id="6643016212128521049">মচক</translation>
 <translation id="668171684555832681">অন্য...</translation>
 <translation id="6692633176391053278">ষ্টেপাৰ</translation>
+<translation id="6709093583001123835">মানটো <ph name="VALUE" /> হ’বই লাগিব।</translation>
 <translation id="6709570249143506788">প্লে’বেকৰ মান নিম্নমানৰ</translation>
 <translation id="6755330956360078551">টুলটিপ</translation>
 <translation id="6790428901817661496">প্লে’ কৰক</translation>
diff --git a/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb b/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb
index 02b3faa..25af037d 100644
--- a/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb
+++ b/third_party/blink/public/strings/translations/blink_strings_en-GB.xtb
@@ -13,6 +13,7 @@
 <translation id="1211441953136645838">endnote</translation>
 <translation id="1281252709823657822">dialogue</translation>
 <translation id="1306460908038601864">Off</translation>
+<translation id="1311894908970423688">Value must be <ph name="VALUE_DATE_OR_TIME" />.</translation>
 <translation id="1335095011850992622">credits</translation>
 <translation id="1342835525016946179">article</translation>
 <translation id="1359897965706325498">banner</translation>
@@ -185,6 +186,7 @@
 <translation id="6643016212128521049">Clear</translation>
 <translation id="668171684555832681">Other...</translation>
 <translation id="6692633176391053278">stepper</translation>
+<translation id="6709093583001123835">Value must be <ph name="VALUE" />.</translation>
 <translation id="6709570249143506788">Poor playback quality</translation>
 <translation id="6755330956360078551">tooltip</translation>
 <translation id="6790428901817661496">Play</translation>
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h
index f6bc439..1a19af46 100644
--- a/third_party/blink/public/web/web_local_frame_client.h
+++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -38,6 +38,7 @@
 #include "base/optional.h"
 #include "base/unguessable_token.h"
 #include "media/base/speech_recognition_client.h"
+#include "services/network/public/mojom/url_loader_factory.mojom-shared.h"
 #include "services/network/public/mojom/web_sandbox_flags.mojom-shared.h"
 #include "third_party/blink/public/common/feature_policy/feature_policy.h"
 #include "third_party/blink/public/common/loader/loading_behavior_flag.h"
@@ -614,6 +615,10 @@
 
   virtual void OnStopLoading() {}
 
+  virtual void MaybeProxyURLLoaderFactory(
+      blink::CrossVariantMojoReceiver<
+          network::mojom::URLLoaderFactoryInterfaceBase>* factory_receiver) {}
+
   // Accessibility Object Model -------------------------------------------
 
   // This method is used to expose the AX Tree stored in content/renderer to the
diff --git a/third_party/blink/renderer/bindings/core/v8/module_record.cc b/third_party/blink/renderer/bindings/core/v8/module_record.cc
index 9c359c2..b0d2e3d 100644
--- a/third_party/blink/renderer/bindings/core/v8/module_record.cc
+++ b/third_party/blink/renderer/bindings/core/v8/module_record.cc
@@ -56,9 +56,12 @@
 ScriptPromise ModuleEvaluationResult::GetPromise(
     ScriptState* script_state) const {
   DCHECK(base::FeatureList::IsEnabled(features::kTopLevelAwait));
-  DCHECK(IsSuccess());
   DCHECK(!value_.IsEmpty());
-  return ScriptPromise(script_state, value_);
+  if (IsSuccess()) {
+    return ScriptPromise(script_state, value_);
+  } else {
+    return ScriptPromise::Reject(script_state, value_);
+  }
 }
 
 ModuleRecordProduceCacheData::ModuleRecordProduceCacheData(
diff --git a/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py b/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
index 150916b..bf33c92 100644
--- a/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
+++ b/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py
@@ -2402,29 +2402,19 @@
     if not cg_context.indexed_property_setter:
         body.append(
             TextNode("""\
-// 3.8.2. [[Set]]
+// 3.9.2. [[Set]]
 // https://heycam.github.io/webidl/#legacy-platform-object-set
-// step 1. If O and Receiver are the same object, then:
-if (${info}.Holder() == ${info}.This()) {
-  // OrdinarySetWithOwnDescriptor will end up calling DefineOwnProperty,
-  // which will fail when the receiver object is this legacy platform
-  // object.
-  bindings::V8SetReturnValue(${info}, nullptr);
-  if (${info}.ShouldThrowOnError()) {
-    ExceptionState exception_state(${info}.GetIsolate(),
-                                   ExceptionState::kIndexedSetterContext,
-                                   "${interface.identifier}");
-    exception_state.ThrowTypeError(
-        "Indexed property setter is not supported.");
-  }
-  return;
+// OrdinarySetWithOwnDescriptor will end up calling DefineOwnProperty,
+// which will fail when the receiver object is this legacy platform
+// object.
+bindings::V8SetReturnValue(${info}, nullptr);
+if (${info}.ShouldThrowOnError()) {
+  ExceptionState exception_state(${info}.GetIsolate(),
+                                 ExceptionState::kIndexedSetterContext,
+                                 "${interface.identifier}");
+  exception_state.ThrowTypeError(
+      "Indexed property setter is not supported.");
 }
-
-// step 2. Let ownDesc be LegacyPlatformObjectGetOwnProperty(O, P, true).
-// step 3. Perform ? OrdinarySetWithOwnDescriptor(O, P, V, Receiver,
-//   ownDesc).
-//
-// Do not intercept.  Fallback to OrdinarySetWithOwnDescriptor.
 """))
         return func_decl, func_def
 
@@ -2441,23 +2431,22 @@
 
     body.extend([
         TextNode("""\
-// 3.8.2. [[Set]]
+// 3.9.2. [[Set]]
 // https://heycam.github.io/webidl/#legacy-platform-object-set
 // step 1. If O and Receiver are the same object, then:\
 """),
-        CxxLikelyIfNode(
-            cond="${info}.Holder() == ${info}.This()",
-            body=[
-                TextNode("""\
+        CxxLikelyIfNode(cond="${info}.Holder() == ${info}.This()",
+                        body=[
+                            TextNode("""\
 // step 1.1.1. Invoke the indexed property setter with P and V.\
 """),
-                make_steps_of_ce_reactions(cg_context),
-                EmptyNode(),
-                make_v8_set_return_value(cg_context),
-                TextNode("""\
+                            make_steps_of_ce_reactions(cg_context),
+                            EmptyNode(),
+                            make_v8_set_return_value(cg_context),
+                            TextNode("""\
 bindings::V8SetReturnValue(${info}, nullptr);
 return;"""),
-            ]),
+                        ]),
         EmptyNode(),
         TextNode("""\
 // Do not intercept.  Fallback to OrdinarySetWithOwnDescriptor.
@@ -2493,7 +2482,7 @@
 
     body.append(
         TextNode("""\
-// 3.8.4. [[Delete]]
+// 3.9.4. [[Delete]]
 // https://heycam.github.io/webidl/#legacy-platform-object-delete
 // step 1.2. If index is not a supported property index, then return true.
 // step 1.3. Return false.
@@ -2538,7 +2527,7 @@
 
     body.append(
         TextNode("""\
-// 3.8.3. [[DefineOwnProperty]]
+// 3.9.3. [[DefineOwnProperty]]
 // https://heycam.github.io/webidl/#legacy-platform-object-defineownproperty
 // step 1.1. If the result of calling IsDataDescriptor(Desc) is false, then
 //   return false.
@@ -2653,7 +2642,7 @@
 
     body.append(
         TextNode("""\
-// 3.8.6. [[OwnPropertyKeys]]
+// 3.9.6. [[OwnPropertyKeys]]
 // https://heycam.github.io/webidl/#legacy-platform-object-ownpropertykeys
 // step 2. If O supports indexed properties, then for each index of O's
 //   supported property indices, in ascending numerical order, append
@@ -2751,8 +2740,13 @@
     body = func_def.body
 
     if not cg_context.named_property_setter:
-        if ("OverrideBuiltins" in cg_context.interface.extended_attributes
-                or "LegacyOverrideBuiltins" in
+        body.append(
+            TextNode("""\
+// 3.9.2. [[Set]]
+// https://heycam.github.io/webidl/#legacy-platform-object-set
+// step 3. Perform ? OrdinarySetWithOwnDescriptor(O, P, V, Receiver, ownDesc).\
+"""))
+        if ("LegacyOverrideBuiltIns" in
                 cg_context.interface.extended_attributes):
             body.append(
                 TextNode("""\
@@ -2764,37 +2758,21 @@
 """))
         body.append(
             TextNode("""\
-// 3.8.2. [[Set]]
-// https://heycam.github.io/webidl/#legacy-platform-object-set
-// step 1. If O and Receiver are the same object, then:
-if (${info}.Holder() == ${info}.This()) {
-  // OrdinarySetWithOwnDescriptor will end up calling DefineOwnProperty.
-  // 3.8.3. [[DefineOwnProperty]]
-  // https://heycam.github.io/webidl/#legacy-platform-object-defineownproperty
-  // step 2.1. Let creating be true if P is not a supported property name,
-  //   and false otherwise.
-  // step 2.2.1. If creating is false and O does not implement an interface
-  //   with a named property setter, then return false.
-  ${class_name}::NamedPropertyGetterCallback(${v8_property_name}, ${info});
-  const bool is_creating = ${info}.GetReturnValue().Get()->IsUndefined();
-  if (!is_creating) {
-    bindings::V8SetReturnValue(${info}, nullptr);
-    if (${info}.ShouldThrowOnError()) {
-      ExceptionState exception_state(${info}.GetIsolate(),
-                                     ExceptionState::kNamedSetterContext,
-                                     "${interface.identifier}");
-      exception_state.ThrowTypeError(
-          "Named property setter is not supported.");
-    }
-    return;
+${class_name}::NamedPropertyGetterCallback(${v8_property_name}, ${info});
+const bool is_creating = ${info}.GetReturnValue().Get()->IsUndefined();
+if (!is_creating) {
+  bindings::V8SetReturnValue(${info}, nullptr);
+  if (${info}.ShouldThrowOnError()) {
+    ExceptionState exception_state(${info}.GetIsolate(),
+                                   ExceptionState::kNamedSetterContext,
+                                   "${interface.identifier}");
+    exception_state.ThrowTypeError(
+        "Named property setter is not supported.");
   }
+  return;
 }
 
-// step 2. Let ownDesc be LegacyPlatformObjectGetOwnProperty(O, P, true).
-// step 3. Perform ? OrdinarySetWithOwnDescriptor(O, P, V, Receiver,
-//   ownDesc).
-//
-// Do not intercept.  Fallback to OrdinarySetWithOwnDescriptor.
+// Do not intercept.  Fallback and let it define a new own property.
 """))
         return func_decl, func_def
 
@@ -2819,20 +2797,19 @@
 
     body.extend([
         TextNode("""\
-// 3.8.2. [[Set]]
+// 3.9.2. [[Set]]
 // https://heycam.github.io/webidl/#legacy-platform-object-set
 // step 1. If O and Receiver are the same object, then:\
 """),
-        CxxLikelyIfNode(
-            cond="${info}.Holder() == ${info}.This()",
-            body=[
-                TextNode("""\
+        CxxLikelyIfNode(cond="${info}.Holder() == ${info}.This()",
+                        body=[
+                            TextNode("""\
 // step 1.2.1. Invoke the named property setter with P and V.\
 """),
-                make_steps_of_ce_reactions(cg_context),
-                EmptyNode(),
-                make_v8_set_return_value(cg_context),
-                TextNode("""\
+                            make_steps_of_ce_reactions(cg_context),
+                            EmptyNode(),
+                            make_v8_set_return_value(cg_context),
+                            TextNode("""\
 % if interface.identifier == "CSSStyleDeclaration":
 // CSSStyleDeclaration is abusing named properties.
 // Do not intercept if the property is not found.
@@ -2840,7 +2817,7 @@
 bindings::V8SetReturnValue(${info}, nullptr);
 % endif
 return;"""),
-            ]),
+                        ]),
         EmptyNode(),
         TextNode("""\
 // Do not intercept.  Fallback to OrdinarySetWithOwnDescriptor.
@@ -2870,7 +2847,7 @@
             and "NotEnumerable" in props.named_getter.extended_attributes):
         body.append(
             TextNode("""\
-// 3.8.4. [[Delete]]
+// 3.9.4. [[Delete]]
 // https://heycam.github.io/webidl/#legacy-platform-object-delete
 // step 2. If O supports named properties, O does not implement an interface
 //   with the [Global] extended attribute and the result of calling the
@@ -2885,7 +2862,7 @@
     if not cg_context.named_property_deleter:
         body.append(
             TextNode("""\
-// 3.8.4. [[Delete]]
+// 3.9.4. [[Delete]]
 // https://heycam.github.io/webidl/#legacy-platform-object-delete
 // step 2. If O supports named properties, O does not implement an interface
 //   with the [Global] extended attribute and the result of calling the
@@ -2923,7 +2900,7 @@
 
     body.extend([
         TextNode("""\
-// 3.8.4. [[Delete]]
+// 3.9.4. [[Delete]]
 // https://heycam.github.io/webidl/#legacy-platform-object-delete\
 """),
         make_steps_of_ce_reactions(cg_context),
@@ -2969,7 +2946,7 @@
     elif not cg_context.interface.indexed_and_named_properties.named_setter:
         body.append(
             TextNode("""\
-// 3.8.3. [[DefineOwnProperty]]
+// 3.9.3. [[DefineOwnProperty]]
 // https://heycam.github.io/webidl/#legacy-platform-object-defineownproperty
 // step 2.1. Let creating be true if P is not a supported property name, and
 //   false otherwise.
@@ -2993,7 +2970,7 @@
     else:
         body.append(
             TextNode("""\
-// 3.8.3. [[DefineOwnProperty]]
+// 3.9.3. [[DefineOwnProperty]]
 // https://heycam.github.io/webidl/#legacy-platform-object-defineownproperty
 // step 2.2.2. If O implements an interface with a named property setter,
 //   then:
@@ -3164,7 +3141,7 @@
 
     body.append(
         TextNode("""\
-// 3.8.6. [[OwnPropertyKeys]]
+// 3.9.6. [[OwnPropertyKeys]]
 // https://heycam.github.io/webidl/#legacy-platform-object-ownpropertykeys
 // step 3. If O supports named properties, then for each P of O's supported
 //   property names that is visible according to the named property
@@ -3215,32 +3192,6 @@
     return func_def
 
 
-def make_named_props_obj_indexed_setter_callback(cg_context, function_name):
-    assert isinstance(cg_context, CodeGenContext)
-    assert isinstance(function_name, str)
-
-    arg_decls = [
-        "uint32_t index",
-        "v8::Local<v8::Value> v8_property_value",
-        "const v8::PropertyCallbackInfo<v8::Value>& info",
-    ]
-    arg_names = ["index", "v8_property_value", "info"]
-
-    func_def = _make_interceptor_callback_def(
-        cg_context, function_name, arg_decls, arg_names, None,
-        "NamedPropertiesObject_IndexedPropertySetter")
-    body = func_def.body
-
-    body.append(
-        TextNode("""\
-v8::Local<v8::String> property_name =
-    V8AtomicString(${isolate}, AtomicString::Number(${index}));
-NamedPropsObjNamedSetterCallback(property_name, ${v8_property_value}, ${info});
-"""))
-
-    return func_def
-
-
 def make_named_props_obj_indexed_deleter_callback(cg_context, function_name):
     assert isinstance(cg_context, CodeGenContext)
     assert isinstance(function_name, str)
@@ -3356,42 +3307,6 @@
     return func_def
 
 
-def make_named_props_obj_named_setter_callback(cg_context, function_name):
-    assert isinstance(cg_context, CodeGenContext)
-    assert isinstance(function_name, str)
-
-    arg_decls = [
-        "v8::Local<v8::Name> v8_property_name",
-        "v8::Local<v8::Value> v8_property_value",
-        "const v8::PropertyCallbackInfo<v8::Value>& info",
-    ]
-    arg_names = ["v8_property_name", "v8_property_value", "info"]
-
-    func_def = _make_interceptor_callback_def(
-        cg_context, function_name, arg_decls, arg_names, None,
-        "NamedPropertiesObject_NamedPropertySetter")
-    body = func_def.body
-
-    body.append(
-        TextNode("""\
-if (${info}.Holder() == ${info}.This()) {
-  // 3.6.4.2. [[DefineOwnProperty]]
-  // https://heycam.github.io/webidl/#named-properties-object-defineownproperty
-  bindings::V8SetReturnValue(${info}, nullptr);
-  if (${info}.ShouldThrowOnError()) {
-    ExceptionState exception_state(${info}.GetIsolate(),
-                                   ExceptionState::kNamedSetterContext,
-                                   "${interface.identifier}");
-    exception_state.ThrowTypeError(
-        "Named property setter is not supported.");
-  }
-  return;
-}
-"""))
-
-    return func_def
-
-
 def make_named_props_obj_named_deleter_callback(cg_context, function_name):
     assert isinstance(cg_context, CodeGenContext)
     assert isinstance(function_name, str)
@@ -4597,7 +4512,7 @@
                    "V8DOMConfiguration::kOnInstance, "
                    "V8DOMConfiguration::kDoNotCheckHolder, "
                    "V8DOMConfiguration::kHasNoSideEffect, "
-                   "V8DOMConfiguration::kAlwaysCallGetter, "
+                   "V8DOMConfiguration::kReplaceWithDataProperty, "
                    "{world}"
                    "}}, ")
         text = _format(
@@ -5876,8 +5791,6 @@
     func_defs = [
         make_named_props_obj_named_getter_callback(
             cg_context, "NamedPropsObjNamedGetterCallback"),
-        make_named_props_obj_named_setter_callback(
-            cg_context, "NamedPropsObjNamedSetterCallback"),
         make_named_props_obj_named_deleter_callback(
             cg_context, "NamedPropsObjNamedDeleterCallback"),
         make_named_props_obj_named_definer_callback(
@@ -5886,8 +5799,6 @@
             cg_context, "NamedPropsObjNamedDescriptorCallback"),
         make_named_props_obj_indexed_getter_callback(
             cg_context, "NamedPropsObjIndexedGetterCallback"),
-        make_named_props_obj_indexed_setter_callback(
-            cg_context, "NamedPropsObjIndexedSetterCallback"),
         make_named_props_obj_indexed_deleter_callback(
             cg_context, "NamedPropsObjIndexedDeleterCallback"),
         make_named_props_obj_indexed_definer_callback(
@@ -5904,7 +5815,7 @@
 ${npo_prototype_template}->SetHandler(
     v8::NamedPropertyHandlerConfiguration(
         NamedPropsObjNamedGetterCallback,
-        NamedPropsObjNamedSetterCallback,
+        nullptr,  // setter
         nullptr,  // query
         NamedPropsObjNamedDeleterCallback,
         nullptr,  // enumerator
@@ -5918,7 +5829,7 @@
 ${npo_prototype_template}->SetHandler(
     v8::IndexedPropertyHandlerConfiguration(
         NamedPropsObjIndexedGetterCallback,
-        NamedPropsObjIndexedSetterCallback,
+        nullptr,  // setter
         nullptr,  // query
         NamedPropsObjIndexedDeleterCallback,
         nullptr,  // enumerator
diff --git a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
index 42f15c1..cda4e47 100644
--- a/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_adjuster.cc
@@ -638,6 +638,15 @@
     if (is_document_element)
       style.SetDisplay(EquivalentBlockDisplay(style.Display()));
 
+    // math display values on non-MathML elements compute to flow display
+    // values.
+    if (element && !element->IsMathMLElement() &&
+        (style.Display() == EDisplay::kMath ||
+         style.Display() == EDisplay::kInlineMath)) {
+      style.SetDisplay(style.Display() == EDisplay::kMath ? EDisplay::kBlock
+                                                          : EDisplay::kInline);
+    }
+
     // We don't adjust the first letter style earlier because we may change the
     // display setting in adjustStyeForTagName() above.
     AdjustStyleForFirstLetter(style);
diff --git a/third_party/blink/renderer/core/dom/node_traversal.h b/third_party/blink/renderer/core/dom/node_traversal.h
index 764f7ac7..7f0b628 100644
--- a/third_party/blink/renderer/core/dom/node_traversal.h
+++ b/third_party/blink/renderer/core/dom/node_traversal.h
@@ -62,7 +62,8 @@
 
   // Like next, but skips children and starts with the next sibling.
   CORE_EXPORT static Node* NextSkippingChildren(const Node&);
-  static Node* NextSkippingChildren(const Node&, const Node* stay_within);
+  CORE_EXPORT static Node* NextSkippingChildren(const Node&,
+                                                const Node* stay_within);
 
   static Node* FirstWithin(const Node& current) { return current.firstChild(); }
 
diff --git a/third_party/blink/renderer/core/frame/dom_window.cc b/third_party/blink/renderer/core/frame/dom_window.cc
index 1c86ca49..a448d41 100644
--- a/third_party/blink/renderer/core/frame/dom_window.cc
+++ b/third_party/blink/renderer/core/frame/dom_window.cc
@@ -446,10 +446,27 @@
   monitor.report_type = report_type;
   monitor.accessing_main_frame = accessing_frame->GetFrameToken();
 
-  // TODO(arthursonzogni): Clean coop_access_monitor_ when a reporter is gone.
-  // Use mojo::Remote::set_disconnect_handler.
   monitor.reporter.Bind(std::move(pending_reporter));
+  // CoopAccessMonitor are cleared when their reporter are gone. This avoids
+  // accumulation. However it would have been interesting continuing reporting
+  // accesses past this point, at least for the ReportingObserver and Devtool.
+  // TODO(arthursonzogni): Consider observing |accessing_main_frame| deletion
+  // instead.
+  monitor.reporter.set_disconnect_handler(
+      WTF::Bind(&DOMWindow::DisconnectCoopAccessMonitor,
+                WrapWeakPersistent(this), monitor.accessing_main_frame));
 
+  // As long as RenderDocument isn't shipped, it can exist a CoopAccessMonitor
+  // for the same |accessing_main_frame|, because it might now host a different
+  // Document. Same is true for |this| DOMWindow, it might refer to a window
+  // hosting a different document.
+  // The new documents will still be part of a different virtual browsing
+  // context group, however the new COOPAccessMonitor might now contain updated
+  // URLs.
+  DisconnectCoopAccessMonitor(monitor.accessing_main_frame);
+
+  // Any attempts to access |this| window from |accessing_main_frame| will now
+  // trigger reports (network, ReportingObserver, Devtool).
   coop_access_monitor_.push_back(std::move(monitor));
 }
 
@@ -632,4 +649,15 @@
   EventTargetWithInlineData::Trace(visitor);
 }
 
+void DOMWindow::DisconnectCoopAccessMonitor(
+    base::UnguessableToken accessing_main_frame) {
+  auto* it = coop_access_monitor_.begin();
+  while (it != coop_access_monitor_.end()) {
+    if (it->accessing_main_frame == accessing_main_frame)
+      it = coop_access_monitor_.erase(it);
+    else
+      ++it;
+  }
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/frame/dom_window.h b/third_party/blink/renderer/core/frame/dom_window.h
index eb902c56..a9af31a0 100644
--- a/third_party/blink/renderer/core/frame/dom_window.h
+++ b/third_party/blink/renderer/core/frame/dom_window.h
@@ -165,6 +165,11 @@
                      LocalDOMWindow* source,
                      ExceptionState&);
 
+  // Removed the CoopAccessMonitor with the given |accessing_main_frame| from
+  // the |coop_access_monitor| list. This is called when the COOP reporter is
+  // gone or a more recent CoopAccessMonitor is being added.
+  void DisconnectCoopAccessMonitor(base::UnguessableToken accessing_main_frame);
+
   Member<Frame> frame_;
   // Unlike |frame_|, |window_proxy_manager_| is available even after the
   // window's frame gets detached from the DOM, until the end of the lifetime
diff --git a/third_party/blink/renderer/core/html/link_web_bundle.cc b/third_party/blink/renderer/core/html/link_web_bundle.cc
index b6a4b882..cf591ea 100644
--- a/third_party/blink/renderer/core/html/link_web_bundle.cc
+++ b/third_party/blink/renderer/core/html/link_web_bundle.cc
@@ -6,6 +6,10 @@
 
 #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
 #include "third_party/blink/public/mojom/web_feature/web_feature.mojom-blink.h"
+#include "third_party/blink/public/web/web_local_frame.h"
+#include "third_party/blink/public/web/web_local_frame_client.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/frame/local_frame_client.h"
 #include "third_party/blink/renderer/core/html/html_link_element.h"
 #include "third_party/blink/renderer/core/inspector/console_message.h"
 #include "third_party/blink/renderer/core/loader/threadable_loader.h"
@@ -24,12 +28,21 @@
                         public ThreadableLoaderClient {
  public:
   WebBundleLoader(LinkWebBundle& link_web_bundle,
-                  ExecutionContext& execution_context,
+                  Document& document,
                   const KURL& url)
       : link_web_bundle_(&link_web_bundle),
-        pending_factory_receiver_(loader_factory_.BindNewPipeAndPassReceiver()),
         url_(url),
         security_origin_(SecurityOrigin::Create(url)) {
+    blink::CrossVariantMojoReceiver<
+        network::mojom::URLLoaderFactoryInterfaceBase>
+        receiver(loader_factory_.BindNewPipeAndPassReceiver());
+    document.GetFrame()
+        ->Client()
+        ->GetWebFrame()
+        ->Client()
+        ->MaybeProxyURLLoaderFactory(&receiver);
+    pending_factory_receiver_ = std::move(receiver);
+
     ResourceRequest request(url);
     request.SetUseStreamOnResponse(true);
     // TODO(crbug.com/1082020): Revisit these once the fetch and process the
@@ -40,11 +53,12 @@
     request.SetMode(network::mojom::blink::RequestMode::kCors);
     request.SetCredentialsMode(network::mojom::blink::CredentialsMode::kOmit);
 
+    ExecutionContext* execution_context = document.GetExecutionContext();
     ResourceLoaderOptions resource_loader_options(
-        execution_context.GetCurrentWorld());
+        execution_context->GetCurrentWorld());
     resource_loader_options.data_buffering_policy = kDoNotBufferData;
 
-    loader_ = MakeGarbageCollected<ThreadableLoader>(execution_context, this,
+    loader_ = MakeGarbageCollected<ThreadableLoader>(*execution_context, this,
                                                      resource_loader_options);
     loader_->Start(std::move(request));
   }
@@ -160,7 +174,7 @@
 
   if (!bundle_loader_ || bundle_loader_->url() != owner_->Href()) {
     bundle_loader_ = MakeGarbageCollected<WebBundleLoader>(
-        *this, *owner_->GetDocument().GetExecutionContext(), owner_->Href());
+        *this, owner_->GetDocument(), owner_->Href());
   }
 
   resource_fetcher->AddSubresourceWebBundle(*this);
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight.cc b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
index f8dcdf4..e9a1544b 100644
--- a/third_party/blink/renderer/core/inspector/inspector_highlight.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_highlight.cc
@@ -413,6 +413,10 @@
     grid_config_info->setString("areaBorderColor",
                                 grid_config.area_border_color.Serialized());
   }
+  if (grid_config.grid_background_color != Color::kTransparent) {
+    grid_config_info->setString("gridBackgroundColor",
+                                grid_config.grid_background_color.Serialized());
+  }
   return grid_config_info;
 }
 
@@ -1649,6 +1653,7 @@
   config.row_hatch_color = Color(255, 255, 255, 0);
   config.column_hatch_color = Color(128, 128, 128, 0);
   config.area_border_color = Color(255, 0, 0, 0);
+  config.grid_background_color = Color(255, 0, 0, 0);
   config.show_grid_extension_lines = true;
   config.show_positive_line_numbers = true;
   config.show_negative_line_numbers = true;
diff --git a/third_party/blink/renderer/core/inspector/inspector_highlight.h b/third_party/blink/renderer/core/inspector/inspector_highlight.h
index 2ccab9b4..adce6a2 100644
--- a/third_party/blink/renderer/core/inspector/inspector_highlight.h
+++ b/third_party/blink/renderer/core/inspector/inspector_highlight.h
@@ -42,6 +42,7 @@
   Color row_hatch_color;
   Color column_hatch_color;
   Color area_border_color;
+  Color grid_background_color;
 
   bool show_grid_extension_lines;
   bool grid_border_dash;
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
index c1b1cdbf..edceb020 100644
--- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -1489,6 +1489,8 @@
       InspectorDOMAgent::ParseColor(config->getColumnHatchColor(nullptr));
   highlight_config->area_border_color =
       InspectorDOMAgent::ParseColor(config->getAreaBorderColor(nullptr));
+  highlight_config->grid_background_color =
+      InspectorDOMAgent::ParseColor(config->getGridBackgroundColor(nullptr));
   return highlight_config;
 }
 
diff --git a/third_party/blink/renderer/core/layout/layout_object_factory.cc b/third_party/blink/renderer/core/layout/layout_object_factory.cc
index dfc2510..32f9c34 100644
--- a/third_party/blink/renderer/core/layout/layout_object_factory.cc
+++ b/third_party/blink/renderer/core/layout/layout_object_factory.cc
@@ -139,13 +139,10 @@
 LayoutBlock* LayoutObjectFactory::CreateMath(Node& node,
                                              const ComputedStyle& style,
                                              LegacyLayout legacy) {
-  // TODO(http://crbug.com/1127222): math display values on non-MathML elements
-  // should compute to the corresponding non-math display values instead.
-  // DCHECK(IsA<MathMLElement>(node));
-
+  DCHECK(IsA<MathMLElement>(node));
   DCHECK_NE(legacy, LegacyLayout::kForce);
   bool disable_ng_for_type = !RuntimeEnabledFeatures::MathMLCoreEnabled();
-  if (IsA<MathMLElement>(node) && To<MathMLElement>(node).IsTokenElement()) {
+  if (To<MathMLElement>(node).IsTokenElement()) {
     return CreateObject<LayoutBlockFlow, LayoutNGMathMLBlockFlow,
                         LayoutBlockFlow>(node, style, legacy,
                                          disable_ng_for_type);
diff --git a/third_party/blink/renderer/core/script/modulator_impl_base.cc b/third_party/blink/renderer/core/script/modulator_impl_base.cc
index 62fe7d4b..6ce90f6a 100644
--- a/third_party/blink/renderer/core/script/modulator_impl_base.cc
+++ b/third_party/blink/renderer/core/script/modulator_impl_base.cc
@@ -8,6 +8,7 @@
 #include "third_party/blink/public/mojom/devtools/console_message.mojom-blink.h"
 #include "third_party/blink/public/platform/task_type.h"
 #include "third_party/blink/renderer/bindings/core/v8/module_record.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_function.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
@@ -48,6 +49,24 @@
 
 ModulatorImplBase::~ModulatorImplBase() {}
 
+class ModuleEvaluationRejectionCallback final : public ScriptFunction {
+ public:
+  explicit ModuleEvaluationRejectionCallback(ScriptState* script_state)
+      : ScriptFunction(script_state) {}
+
+  static v8::Local<v8::Function> CreateFunction(ScriptState* script_state) {
+    ModuleEvaluationRejectionCallback* self =
+        MakeGarbageCollected<ModuleEvaluationRejectionCallback>(script_state);
+    return self->BindToV8Function();
+  }
+
+ private:
+  ScriptValue Call(ScriptValue value) override {
+    ModuleRecord::ReportException(GetScriptState(), value.V8Value());
+    return ScriptValue();
+  }
+};
+
 bool ModulatorImplBase::IsScriptingDisabled() const {
   return !GetExecutionContext()->CanExecuteScripts(kAboutToExecuteScript);
 }
@@ -351,15 +370,17 @@
                                        v8::MicrotasksScope::kRunMicrotasks);
   ScriptState::EscapableScope scope(script_state_);
 
-  // <spec step="5">Let evaluationStatus be null.</spec>
-  //
-  // |result| corresponds to "evaluationStatus of [[Type]]: throw".
+  // Without TLA: <spec step="5">Let evaluationStatus be null.</spec>
   ModuleEvaluationResult result = ModuleEvaluationResult::Empty();
 
   // <spec step="6">If script's error to rethrow is not null, ...</spec>
   if (module_script->HasErrorToRethrow()) {
-    // <spec step="6">... then set evaluationStatus to Completion { [[Type]]:
-    // throw, [[Value]]: script's error to rethrow, [[Target]]: empty }.</spec>
+    // Without TLA: <spec step="6">... then set evaluationStatus to Completion
+    //     { [[Type]]: throw, [[Value]]: script's error to rethrow,
+    //       [[Target]]: empty }.</spec>
+    // With TLA:    <spec step="5">If script's error to rethrow is not null,
+    //     then let valuationPromise be a promise rejected with script's error
+    //     to rethrow.</spec>
     result = ModuleEvaluationResult::FromException(
         module_script->CreateErrorToRethrow().V8Value());
   } else {
@@ -387,25 +408,36 @@
     }
   }
 
-  // <spec step="8">If evaluationStatus is an abrupt completion, then:</spec>
-  if (result.IsException()) {
-    // <spec step="8.1">If rethrow errors is true, rethrow the exception given
-    // by evaluationStatus.[[Value]].</spec>
-    if (capture_error == CaptureEvalErrorFlag::kCapture)
-      return result.Escape(&scope);
-
-    // <spec step="8.2">Otherwise, report the exception given by
-    // evaluationStatus.[[Value]] for script.</spec>
-    ModuleRecord::ReportException(script_state_, result.GetException());
-  }
-
-  // <spec step="9">Clean up after running script with settings.</spec>
-  // - Partially implemented in MicrotaskScope destructor and the
-  // - ScriptState::EscapableScope destructor.
-  if (base::FeatureList::IsEnabled(features::kTopLevelAwait))
+  if (base::FeatureList::IsEnabled(features::kTopLevelAwait)) {
+    if (capture_error == CaptureEvalErrorFlag::kReport) {
+      // <spec step="7"> If report errors is true, then upon rejection of
+      // evaluationPromise with reason, report the exception given by reason
+      // for script.</spec>
+      v8::Local<v8::Function> callback_failure =
+          ModuleEvaluationRejectionCallback::CreateFunction(script_state_);
+      // Add a rejection handler to report back errors once the result promise
+      // is rejected.
+      result.GetPromise(script_state_)
+          .Then(v8::Local<v8::Function>(), callback_failure);
+    }
     return result.Escape(&scope);
-  else
+  } else {
+    // <spec step="8">If evaluationStatus is an abrupt completion, then:</spec>
+    if (result.IsException()) {
+      // <spec step="8.1">If rethrow errors is true, rethrow the exception given
+      // by evaluationStatus.[[Value]].</spec>
+      if (capture_error == CaptureEvalErrorFlag::kCapture)
+        return result.Escape(&scope);
+
+      // <spec step="8.2">Otherwise, report the exception given by
+      // evaluationStatus.[[Value]] for script.</spec>
+      ModuleRecord::ReportException(script_state_, result.GetException());
+    }
+    // <spec step="8">Clean up after running script with settings.</spec>
+    // - Partially implement in MicrotaskScope destructor and the
+    // - ScriptState::EscapableScope destructor.
     return ModuleEvaluationResult::Empty();
+  }
 }
 
 void ModulatorImplBase::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/modules/accessibility/ax_position.cc b/third_party/blink/renderer/modules/accessibility/ax_position.cc
index b16cc04..45f44531 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_position.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_position.cc
@@ -762,10 +762,16 @@
   DCHECK(container_node) << "All anonymous layout objects and list markers "
                             "should have a containing block element.";
   DCHECK(!container->IsDetached());
+  if (!container_node || container->IsDetached())
+    return {};
+
   auto& ax_object_cache_impl = container->AXObjectCache();
   const AXObject* new_container =
       ax_object_cache_impl.GetOrCreate(container_node);
   DCHECK(new_container);
+  if (!new_container)
+    return {};
+
   AXPosition position(*new_container);
   if (new_container == container->ParentObjectIncludedInTree()) {
     position.text_offset_or_child_index_ = container->IndexInParent();
@@ -796,6 +802,9 @@
   const Node* container_node = adjusted_position.container_object_->GetNode();
   DCHECK(container_node) << "AX positions that are valid DOM positions should "
                             "always be connected to their DOM nodes.";
+  if (!container_node)
+    return {};
+
   if (!adjusted_position.IsTextPosition()) {
     // AX positions that are unumbiguously at the start or end of a container,
     // should convert to the corresponding DOM positions at the start or end of
@@ -810,10 +819,16 @@
       DCHECK(child_node) << "AX objects used in AX positions that are valid "
                             "DOM positions should always be connected to their "
                             "DOM nodes.";
+      if (!child_node)
+        return {};
+
       if (!child_node->previousSibling()) {
         // Creates a |PositionAnchorType::kBeforeChildren| position.
         container_node = child_node->parentNode();
         DCHECK(container_node);
+        if (!container_node)
+          return {};
+
         return PositionWithAffinity(
             Position::FirstPositionInNode(*container_node), affinity_);
       }
@@ -830,12 +845,17 @@
       DCHECK(last_child_node) << "AX objects used in AX positions that are "
                                  "valid DOM positions should always be "
                                  "connected to their DOM nodes.";
+      if (!last_child_node)
+        return {};
 
       // Check if this is an "after children" position in the DOM as well.
       if (!last_child_node->nextSibling()) {
         // Creates a |PositionAnchorType::kAfterChildren| position.
         container_node = last_child_node->parentNode();
         DCHECK(container_node);
+        if (!container_node)
+          return {};
+
         return PositionWithAffinity(
             Position::LastPositionInNode(*container_node), affinity_);
       }
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
index d4db3e46..926f039 100644
--- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
+++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.cc
@@ -4,13 +4,17 @@
 
 #include "sanitizer.h"
 
+#include "third_party/blink/renderer/bindings/core/v8/v8_node_filter.h"
 #include "third_party/blink/renderer/bindings/modules/v8/v8_sanitizer_config.h"
 #include "third_party/blink/renderer/core/dom/document_fragment.h"
+#include "third_party/blink/renderer/core/dom/node.h"
+#include "third_party/blink/renderer/core/dom/node_traversal.h"
 #include "third_party/blink/renderer/core/editing/serializers/serialization.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/platform/bindings/exception_messages.h"
 #include "third_party/blink/renderer/platform/bindings/exception_state.h"
 #include "third_party/blink/renderer/platform/bindings/script_state.h"
+#include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
 
@@ -20,7 +24,16 @@
 }
 
 Sanitizer::Sanitizer(const SanitizerConfig* config)
-    : config_(const_cast<SanitizerConfig*>(config)) {}
+    : config_(const_cast<SanitizerConfig*>(config)) {
+  // Format dropElements to uppercases.
+  if (config->hasDropElements()) {
+    Vector<String> l;
+    for (const String& s : config->dropElements()) {
+      l.push_back(s.UpperASCII());
+    }
+    config_->setDropElements(l);
+  }
+}
 
 Sanitizer::~Sanitizer() = default;
 
@@ -44,9 +57,38 @@
   DocumentFragment* fragment = document->createDocumentFragment();
   DCHECK(document->QuerySelector("body"));
   fragment->ParseHTML(input, document->QuerySelector("body"));
+
+  // Remove all the elements in the dropElements list.
+  if (config_->hasDropElements()) {
+    Node* node = fragment->firstChild();
+
+    while (node) {
+      // Skip non-Element nodes.
+      if (node->getNodeType() != Node::NodeType::kElementNode) {
+        node = NodeTraversal::Next(*node, fragment);
+        continue;
+      }
+
+      // TODO(crbug.com/1126936): Review the sanitising algorithm for non-HTMLs.
+      String node_name = node->nodeName();
+      // If the current element is dropped, remove current element entirely and
+      // proceed to its next sibling.
+      if (config_->dropElements().Contains(node_name.UpperASCII())) {
+        Node* tmp = node;
+        node = NodeTraversal::NextSkippingChildren(*node, fragment);
+        tmp->remove();
+      } else {
+        // Otherwise, proceed to the next node (preorder, depth-first
+        // traversal).
+        node = NodeTraversal::Next(*node, fragment);
+      }
+    }
+  }
+
   return fragment;
 }
 
+// TODO(lyf): https://github.com/WICG/sanitizer-api/issues/34
 SanitizerConfig* Sanitizer::creationOptions() const {
   return config_;
 }
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h
index 50499de3..3d3144cc 100644
--- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h
+++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer.h
@@ -32,6 +32,8 @@
   void Trace(Visitor*) const override;
 
  private:
+  // TODO(lyf): Make config_ read-only. The creationOptions getter which
+  // asks for the pointer is forbidened by a read-only variable.
   Member<SanitizerConfig> config_ = {};
 };
 
diff --git a/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl b/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl
index 30c519f0..d32c3f5 100644
--- a/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl
+++ b/third_party/blink/renderer/modules/sanitizer_api/sanitizer_config.idl
@@ -4,4 +4,6 @@
 
 // https://github.com/WICG/sanitizer-api
 
-dictionary SanitizerConfig {};
+dictionary SanitizerConfig {
+  sequence<DOMString>? dropElements;
+};
diff --git a/third_party/blink/renderer/platform/bindings/v8_set_return_value.cc b/third_party/blink/renderer/platform/bindings/v8_set_return_value.cc
index a80ede46..870dbb52 100644
--- a/third_party/blink/renderer/platform/bindings/v8_set_return_value.cc
+++ b/third_party/blink/renderer/platform/bindings/v8_set_return_value.cc
@@ -49,11 +49,11 @@
     const WrapperTypeInfo* wrapper_type_info) {
   RUNTIME_CALL_TIMER_SCOPE_DISABLED_BY_DEFAULT(
       isolate, "Blink_GetInterfaceObjectExposedOnGlobal");
-  V8PerContextData* per_context_data =
-      V8PerContextData::From(creation_context->CreationContext());
-  if (!per_context_data)
-    return v8::Local<v8::Value>();
-  return per_context_data->ConstructorForType(wrapper_type_info);
+  ScriptState* script_state =
+      ScriptState::From(creation_context->CreationContext());
+  if (!script_state->ContextIsValid())
+    return v8::Undefined(isolate);
+  return script_state->PerContextData()->ConstructorForType(wrapper_type_info);
 }
 
 }  // namespace bindings
diff --git a/third_party/blink/renderer/platform/bindings/v8_set_return_value.h b/third_party/blink/renderer/platform/bindings/v8_set_return_value.h
index 7010888..58be6b8 100644
--- a/third_party/blink/renderer/platform/bindings/v8_set_return_value.h
+++ b/third_party/blink/renderer/platform/bindings/v8_set_return_value.h
@@ -351,12 +351,11 @@
     v8::Local<v8::Object> creation_context,
     const WrapperTypeInfo* wrapper_type_info);
 
-template <typename CallbackInfo>
-void V8SetReturnValue(const CallbackInfo& info,
-                      const WrapperTypeInfo* wrapper_type_info,
-                      V8ReturnValue::InterfaceObject) {
+inline void V8SetReturnValue(const v8::PropertyCallbackInfo<v8::Value>& info,
+                             const WrapperTypeInfo* wrapper_type_info,
+                             V8ReturnValue::InterfaceObject) {
   info.GetReturnValue().Set(GetInterfaceObjectExposedOnGlobal(
-      info.GetIsolate(), info.This(), wrapper_type_info));
+      info.GetIsolate(), info.Holder(), wrapper_type_info));
 }
 
 // Nullable types
diff --git a/third_party/blink/renderer/platform/heap/heap.cc b/third_party/blink/renderer/platform/heap/heap.cc
index 59a02b6..c27d0ed 100644
--- a/third_party/blink/renderer/platform/heap/heap.cc
+++ b/third_party/blink/renderer/platform/heap/heap.cc
@@ -313,11 +313,15 @@
                    Callback callback,
                    YieldPredicate should_yield,
                    int task_id) {
-  size_t processed_callback_count = 0;
+  // For concurrent markers, should_yield also reports marked bytes.
+  if (should_yield()) {
+    return false;
+  }
+  size_t processed_callback_count = kDeadlineCheckInterval;
   typename Worklist::EntryType item;
   while (worklist->Pop(task_id, &item)) {
     callback(item);
-    if (processed_callback_count-- == 0) {
+    if (--processed_callback_count == 0) {
       if (should_yield()) {
         return false;
       }
diff --git a/third_party/blink/renderer/platform/heap/marking_visitor.cc b/third_party/blink/renderer/platform/heap/marking_visitor.cc
index 2a4c874..df3d97ef 100644
--- a/third_party/blink/renderer/platform/heap/marking_visitor.cc
+++ b/third_party/blink/renderer/platform/heap/marking_visitor.cc
@@ -304,6 +304,11 @@
   DCHECK_NE(WorklistTaskId::MutatorThread, task_id);
 }
 
+ConcurrentMarkingVisitor::~ConcurrentMarkingVisitor() {
+  // ConcurrentMarkingVisitor should report all its marked_bytes before dying.
+  DCHECK_EQ(marked_bytes_, last_marked_bytes_);
+}
+
 void ConcurrentMarkingVisitor::FlushWorklists() {
   // Flush marking worklists for further marking on the mutator thread.
   marking_worklist_.FlushToGlobal();
diff --git a/third_party/blink/renderer/platform/heap/marking_visitor.h b/third_party/blink/renderer/platform/heap/marking_visitor.h
index 55cd95d4..6b472bd 100644
--- a/third_party/blink/renderer/platform/heap/marking_visitor.h
+++ b/third_party/blink/renderer/platform/heap/marking_visitor.h
@@ -230,7 +230,7 @@
 class PLATFORM_EXPORT ConcurrentMarkingVisitor : public MarkingVisitorBase {
  public:
   ConcurrentMarkingVisitor(ThreadState*, MarkingMode, int);
-  ~ConcurrentMarkingVisitor() override = default;
+  ~ConcurrentMarkingVisitor() override;
 
   virtual void FlushWorklists();
 
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc
index 18c2970..bece34a 100644
--- a/third_party/blink/renderer/platform/heap/thread_state.cc
+++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -1746,6 +1746,9 @@
   Heap().AdvanceConcurrentMarking(concurrent_visitor.get(), job,
                                   marking_scheduling_.get());
 
+  marking_scheduling_->AddConcurrentlyMarkedBytes(
+      concurrent_visitor->RecentlyMarkedBytes());
+
   concurrent_visitor->FlushWorklists();
 }
 
diff --git a/third_party/blink/renderer/platform/widget/input/OWNERS b/third_party/blink/renderer/platform/widget/input/OWNERS
index c81e7a79..5f2c0785 100644
--- a/third_party/blink/renderer/platform/widget/input/OWNERS
+++ b/third_party/blink/renderer/platform/widget/input/OWNERS
@@ -2,6 +2,7 @@
 tdresser@chromium.org
 bokan@chromium.org
 nzolghadr@chromium.org
+flackr@chromium.org
 
 # TEAM: input-dev@chromium.org
 # COMPONENT: Blink>Input
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
index 1e41eae..6e49082 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
+++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -670,3 +670,6 @@
 # broken by https://chromium-review.googlesource.com/c/chromium/src/+/2392444
 crbug.com/958381 external/wpt/css/css-flexbox/table-as-item-wide-content.html [ Failure ]
 crbug.com/958381 external/wpt/css/css-flexbox/table-as-item-fixed-min-width.html [ Failure ]
+
+# math display values are only supported when MathML Core is enabled.
+crbug.com/6606 external/wpt/css/css-display/display-math-on-non-mathml-elements.html [ Failure ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 26535089..cee8339 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1624,10 +1624,17 @@
 crbug.com/441840 external/wpt/css/css-shapes/shape-outside/values/shape-outside-polygon-004.html [ Failure ]
 crbug.com/441840 [ Win ] external/wpt/css/css-shapes/shape-outside/values/shape-outside-shape-arguments-000.html [ Failure ]
 
-crbug.com/1022182 external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-import.html [ Failure ]
-crbug.com/1022182 external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed.html [ Timeout ]
-crbug.com/1022182 external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-immediate-promise.html [ Timeout ]
-crbug.com/1022182 external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-promise.html [ Timeout ]
+# Fix once top-level-await is enabled
+crbug.com/1022182 external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4-tla.html [ Skip ]
+crbug.com/1022182 external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed.html [ Skip ]
+crbug.com/1022182 external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-immediate-promise.html [ Skip ]
+crbug.com/1022182 external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-import.html [ Skip ]
+crbug.com/1022182 external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-promise.html [ Skip ]
+crbug.com/1022182 virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4-tla.html [ Pass ]
+crbug.com/1022182 virtual/module-top-level-await/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed.html [ Pass ]
+crbug.com/1022182 virtual/module-top-level-await/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-immediate-promise.html [ Pass ]
+crbug.com/1022182 virtual/module-top-level-await/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-import.html [ Pass ]
+crbug.com/1022182 virtual/module-top-level-await/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-promise.html [ Pass ]
 
 crbug.com/676270 [ Mac ] external/wpt/css/css-text/hyphens/hyphens-auto-001.html [ Failure ]
 crbug.com/1022415 [ Mac ] external/wpt/css/css-text/hyphens/hyphens-auto-010.html [ Failure ]
@@ -2529,6 +2536,14 @@
 crbug.com/1105958 external/wpt/payment-request/payment-is-showing.https.html [ Timeout ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Linux ] external/wpt/fetch/connection-pool/network-partition-key.html [ Timeout ]
+crbug.com/626703 [ Mac ] external/wpt/fetch/connection-pool/network-partition-key.html [ Timeout ]
+crbug.com/626703 [ Mac11.0 ] external/wpt/fetch/connection-pool/network-partition-key.html [ Timeout ]
+crbug.com/626703 [ Win ] external/wpt/fetch/connection-pool/network-partition-key.html [ Timeout ]
+crbug.com/626703 [ Linux ] virtual/omt-worker-fetch/external/wpt/fetch/connection-pool/network-partition-key.html [ Timeout ]
+crbug.com/626703 [ Mac ] virtual/omt-worker-fetch/external/wpt/fetch/connection-pool/network-partition-key.html [ Timeout ]
+crbug.com/626703 [ Mac11.0 ] virtual/omt-worker-fetch/external/wpt/fetch/connection-pool/network-partition-key.html [ Timeout ]
+crbug.com/626703 [ Win ] virtual/omt-worker-fetch/external/wpt/fetch/connection-pool/network-partition-key.html [ Timeout ]
 crbug.com/626703 [ Linux ] external/wpt/css/css-text/white-space/eol-spaces-bidi-002.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/css/css-text/white-space/eol-spaces-bidi-002.html [ Failure ]
 crbug.com/626703 [ Mac11.0 ] external/wpt/css/css-text/white-space/eol-spaces-bidi-002.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index f62870f..3b7e9c8 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1,7 +1,14 @@
 [
   {
     "prefix": "module-top-level-await",
-    "bases": [],
+    "bases": [
+      "external/wpt/html/webappapis/dynamic-markup-insertion/document-write",
+      "external/wpt/html/semantics/scripting-1/the-script-element/module",
+      "fast/dom/HTMLScriptElement/module-script.html",
+      "fast/dom/script-module-with-export-leak.html",
+      "fast/loader/invalid-module-specifier.html",
+      "http/tests/devtools/isolated-code-cache/"
+    ],
     "args": ["--enable-features=TopLevelAwait"]
   },
   {
diff --git a/third_party/blink/web_tests/android/WebviewWPTExpectations b/third_party/blink/web_tests/android/WebviewWPTExpectations
index 17b623e..c8ab373b 100644
--- a/third_party/blink/web_tests/android/WebviewWPTExpectations
+++ b/third_party/blink/web_tests/android/WebviewWPTExpectations
@@ -573,7 +573,7 @@
 crbug.com/1050754 external/wpt/cookies/samesite/form-post-blank.https.html [ Failure ]
 crbug.com/1050754 external/wpt/cookies/samesite/iframe-reload.https.html [ Failure ]
 crbug.com/1050754 external/wpt/cookies/samesite/iframe-reload.https.html?legacy-samesite [ Failure ]
-crbug.com/1050754 external/wpt/cookies/samesite/iframe.document.html [ Failure ]
+crbug.com/1050754 external/wpt/cookies/samesite/iframe.document.https.html [ Failure ]
 crbug.com/1050754 external/wpt/cookies/samesite/iframe.https.html [ Failure ]
 crbug.com/1050754 external/wpt/cookies/samesite/iframe.https.html?legacy-samesite [ Failure ]
 crbug.com/1050754 external/wpt/cookies/samesite/img.https.html [ Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index b7a49a5..8001eeed 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -170925,6 +170925,10 @@
       "8b5f5015f9ebc818cbf48666773440a359e1d740",
       []
      ],
+     "display-math-on-non-mathml-elements-expected.txt": [
+      "5f6e4297807904a219245c4d5a2e76861e8271be",
+      []
+     ],
      "display-none-inline-img-ref.html": [
       "a3e7369afbae5c35cabbda9aa1a0fe8ab4521af4",
       []
@@ -204066,6 +204070,34 @@
       ]
      }
     },
+    "connection-pool": {
+     "resources": {
+      "network-partition-checker.html": [
+       "b058f611242bb8cce4571409ef30c8ea0d7ed22f",
+       []
+      ],
+      "network-partition-iframe-checker.html": [
+       "f76ed1844719c9f88b53e5f2d35f7a86d8663c3c",
+       []
+      ],
+      "network-partition-key.js": [
+       "bd66109380f21ef171cb90f6c7a1ddafd7dd9211",
+       []
+      ],
+      "network-partition-key.py": [
+       "44ddae7a75df21908310a66cff719755c52629bb",
+       []
+      ],
+      "network-partition-worker-checker.html": [
+       "e6b7ea7673fe798b2e5a737056007b5a25e3c792",
+       []
+      ],
+      "network-partition-worker.js": [
+       "1745edfacb130f5a0c177296fa6324acc45ab9f5",
+       []
+      ]
+     }
+    },
     "content-encoding": {
      "resources": {
       "bad-gzip-body.py": [
@@ -209676,7 +209708,7 @@
       },
       "images": {
        "image.py": [
-        "1aec081926317c158503e36a6ce073f51d6eb59a",
+        "b8bb34e61803b69edabfea3a9f9994f77bf77ef8",
         []
        ]
       },
@@ -217320,6 +217352,14 @@
          "8ccb58120664d2bb8e5cd76d22c10e8b431166ad",
          []
         ],
+        "evaluation-order-4.1.mjs": [
+         "f3347c1d28eac466c6d6ec67c60b9f1261b08b38",
+         []
+        ],
+        "evaluation-order-4.2.mjs": [
+         "96a5cca3a63b46d8cff21ad4f64cb8c9cccf699d",
+         []
+        ],
         "evaluation-order-setup.mjs": [
          "d3f22e9ee0f0bb00f1404c44469f8fd2c57b1bf3",
          []
@@ -218604,7 +218644,7 @@
         []
        ],
        "module-tla-promise-iframe.html": [
-        "5c55bed6c07af592f14ad2372722d3388a5041a6",
+        "edc9e80cb394b2350be63aec018bc81a6c773144",
         []
        ],
        "nested-document-write-1.html": [
@@ -220295,7 +220335,7 @@
      []
     ],
     "intersection-observer.idl": [
-     "fa1de190387ec62a2c86aba97a0002f4db4537db",
+     "52db1c4baa9562f836f2273a4b21a4f970ff9318",
      []
     ],
     "intervention-reporting.idl": [
@@ -238617,7 +238657,7 @@
        []
       ],
       "request.py": [
-       "28f407c806528c9574642794447605182a42f098",
+       "dbfe067ba7ff4b2f1c731f063e932143a0bb234f",
        []
       ],
       "response.py": [
@@ -238633,7 +238673,7 @@
        []
       ],
       "server.py": [
-       "56342ed287d8fa1028796e5083e1f1f99375217a",
+       "d6718df3f525d21ce848f75eb91d0741d857e5cb",
        []
       ],
       "sslutils": {
@@ -273534,6 +273574,13 @@
        {}
       ]
      ],
+     "display-math-on-non-mathml-elements.html": [
+      "2d117cfff575becd824ddefa2f98f6690913197f",
+      [
+       null,
+       {}
+      ]
+     ],
      "display-with-float-dynamic.html": [
       "7cc2fefcc42f4fc0aa7b72fabbf2fc8df6c38048",
       [
@@ -296073,6 +296120,13 @@
        {}
       ]
      ],
+     "form-elements-namedItem.html": [
+      "385d0f281d14a11ae86f8136433cb0ed088ad036",
+      [
+       null,
+       {}
+      ]
+     ],
      "form-reset-callback.html": [
       "8b8497f8b6c4268a0fcd10baeb39bda15a09ac0e",
       [
@@ -317082,6 +317136,17 @@
       ]
      }
     },
+    "connection-pool": {
+     "network-partition-key.html": [
+      "60a784cd84ed92bbcd34aae050289a2676ed45bf",
+      [
+       null,
+       {
+        "timeout": "long"
+       }
+      ]
+     ]
+    },
     "content-encoding": {
      "bad-gzip-body.any.js": [
       "f820322668c1cd79f1453cba918f1cf38bf8a1bb",
@@ -338953,7 +339018,7 @@
       ]
      ],
      "reporting-navigation.https.html": [
-      "680cc6af29a4b5f546179dfa7652a0ddf1fe687a",
+      "fe42015913b56d1ca0fdd234d4ad6ad9d0926af2",
       [
        null,
        {
@@ -338971,7 +339036,7 @@
       ]
      ],
      "reporting-to-endpoint.https.html": [
-      "02c719da7372555386e89cb159910bf13e3900ff",
+      "416732497bdd58f654cbfd883721352a8c7ecba7",
       [
        null,
        {
@@ -350958,21 +351023,21 @@
          ]
         ],
         "choice-of-error-1.html": [
-         "73a6ce3db005df26d3a2cb3134d5ae99ec5570db",
+         "50933da2c1d56c1427edaea838bcb477b05951ca",
          [
           null,
           {}
          ]
         ],
         "choice-of-error-2.html": [
-         "0d67cb819a9b376ce617cf1be495c0d559bfebe8",
+         "51adb09d11ada5391f93d931e990e9242afaa3ed",
          [
           null,
           {}
          ]
         ],
         "choice-of-error-3.html": [
-         "5c0adff6ea8200fa1c1c4d97590d6f01c725c9a8",
+         "bc52119bfe4877bb7c779218fcbf14baf35954dd",
          [
           null,
           {}
@@ -351200,21 +351265,21 @@
          ]
         ],
         "error-type-1.html": [
-         "6f119e30064712a180aa1f9a53b49e679e567ac4",
+         "2480a60d6d42a2f6e630c3c20a827621aeb3a256",
          [
           null,
           {}
          ]
         ],
         "error-type-2.html": [
-         "a7df1df0c866682b6cdf8a6f557ced8130a2b9df",
+         "673bf28ca2057b375b563b0b0eb53c553919157b",
          [
           null,
           {}
          ]
         ],
         "error-type-3.html": [
-         "9b00df38915abe7d19a1658af9fb545ca4769926",
+         "8a16266f4cdf700b381c9e7dc1c0dbc39eee8377",
          [
           null,
           {}
@@ -351311,6 +351376,13 @@
           {}
          ]
         ],
+        "evaluation-order-4-tla.html": [
+         "da07faf42d611586a295bfa3e694f7bc29d070c0",
+         [
+          null,
+          {}
+         ]
+        ],
         "execorder.html": [
          "6a7513dc1361de0716584df8a5e7c8b3df2b69f3",
          [
@@ -355117,7 +355189,7 @@
         ]
        ],
        "module-tla-delayed.html": [
-        "f269dcbcb9399e0cd08306c529bcb2de97b5cdcc",
+        "e54bf5d5388d8fadacf5027d65cfec0a38510c27",
         [
          null,
          {}
@@ -355131,14 +355203,14 @@
         ]
        ],
        "module-tla-import.html": [
-        "f59c3c0abe705b968ebabef504cd3a6c56830338",
+        "20645f4d788ad713bf9d1be53f2f47533f6aba3b",
         [
          null,
          {}
         ]
        ],
        "module-tla-promise.html": [
-        "5fc30a8b0e74f496106f4e5b83439958c3118056",
+        "4f1281bcce4799fa792250989f571e3b1a7888d6",
         [
          null,
          {}
@@ -382436,7 +382508,7 @@
      ]
     ],
     "wakelock-onrelease.https.html": [
-     "88c0cdb654c8e700195c430aa74fb2238ce9db10",
+     "524580cf370dbea3d10160f39dd2c63d4f3d4580",
      [
       null,
       {
@@ -412172,7 +412244,7 @@
      ]
     ],
     "set.window.js": [
-     "1c20907939ad0b7b42987f9b2c573e4a17c10707",
+     "8e671d2dedd353793da72bdc9aebed269d0d9d4d",
      [
       "webstorage/set.window.html",
       {}
diff --git a/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-and-without-leading-period.sub.html b/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-and-without-leading-period.sub.https.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-and-without-leading-period.sub.html
rename to third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-and-without-leading-period.sub.https.html
diff --git a/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-and-without-leading-period.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-and-without-leading-period.sub.https.html.sub.headers
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-and-without-leading-period.sub.html.sub.headers
rename to third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-and-without-leading-period.sub.https.html.sub.headers
diff --git a/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-leading-period.sub.html b/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-leading-period.sub.https.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-leading-period.sub.html
rename to third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-leading-period.sub.https.html
diff --git a/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-leading-period.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-leading-period.sub.https.html.sub.headers
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-leading-period.sub.html.sub.headers
rename to third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-host-with-leading-period.sub.https.html.sub.headers
diff --git a/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-matches-host.sub.html b/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-matches-host.sub.https.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-matches-host.sub.html
rename to third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-matches-host.sub.https.html
diff --git a/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-matches-host.sub.html.sub.headers b/third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-matches-host.sub.https.html.sub.headers
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-matches-host.sub.html.sub.headers
rename to third_party/blink/web_tests/external/wpt/cookies/domain/domain-attribute-matches-host.sub.https.html.sub.headers
diff --git a/third_party/blink/web_tests/external/wpt/cookies/samesite/iframe.document.html b/third_party/blink/web_tests/external/wpt/cookies/samesite/iframe.document.https.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/cookies/samesite/iframe.document.html
rename to third_party/blink/web_tests/external/wpt/cookies/samesite/iframe.document.https.html
diff --git a/third_party/blink/web_tests/external/wpt/css/css-display/display-math-on-non-mathml-elements-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-display/display-math-on-non-mathml-elements-expected.txt
new file mode 100644
index 0000000..5f6e4297
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-display/display-math-on-non-mathml-elements-expected.txt
@@ -0,0 +1,11 @@
+This is a testharness.js-based test.
+PASS computed display on <DIV style="display: math;">
+PASS computed display on <DIV style="display: inline-math;">
+FAIL computed display on <DIV style="display: inline math;"> assert_equals: expected "inline" but got "block"
+PASS computed display on <DIV style="display: block math;">
+PASS computed display on <svg style="display: math;">
+PASS computed display on <svg style="display: inline-math;">
+PASS computed display on <svg style="display: inline math;">
+FAIL computed display on <svg style="display: block math;"> assert_equals: expected "block" but got "inline"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-display/display-math-on-non-mathml-elements.html b/third_party/blink/web_tests/external/wpt/css/css-display/display-math-on-non-mathml-elements.html
new file mode 100644
index 0000000..2d117cf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-display/display-math-on-non-mathml-elements.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>display: math and inline-math on non-MathML compute to flow</title>
+<link rel="help" href="https://drafts.csswg.org/css-display/#the-display-properties">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+
+<div id="container">
+
+  <div data-expected="block" style="display: math;"></div>
+  <div data-expected="inline" style="display: inline-math;"></div>
+  <div data-expected="inline" style="display: inline math;"></div>
+  <div data-expected="block" style="display: block math;"></div>
+
+  <svg data-expected="block" style="display: math;"></svg>
+  <svg data-expected="inline" style="display: inline-math;"></svg>
+  <svg data-expected="inline" style="display: inline math;"></svg>
+  <svg data-expected="block" style="display: block math;"></svg>
+
+</div>
+
+<script>
+  Array.from(container.children).forEach(element => {
+      test(function() {
+          assert_equals(window.getComputedStyle(element).display,
+                        element.getAttribute('data-expected'));
+      }, `computed display on <${element.tagName} style="${element.getAttribute('style')}">`);
+  });
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/connection-pool/network-partition-key.html b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/network-partition-key.html
new file mode 100644
index 0000000..60a784c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/network-partition-key.html
@@ -0,0 +1,264 @@
+<!doctype html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Connection partitioning by site</title>
+  <meta name="help" href="https://fetch.spec.whatwg.org/#network-partition-keys">
+  <meta name="timeout" content="long">
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="/common/utils.js"></script>
+  <script src="/common/get-host-info.sub.js"></script>
+</head>
+<body>
+<!-- Used to open about:blank tabs from opaque origins -->
+<iframe id="iframe0" sandbox="allow-popups allow-scripts allow-popups-to-escape-sandbox"></iframe>
+<iframe id="iframe1" sandbox="allow-popups allow-scripts allow-popups-to-escape-sandbox"></iframe>
+<script>
+const host = get_host_info();
+
+// These two origins must correspond to different sites for this test to pass.
+const POPUP_ORIGINS = [
+  host.ORIGIN,
+  host.HTTP_NOTSAMESITE_ORIGIN
+];
+
+// This origin should ideally correspond to a different site from the two above, but the
+// tests will still pass if it matches the site of one of the other two origins.
+const OTHER_ORIGIN = host.REMOTE_ORIGIN;
+
+// Except for the csp_sandbox and about:blanks, each test opens up two windows, one at
+// POPUP_ORIGINS[0], one at POPUP_ORIGINS[1], and has them request subresources from
+// subresource_origin. All requests (HTML, JS, and fetch requests) for each window go
+// through network-partition-key.py and have a partition_id parameter, which is used
+// to check if any request for one window uses the same socket as a request for the
+// other window.
+//
+// Whenever requests from the two different popup windows use the same connection, the
+// fetch requests all start returning 400 errors, but other requests will continue to
+// succeed, to make for clearer errors.
+//
+// include_credentials indicates whether the fetch requests use credentials or not,
+// which is interesting as uncredentialed sockets have separate connection pools.
+const tests = [
+  {
+    name: 'With credentials',
+    subresource_origin: POPUP_ORIGINS[0],
+    include_credentials: true,
+    popup_params: [
+      {type: 'main_frame'},
+      {type: 'main_frame'}
+    ]
+  },
+  {
+    name: 'Without credentials',
+    subresource_origin: POPUP_ORIGINS[0],
+    include_credentials: false,
+    popup_params: [
+      {type: 'main_frame'},
+      {type: 'main_frame'}
+    ]
+  },
+  {
+    name: 'Cross-site resources with credentials',
+    subresource_origin: OTHER_ORIGIN,
+    include_credentials: true,
+    popup_params: [
+      {type: 'main_frame'},
+      {type: 'main_frame'}
+    ]
+  },
+  {
+    name: 'Cross-site resources without credentials',
+    subresource_origin: OTHER_ORIGIN,
+    include_credentials: false,
+    popup_params: [
+      {type: 'main_frame'},
+      {type: 'main_frame'}
+    ]
+  },
+  {
+    name: 'Iframes',
+    subresource_origin: OTHER_ORIGIN,
+    include_credentials: true,
+    popup_params: [
+      {
+        type: 'iframe',
+        iframe_origin: OTHER_ORIGIN
+      },
+      {
+        type: 'iframe',
+        iframe_origin: OTHER_ORIGIN
+      }
+    ]
+  },
+  {
+    name: 'Workers',
+    subresource_origin: POPUP_ORIGINS[0],
+    include_credentials: true,
+    popup_params: [
+      {type: 'worker'},
+      {type: 'worker'}
+    ]
+  },
+  {
+    name: 'Workers with cross-site resources',
+    subresource_origin: OTHER_ORIGIN,
+    include_credentials: true,
+    popup_params: [
+      {type: 'worker'},
+      {type: 'worker'}
+    ]
+  },
+  {
+    name: 'CSP sandbox',
+    subresource_origin: POPUP_ORIGINS[0],
+    include_credentials: true,
+    popup_params: [
+      {type: 'csp_sandbox'},
+      {type: 'csp_sandbox'}
+    ]
+  },
+  {
+    name: 'about:blank from opaque origin iframe',
+    subresource_origin: OTHER_ORIGIN,
+    include_credentials: true,
+    popup_params: [
+      {type: 'opaque_about_blank'},
+      {type: 'opaque_about_blank'}
+    ]
+  },
+];
+
+const BASE_PATH = window.location.pathname.replace(/\/[^\/]*$/, '/');
+
+function create_script_url(origin, uuid, partition_id, dispatch) {
+  return `${origin}${BASE_PATH}resources/network-partition-key.py?uuid=${uuid}&partition_id=${partition_id}&dispatch=${dispatch}`
+}
+
+function run_test(test) {
+  var uuid = token();
+
+  // Used to track the opened popup windows, so they can be closed at the end of the test.
+  // They could be closed immediately after use, but safest to keep them open, as browsers
+  // could use closing a window as a hint to close idle sockets that the window used.
+  var popup_windows = [];
+
+  // Creates a popup window at |url| and waits for a test result. Returns a promise.
+  function create_popup_and_wait_for_result(url) {
+    return new Promise(function(resolve, reject) {
+      popup_windows.push(window.open(url));
+      // Listen for the result
+      function message_listener(event) {
+        if (event.data.result === 'success') {
+          resolve();
+        } else if (event.data.result === 'error') {
+          reject(event.data.details);
+        } else {
+          reject('Unexpected message.');
+        }
+      }
+      window.addEventListener('message', message_listener, {once: 'true'});
+    });
+  }
+
+  // Navigates iframe to url and waits for a test result. Returns a promise.
+  function navigate_iframe_and_wait_for_result(iframe, url) {
+    return new Promise(function(resolve, reject) {
+      iframe.src = url;
+      // Listen for the result
+      function message_listener(event) {
+        if (event.data.result === 'success') {
+          resolve();
+        } else if (event.data.result === 'error') {
+          reject(event.data.details);
+        } else {
+          reject('Unexpected message.');
+        }
+      }
+      window.addEventListener('message', message_listener, {once: 'true'});
+    });
+  }
+
+  function make_test_function(test, index) {
+    var popup_params = test.popup_params[index];
+    return function() {
+      var popup_path;
+      var additional_url_params = '';
+      var origin = POPUP_ORIGINS[index];
+      var partition_id = POPUP_ORIGINS[index];
+      if (popup_params.type == 'main_frame') {
+        popup_path = 'resources/network-partition-checker.html';
+      } else if (popup_params.type == 'iframe') {
+        popup_path = 'resources/network-partition-iframe-checker.html';
+        additional_url_params = `&other_origin=${popup_params.iframe_origin}`;
+      } else if (popup_params.type == 'worker') {
+        popup_path = 'resources/network-partition-worker-checker.html';
+        // The origin of the dedicated worker must mutch the page that loads it.
+        additional_url_params = `&other_origin=${POPUP_ORIGINS[index]}`;
+      } else if (popup_params.type == 'csp_sandbox') {
+        // For the Content-Security-Policy sandbox test, all requests are from the same origin, but
+        // the origin should be treated as an opaque origin, so sockets should not be reused.
+        origin = test.subresource_origin;
+        partition_id = index;
+        popup_path = 'resources/network-partition-checker.html';
+        // Don't check partition of root document, since the document isn't sandboxed until the
+        // root document is fetched.
+        additional_url_params = '&sandbox=true&nocheck_partition=true'
+      } else if (popup_params.type=='opaque_about_blank') {
+        popup_path = 'resources/network-partition-about-blank-checker.html';
+      } else if (popup_params.type == 'iframe') {
+        throw 'Unrecognized popup_params.type.';
+      }
+      var url = create_script_url(origin, uuid, partition_id, 'fetch_file');
+      url += `&subresource_origin=${test.subresource_origin}`
+      url += `&include_credentials=${test.include_credentials}`
+      url += `&path=${BASE_PATH.substring(1)}${popup_path}`;
+      url += additional_url_params;
+
+      if (popup_params.type=='opaque_about_blank') {
+        return navigate_iframe_and_wait_for_result(iframe = document.getElementById('iframe' + index), url);
+      }
+
+      return create_popup_and_wait_for_result(url);
+    }
+  }
+
+  // Takes a Promise, and cleans up state when the promise has completed, successfully or not, re-throwing
+  // any exception from the passed in Promise.
+  async function clean_up_when_done(promise) {
+    var error;
+    try {
+      await promise;
+    } catch (e) {
+      error = e;
+    }
+
+    popup_windows.map(function (win) { win.close(); });
+
+    try {
+      var cleanup_url = create_script_url(host.ORIGIN, uuid, host.ORIGIN, 'clean_up');
+      var response = await fetch(cleanup_url, {credentials: 'omit', mode: 'cors'});
+      assert_equals(await response.text(), 'cleanup complete', `Sever state cleanup failed`);
+    } catch (e) {
+      // Prefer error from the passed in Promise over errors from the fetch request to clean up server state.
+      error = error || e;
+    }
+    if (error)
+      throw error;
+  }
+
+  return clean_up_when_done(
+      make_test_function(test, 0)()
+      .then(make_test_function(test, 1)));
+}
+
+tests.forEach(function (test) {
+  promise_test(
+      function() { return run_test(test); },
+      test.name);
+})
+
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-checker.html b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-checker.html
new file mode 100644
index 0000000..b058f61
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-checker.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Network Partition Checker</title>
+  <meta name="help" href="https://fetch.spec.whatwg.org/#network-partition-keys">
+  <meta name="timeout" content="normal">
+  <script src="SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=common/utils.js"></script>
+  <script src="SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=resources/testharness.js"></script>
+  <script src="SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=fetch/connection-pool/resources/network-partition-key.js"></script>
+</head>
+<body>
+<script>
+  async function fetch_and_reply() {
+    // If this is a top level window, report to the opener. Otherwise, this is an iframe,
+    // so report to the parent.
+    var report_to = window.opener;
+    if (!report_to)
+      report_to = window.parent;
+    try {
+       await check_partition_ids();
+       report_to.postMessage({result: 'success'}, '*');
+    } catch (e) {
+     report_to.postMessage({result: 'error', details: e.message}, '*');
+    }
+  }
+  fetch_and_reply();
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-iframe-checker.html b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-iframe-checker.html
new file mode 100644
index 0000000..f76ed184
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-iframe-checker.html
@@ -0,0 +1,22 @@
+<!doctype html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Iframe Network Partition Checker</title>
+  <meta name="help" href="https://fetch.spec.whatwg.org/#network-partition-keys">
+  <meta name="timeout" content="normal">
+  <script src="SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=common/utils.js"></script>
+  <script src="SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=resources/testharness.js"></script>
+  <script src="SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=fetch/connection-pool/resources/network-partition-key.js"></script>
+</head>
+<body>
+<script>
+  // Listen for first message from the iframe, and pass it back to the opener.
+  function message_listener(event) {
+    window.opener.postMessage(event.data, '*');
+  }
+  window.addEventListener('message', message_listener, {once: 'true'});
+</script>
+<iframe src="SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=fetch/connection-pool/resources/network-partition-checker.html"></iframe>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-key.js b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-key.js
new file mode 100644
index 0000000..bd66109
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-key.js
@@ -0,0 +1,47 @@
+// Runs multiple fetches that validate connections see only a single partition_id.
+// Requests are run in parallel so that they use multiple connections to maximize the
+// chance of exercising all matching connections in the connection pool. Only returns
+// once all requests have completed to make cleaning up server state non-racy.
+function check_partition_ids(location) {
+  const NUM_FETCHES = 20;
+
+  var base_url = 'SUBRESOURCE_PREFIX:&dispatch=check_partition';
+
+  // Not a perfect parse of the query string, but good enough for this test.
+  var include_credentials = base_url.search('include_credentials=true') != -1;
+  var exclude_credentials = base_url.search('include_credentials=false') != -1;
+  if (include_credentials != !exclude_credentials)
+    throw new Exception('Credentials mode not specified');
+
+
+  // Run NUM_FETCHES in parallel.
+  var fetches = [];
+  for (i = 0; i < NUM_FETCHES; ++i) {
+    var fetch_params = {
+      credentials: 'omit',
+      mode: 'cors',
+      headers: {
+        'Header-To-Force-CORS': 'cors'
+      },
+    };
+
+    // Use a unique URL for each request, in case the caching layer serializes multiple
+    // requests for the same URL.
+    var url = `${base_url}&${token()}`;
+
+    fetches.push(fetch(url, fetch_params).then(
+        function (response) {
+          return response.text().then(function(text) {
+            assert_equals(text, 'ok', `Socket unexpectedly reused`);
+          });
+        }));
+  }
+
+  // Wait for all promises to complete.
+  return Promise.allSettled(fetches).then(function (results) {
+    results.forEach(function (result) {
+      if (result.status != 'fulfilled')
+        throw result.reason;
+    });
+  });
+}
diff --git a/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-key.py b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-key.py
new file mode 100755
index 0000000..44ddae7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-key.py
@@ -0,0 +1,118 @@
+#!/usr/bin/env python
+
+import datetime
+import json
+import mimetypes
+import os
+import sys
+import time
+
+# Test server that tracks the last partition_id was used with each connection for each uuid, and
+# lets consumers query if multiple different partition_ids have been been used for any socket.
+#
+# Server assumes that ports aren't reused, so a client address and a server port uniquely identify
+# a connection. If that constraint is ever violated, the test will be flaky. No sockets being
+# closed for the duration of the test is sufficient to ensure that, though even if sockets are
+# closed, the OS should generally prefer to use new ports for new connections, if any are
+# available.
+def main(request, response):
+    response.headers.set(b"Cache-Control", b"no-store")
+    dispatch = request.GET.first(b"dispatch", None)
+    uuid = request.GET.first(b"uuid", None)
+    partition_id = request.GET.first(b"partition_id", None)
+
+    if not uuid or not dispatch or not partition_id:
+        return simple_response(request, response, 404, b"Not found", b"Invalid query parameters")
+
+    # Unless nocheck_partition is true, check partition_id against server_state, and update server_state.
+    stash = request.server.stash
+    test_failed = False
+    if request.GET.first(b"nocheck_partition", None) != "True":
+        # Need to grab the lock to access the Stash, since requests are made in parallel.
+        with stash.lock:
+            # Don't use server hostname here, since H2 allows multiple hosts to reuse a connection.
+            # Server IP is not currently available, unfortunately.
+            address_key = str(request.client_address) + "|" + str(request.url_parts.port)
+            server_state = stash.take(uuid) or { "test_failed": False }
+            if address_key in server_state and server_state[address_key] != partition_id:
+                server_state["test_failed"] = True
+            server_state[address_key] = partition_id
+            test_failed = server_state["test_failed"]
+            stash.put(uuid, server_state)
+
+    origin = request.headers.get(b"Origin")
+    if origin:
+        response.headers.set(b"Access-Control-Allow-Origin", origin)
+        response.headers.set(b"Access-Control-Allow-Credentials", b"true")
+
+    if request.method == u"OPTIONS":
+        return handle_preflight(request, response)
+
+    if dispatch == u"fetch_file":
+        return handle_fetch_file(request, response, partition_id, uuid)
+
+    if dispatch == u"check_partition":
+        if test_failed:
+            return simple_response(request, response, 200, b"OK", b"Multiple partition IDs used on a socket")
+        return simple_response(request, response, 200, b"OK", b"ok")
+
+    if dispatch == u"clean_up":
+        stash.take(uuid)
+        if test_failed:
+          return simple_response(request, response, 200, b"OK", b"Test failed, but cleanup completed.")
+        return simple_response(request, response, 200, b"OK", b"cleanup complete")
+
+    return simple_response(request, response, 404, b"Not Found", b"Unrecognized dispatch parameter: " + dispatch)
+
+def handle_preflight(request, response):
+    response.status = (200, b"OK")
+    response.headers.set(b"Access-Control-Allow-Methods", b"GET")
+    response.headers.set(b"Access-Control-Allow-Headers", b"header-to-force-cors")
+    response.headers.set(b"Access-Control-Max-Age", b"86400")
+    return b"Preflight request"
+
+def simple_response(request, response, status_code, status_message, body, content_type="text/plain"):
+    response.status = (status_code, status_message)
+    response.headers.set(b"Content-Type", content_type)
+    return body
+
+def handle_fetch_file(request, response, partition_id, uuid):
+    subresource_origin = request.GET.first(b"subresource_origin", None)
+    rel_path = request.GET.first(b"path", None)
+
+    # This needs to be passed on to subresources so they all have access to it.
+    include_credentials = request.GET.first(b"include_credentials", None)
+    if not subresource_origin or not rel_path or not include_credentials:
+        return simple_response(request, response, 404, b"Not found", b"Invalid query parameters")
+
+    cur_path = os.path.realpath(__file__)
+    base_path = os.path.abspath(os.path.join(os.path.dirname(cur_path), os.pardir, os.pardir, os.pardir))
+    path = os.path.abspath(os.path.join(base_path, rel_path))
+
+    # Basic security check.
+    if not path.startswith(base_path):
+        return simple_response(request, response, 404, b"Not found", b"Invalid path")
+
+    sandbox = request.GET.first(b"sandbox", None)
+    if sandbox == "true":
+        response.headers.set(b"Content-Security-Policy", "sandbox allow-scripts")
+
+    file = open(path, mode="r")
+    body = file.read()
+    file.close()
+
+    subresource_path = "/" + os.path.relpath(__file__, base_path).replace('\\','/')
+    subresource_params = "?partition_id=" + partition_id + "&uuid=" + uuid + "&subresource_origin=" + subresource_origin + "&include_credentials=" + include_credentials
+    body = body.replace("SUBRESOURCE_PREFIX:", subresource_origin + subresource_path + subresource_params)
+
+    other_origin = request.GET.first(b"other_origin", None)
+    if other_origin:
+        body = body.replace("OTHER_PREFIX:", other_origin + subresource_path + subresource_params)
+
+    mimetypes.init()
+    mimetype_pair = mimetypes.guess_type(path)
+    mimetype = mimetype_pair[0]
+
+    if mimetype == None or mimetype_pair[1] != None:
+        return simple_response(request, response, 500, b"Server Error", b"Unknown MIME type")
+    return simple_response(request, response, 200, b"OK", body, mimetype)
diff --git a/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-worker-checker.html b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-worker-checker.html
new file mode 100644
index 0000000..e6b7ea76
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-worker-checker.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Worker Network Partition Checker</title>
+  <meta name="help" href="https://fetch.spec.whatwg.org/#network-partition-keys">
+  <meta name="timeout" content="normal">
+  <script src="SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=common/utils.js"></script>
+  <script src="SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=resources/testharness.js"></script>
+  <script src="SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=fetch/connection-pool/resources/network-partition-key.js"></script>
+</head>
+<body>
+<script>
+    // Workers must be same origin as the page loading them, but it's simpler to reuse the
+    // OTHER_PREFIX mechanism in the Python code than to craft the URL in Javascript here.
+    var worker = new Worker('OTHER_PREFIX:&dispatch=fetch_file&path=fetch/connection-pool/resources/network-partition-worker.js');
+    function message_listener(event) {
+      window.opener.postMessage(event.data, '*');
+      worker.terminate();
+    }
+    worker.addEventListener('message', message_listener);
+</script>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-worker.js b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-worker.js
new file mode 100644
index 0000000..1745edf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/fetch/connection-pool/resources/network-partition-worker.js
@@ -0,0 +1,15 @@
+// This tests the partition key of fetches to subresouce_origin made by the worker and
+// imported scripts from subresource_origin.
+importScripts('SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=common/utils.js');
+importScripts('SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=resources/testharness.js');
+importScripts('SUBRESOURCE_PREFIX:&dispatch=fetch_file&path=fetch/connection-pool/resources/network-partition-key.js');
+
+async function fetch_and_reply() {
+  try {
+     await check_partition_ids();
+     self.postMessage({result: 'success'});
+  } catch (e) {
+    self.postMessage({result: 'error', details: e.message});
+  }
+}
+fetch_and_reply();
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-navigation.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-navigation.https.html
index 680cc6af2..fe4201591 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-navigation.https.html
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-navigation.https.html
@@ -110,40 +110,38 @@
     function desc(s) {
       return s === '' ? '(none)' : s;
     }
-    async_test(async (t) => {
-      try {
-        const targetUrl = REMOTE_FRAME_URL + testcase.target;
-        const parent =
-          await loadFrames(t, testcase.parent, withEmptyFrame, targetUrl);
-
+    // These tests are very slow, so they must be run in parallel using
+    // async_test.
+    async_test(t => {
+      const targetUrl = REMOTE_FRAME_URL + testcase.target;
+      loadFrames(t, testcase.parent, withEmptyFrame, targetUrl)
+          .then(t.step_func(parent => {
         const contextUrl = parent.src ? parent.src : 'about:blank';
-        const reports = await observeReports(parent.contentWindow);
-        assert_equals(reports.length, testcase.reports.length);
-
-        for (let i = 0; i < reports.length; i += 1) {
-          const report = reports[i];
-          switch (testcase.reports[i]) {
-            case 'CORP':
-              checkCorpReport(report, contextUrl, targetUrl, 'enforce');
-              break;
-            case 'CORP-RO':
-              checkCorpReport(report, contextUrl, targetUrl, 'reporting');
-              break;
-            case 'NAV':
-              checkCoepMismatchReport(report, contextUrl, targetUrl, 'enforce');
-              break;
-            case 'NAV-RO':
-              checkCoepMismatchReport(report, contextUrl, targetUrl, 'reporting');
-              break;
-            default:
-              assert_unreached(
-                'Unexpected report expeaction: ' + testcase.reports[i]);
+        observeReports(parent.contentWindow).then(t.step_func(reports => {
+          assert_equals(reports.length, testcase.reports.length);
+          for (let i = 0; i < reports.length; i += 1) {
+            const report = reports[i];
+            switch (testcase.reports[i]) {
+              case 'CORP':
+                checkCorpReport(report, contextUrl, targetUrl, 'enforce');
+                break;
+              case 'CORP-RO':
+                checkCorpReport(report, contextUrl, targetUrl, 'reporting');
+                break;
+              case 'NAV':
+                checkCoepMismatchReport(report, contextUrl, targetUrl, 'enforce');
+                break;
+              case 'NAV-RO':
+                checkCoepMismatchReport(report, contextUrl, targetUrl, 'reporting');
+                break;
+              default:
+                assert_unreached(
+                  'Unexpected report expeaction: ' + testcase.reports[i]);
+            }
           }
-        }
-        t.done();
-      } catch (e) {
-        t.step(() => { throw e; });
-      }
+          t.done();
+        })).catch(t.step_func(e => { throw e; }));
+      })).catch(t.step_func(e => { throw e; }));
     }, `parent: ${desc(testcase.parent)}, target: ${desc(testcase.target)}, ` +
        `with empty frame: ${withEmptyFrame}`);
   }
diff --git a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-to-endpoint.https.html b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-to-endpoint.https.html
index 02c719d..4167324 100644
--- a/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-to-endpoint.https.html
+++ b/third_party/blink/web_tests/external/wpt/html/cross-origin-embedder-policy/reporting-to-endpoint.https.html
@@ -77,100 +77,82 @@
   assert_unreached(`A report whose blockedURL is ${blockedUrl} and url is ${contextUrl} is not found.`);
 }
 
-async_test(async (t) => {
-  try {
-    const iframe = document.createElement('iframe');
-    t.add_cleanup(() => iframe.remove());
+promise_test(async t => {
+  const iframe = document.createElement('iframe');
+  t.add_cleanup(() => iframe.remove());
 
-    iframe.src = `resources/reporting-empty-frame.html`
-    document.body.appendChild(iframe);
-    await new Promise(resolve => {
-      iframe.addEventListener('load', resolve, {once: true});
-    });
+  iframe.src = `resources/reporting-empty-frame.html`
+  document.body.appendChild(iframe);
+  await new Promise(resolve => {
+    iframe.addEventListener('load', resolve, {once: true});
+  });
 
-    const url = `${REMOTE_ORIGIN}/common/text-plain.txt?${token()}`;
-    const init = { mode: 'no-cors', cache: 'no-store' };
-    // The response comes from cross-origin, and doesn't have a CORP
-    // header, so it is blocked.
-    iframe.contentWindow.fetch(url, init).catch(() => {});
+  const url = `${REMOTE_ORIGIN}/common/text-plain.txt?${token()}`;
+  const init = { mode: 'no-cors', cache: 'no-store' };
+  // The response comes from cross-origin, and doesn't have a CORP
+  // header, so it is blocked.
+  iframe.contentWindow.fetch(url, init).catch(() => {});
 
-    // Wait 3 seconds for reports to settle.
-    await wait(3000);
+  // Wait 3 seconds for reports to settle.
+  await wait(3000);
 
-    checkCorpReportExistence(reports, url, iframe.src, '', 'enforce');
-    checkCorpReportExistence(
+  checkCorpReportExistence(reports, url, iframe.src, '', 'enforce');
+  checkCorpReportExistence(
       reportsForReportOnly, url, iframe.src, '', 'reporting');
-
-    t.done();
-  } catch (e) {
-    t.step(() => { throw e });
-  }
 }, 'subresource CORP');
 
-async_test(async (t) => {
-  try {
-    const iframe = document.createElement('iframe');
-    t.add_cleanup(() => iframe.remove());
+promise_test(async t => {
+  const iframe = document.createElement('iframe');
+  t.add_cleanup(() => iframe.remove());
 
-    iframe.src = `resources/reporting-empty-frame.html`
-    document.body.appendChild(iframe);
-    await new Promise(resolve => {
-      iframe.addEventListener('load', resolve, {once: true});
-    });
+  iframe.src = `resources/reporting-empty-frame.html`
+  document.body.appendChild(iframe);
+  await new Promise(resolve => {
+    iframe.addEventListener('load', resolve, {once: true});
+  });
 
-    const w = iframe.contentWindow;
+  const w = iframe.contentWindow;
 
-    function attachFrame(url) {
-      const frame = w.document.createElement('iframe');
-      frame.src = url;
-      w.document.body.appendChild(frame);
-    }
-
-    const url = `${REMOTE_ORIGIN}/common/blank.html?${token()}`;
-    // The nested frame comes from cross-origin and doesn't have a CORP
-    // header, so it is blocked.
-    attachFrame(url);
-
-    // Wait 3 seconds for reports to settle.
-    await wait(3000);
-
-    checkCorpReportExistence(reports, url, iframe.src, 'iframe', 'enforce');
-    checkCorpReportExistence(
-      reportsForReportOnly, url, iframe.src, 'iframe', 'reporting');
-
-    t.done();
-  } catch (e) {
-    t.step(() => { throw e });
+  function attachFrame(url) {
+    const frame = w.document.createElement('iframe');
+    frame.src = url;
+    w.document.body.appendChild(frame);
   }
+
+  const url = `${REMOTE_ORIGIN}/common/blank.html?${token()}`;
+  // The nested frame comes from cross-origin and doesn't have a CORP
+  // header, so it is blocked.
+  attachFrame(url);
+
+  // Wait 3 seconds for reports to settle.
+  await wait(3000);
+
+  checkCorpReportExistence(reports, url, iframe.src, 'iframe', 'enforce');
+  checkCorpReportExistence(
+      reportsForReportOnly, url, iframe.src, 'iframe', 'reporting');
 }, 'navigation CORP');
 
-async_test(async (t) => {
-  try {
-    const iframe = document.createElement('iframe');
-    t.add_cleanup(() => iframe.remove());
+promise_test(async (t) => {
+  const iframe = document.createElement('iframe');
+  t.add_cleanup(() => iframe.remove());
 
-    iframe.src = 'resources/reporting-empty-frame.html';
-    const targetUrl = `/common/blank.html?${token()}`;
-    iframe.addEventListener('load', () => {
-      const nested = iframe.contentDocument.createElement('iframe');
-      nested.src = targetUrl;
-      // |nested| doesn't have COEP whereas |iframe| has, so it is blocked.
-      iframe.contentDocument.body.appendChild(nested);
-    }, {once: true});
+  iframe.src = 'resources/reporting-empty-frame.html';
+  const targetUrl = `/common/blank.html?${token()}`;
+  iframe.addEventListener('load', t.step_func(() => {
+    const nested = iframe.contentDocument.createElement('iframe');
+    nested.src = targetUrl;
+    // |nested| doesn't have COEP whereas |iframe| has, so it is blocked.
+    iframe.contentDocument.body.appendChild(nested);
+  }), {once: true});
 
-    document.body.appendChild(iframe);
+  document.body.appendChild(iframe);
 
-    // Wait 3 seconds for reports to settle.
-    await wait(3000);
+  // Wait 3 seconds for reports to settle.
+  await wait(3000);
 
-    checkNavigationReportExistence(reports, targetUrl, iframe.src, 'enforce');
-    checkNavigationReportExistence(
-      reportsForReportOnly, targetUrl, iframe.src, 'reporting');
-
-    t.done();
-  } catch (e) {
-    t.step(() => { throw e });
-  }
+  checkNavigationReportExistence(reports, targetUrl, iframe.src, 'enforce');
+  checkNavigationReportExistence(
+    reportsForReportOnly, targetUrl, iframe.src, 'reporting');
 }, 'COEP violation on nested frame navigation');
 
 </script>$
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/elements/images/image.py b/third_party/blink/web_tests/external/wpt/html/dom/elements/images/image.py
index 1aec0819..b8bb34e 100644
--- a/third_party/blink/web_tests/external/wpt/html/dom/elements/images/image.py
+++ b/third_party/blink/web_tests/external/wpt/html/dom/elements/images/image.py
@@ -4,7 +4,7 @@
 
 def main(request, response):
 
-    key = request.GET['id']
+    key = request.GET[b'id']
     alreadyServedRequest = False
     try:
       alreadyServedRequest = request.server.stash.take(key)
@@ -19,10 +19,10 @@
       pass
 
     response.writer.write_status(200)
-    response.writer.write_header(b"etag", "abcdef")
+    response.writer.write_header(b"etag", b"abcdef")
     response.writer.write_header(b"content-length", len(body))
-    response.writer.write_header(b"content-type", "image/png")
-    response.writer.write_header(b"cache-control", "public, max-age=31536000, no-cache")
+    response.writer.write_header(b"content-type", b"image/png")
+    response.writer.write_header(b"cache-control", b"public, max-age=31536000, no-cache")
     response.writer.end_headers()
 
     response.writer.write(body)
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html
index 73a6ce3..50933da 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-1.html
@@ -9,6 +9,7 @@
     window.log = [];
 
     window.addEventListener("error", ev => log.push(ev.error));
+    window.addEventListener("onunhandledrejection", unreachable);
 
     const test_load = async_test(
         "Parse errors in different files should be reported " +
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html
index 0d67cb8..51adb09d 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-2.html
@@ -9,6 +9,7 @@
     window.log = [];
 
     window.addEventListener("error", ev => log.push(ev.error));
+    window.addEventListener("onunhandledrejection", unreachable);
 
     const test_load = async_test(
         "Instantiation errors in different files should be reported " +
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html
index 5c0adff..bc52119b 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/choice-of-error-3.html
@@ -9,6 +9,7 @@
     window.log = [];
 
     window.addEventListener("error", ev => log.push(ev.error));
+    window.addEventListener("onunhandledrejection", unreachable);
 
     const test_load = async_test(
         "Evaluation errors are cached in intermediate module scripts");
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-1.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-1.html
index 6f119e30..2480a60 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-1.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-1.html
@@ -9,6 +9,7 @@
     window.log = [];
 
     window.addEventListener("error", ev => log.push(ev.error));
+    window.addEventListener("onunhandledrejection", unreachable);
 
     const test_load = async_test(
         "network error has higher priority than parse error");
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-2.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-2.html
index a7df1df0..673bf28 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-2.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-2.html
@@ -9,6 +9,7 @@
     window.log = [];
 
     window.addEventListener("error", ev => log.push(ev.error));
+    window.addEventListener("onunhandledrejection", unreachable);
 
     const test_load = async_test(
         "parse error has higher priority than instantiation error");
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-3.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-3.html
index 9b00df3..8a16266f 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-3.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/error-type-3.html
@@ -9,6 +9,7 @@
     window.log = [];
 
     window.addEventListener("error", ev => log.push(ev.error));
+    window.addEventListener("onunhandledrejection", unreachable);
 
     const test_load = async_test(
         "instantiation error has higher priority than evaluation error");
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4-tla.html b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4-tla.html
new file mode 100644
index 0000000..da07faf4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4-tla.html
@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<title>Testing evaluation order</title>
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+    setup({allow_uncaught_exception: true});
+
+    window.log = [];
+
+    window.addEventListener("error", ev => testDone());
+    window.addEventListener("onunhandledrejection", unreachable);
+
+    const test_load = async_test("Test evaluation order of modules");
+
+    window.addEventListener("load", ev => log.push("window-load"));
+
+    function unreachable() { log.push("unexpected"); }
+    function testDone() {
+      test_load.step(() => {
+        assert_array_equals(log, [
+             "step-4.1-1", "step-4.1-2", "microtask-4.1",
+             "script-load", "window-load",
+             "step-4.2-1", "step-4.2-2", "microtask-4.2",
+            ]);
+      });
+      test_load.done();
+    }
+</script>
+
+<script type="module" src="evaluation-order-4.1.mjs"
+    onerror="unreachable()" onload="log.push('script-load')">
+ </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4.1.mjs b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4.1.mjs
new file mode 100644
index 0000000..f3347c1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4.1.mjs
@@ -0,0 +1,8 @@
+log.push("step-4.1-1");
+queueMicrotask(() => log.push("microtask-4.1"));
+log.push("step-4.1-2");
+
+await import("./evaluation-order-4.2.mjs");
+
+// Not happening as we throw in the above module.
+log.push("step-4.1-3");
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4.2.mjs b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4.2.mjs
new file mode 100644
index 0000000..96a5cca
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4.2.mjs
@@ -0,0 +1,5 @@
+log.push("step-4.2-1");
+queueMicrotask(() => log.push("microtask-4.2"));
+log.push("step-4.2-2");
+
+throw new Error("error");
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed.html b/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed.html
index f269dcbcb..e54bf5d 100644
--- a/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed.html
+++ b/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed.html
@@ -10,7 +10,9 @@
 
   const iframe = document.createElement("iframe");
 
+  iframe.onunhandledrejection = t.unreached_func("Unhandled promise rejection detected");
   iframe.onerror = t.unreached_func("Error loading iframe");
+
   let onLoadWasCalled = false;
   iframe.onload = t.step_func(() => {
     assert_equals(iframe.contentDocument.body.textContent, "Initial body contents\n");
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-import.html b/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-import.html
index f59c3c0..20645f4d 100644
--- a/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-import.html
+++ b/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-import.html
@@ -6,17 +6,20 @@
 <script>
 async_test(t => {
   const iframe = document.createElement("iframe");
-
   iframe.onerror = t.unreached_func("Error loading iframe");
-  let testEndWasCalled = false;
-  document.addEventListener("documentWriteDone", t.step_func(() => {
+
+  let onLoadWasCalled = false;
+
+  iframe.onload = t.step_func(() => {
+    onLoadWasCalled = true;
     assert_equals(iframe.contentDocument.body.textContent, "Initial body contents\n");
-    testEndWasCalled = true;
-  }));
-  iframe.onload = t.step_func_done(() => {
-    assert_true(testEndWasCalled, 'documentWriteDone event was not sent');
-    assert_equals(iframe.contentDocument.body.textContent, "Initial body contents\n");
+    // Don't call the event handler another time after document.write.
+    iframe.onload = null;
   });
+  document.addEventListener("documentWriteDone", t.step_func_done(() => {
+    assert_true(onLoadWasCalled, "onload must be called");
+    assert_equals(iframe.contentDocument.body.textContent, "document.write body contents\n");
+  }));
 
   iframe.src = "module-tla-import-iframe.html";
   document.body.appendChild(iframe);
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-promise-iframe.html b/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-promise-iframe.html
index 5c55bed6..edc9e80c 100644
--- a/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-promise-iframe.html
+++ b/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-promise-iframe.html
@@ -1,10 +1,11 @@
 <!doctype html>
 <script type=module>
 await new Promise(resolve => {
-  window.parent.document.test.step_timeout(resolve, 0));
+  window.parent.document.test.step_timeout(resolve, 0);
   document.write("document.write body contents\n");
   document.close();
   window.parent.document.dispatchEvent(new CustomEvent("documentWriteDone"));
 });
 </script>
+
 Initial body contents
diff --git a/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-promise.html b/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-promise.html
index 5fc30a8..4f1281b 100644
--- a/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-promise.html
+++ b/third_party/blink/web_tests/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-promise.html
@@ -9,18 +9,14 @@
   document.test = t;
 
   const iframe = document.createElement("iframe");
-
   iframe.onerror = t.unreached_func("Error loading iframe");
-  let onLoadWasCalled = false;
-  iframe.onload = t.step_func(() => {
-    assert_equals(iframe.contentDocument.body.textContent, "Initial body contents\n");
-    iframe.onload = null;
-    onLoadWasCalled = true;
-  });
-  document.addEventListener("documentWriteDone", t.step_func_done(() => {
-    assert_true(onLoadWasCalled);
+
+  document.addEventListener("documentWriteDone", t.step_func(() => {
     assert_equals(iframe.contentDocument.body.textContent, "Initial body contents\n");
   }));
+  iframe.onload = t.step_func_done(() => {
+    assert_equals(iframe.contentDocument.body.textContent, "Initial body contents\n");
+  });
 
   iframe.src = "module-tla-promise-iframe.html";
   document.body.appendChild(iframe);
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/intersection-observer.idl b/third_party/blink/web_tests/external/wpt/interfaces/intersection-observer.idl
index fa1de19..52db1c4b 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/intersection-observer.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/intersection-observer.idl
@@ -8,7 +8,7 @@
 [Exposed=Window]
 interface IntersectionObserver {
   constructor(IntersectionObserverCallback callback, optional IntersectionObserverInit options = {});
-  readonly attribute Node? root;
+  readonly attribute (Element or Document)? root;
   readonly attribute DOMString rootMargin;
   readonly attribute FrozenArray<double> thresholds;
   undefined observe(Element target);
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/sanitizer-api.tentative.idl b/third_party/blink/web_tests/external/wpt/interfaces/sanitizer-api.tentative.idl
index 25cba22..600ae051 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/sanitizer-api.tentative.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/sanitizer-api.tentative.idl
@@ -8,4 +8,6 @@
   [CallWith=ScriptState, RaisesException] DOMString sanitizeToString(DOMString input);
 };
 
-dictionary SanitizerConfig {};
+dictionary SanitizerConfig {
+  sequence<DOMString>? dropElements;
+};
diff --git a/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-config.tentative.html b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-config.tentative.html
index c780bbe2..5c115a4 100644
--- a/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-config.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-config.tentative.html
@@ -8,52 +8,81 @@
 
 <body>
 <script>
+    const default_option ={dropElements: null};
     test(t => {
       let s = new Sanitizer();
       assert_true(s instanceof Sanitizer);
-      assert_object_equals(s.creationOptions, {});
+      assert_object_equals(s.creationOptions, default_option);
     }, "SanitizerAPI creator without config.");
 
     test(t => {
       let s = new Sanitizer({});
       assert_true(s instanceof Sanitizer);
-      assert_object_equals(s.creationOptions, {});
+      assert_object_equals(s.creationOptions, default_option);
     }, "SanitizerAPI creator with empty config.");
 
     test(t => {
       let s = new Sanitizer(null);
       assert_true(s instanceof Sanitizer);
-      assert_object_equals(s.creationOptions, {});
+      assert_object_equals(s.creationOptions, default_option);
     }, "SanitizerAPI creator with null as config.");
 
     test(t => {
       let s = new Sanitizer(undefined);
       assert_true(s instanceof Sanitizer);
-      assert_object_equals(s.creationOptions, {});
+      assert_object_equals(s.creationOptions, default_option);
     }, "SanitizerAPI creator with undefined as config.");
 
     test(t => {
       let s = new Sanitizer({testConfig: [1,2,3], attr: ["test", "i", "am"]});
       assert_true(s instanceof Sanitizer);
-      assert_object_equals(s.creationOptions, {});
+      assert_object_equals(s.creationOptions, default_option);
     }, "SanitizerAPI creator with config ignore unknown values.");
 
     test(t => {
-      let options = {};
+      let options = {dropElements: ["div"]};
       let s = new Sanitizer(options);
       assert_true(s instanceof Sanitizer);
-      assert_object_equals(s.creationOptions, {});
+      assert_object_equals(s.creationOptions, {dropElements: ["DIV"]});
 
-      options.testConfig = [1,2,3];
-      assert_object_equals(s.creationOptions, {});
+      options.dropElements.push("test");
+      assert_object_equals(s.creationOptions, {dropElements: ["DIV"]});
 
-      s.creationOptions = {testConfig: [1,2,3]};
-      assert_object_equals(s.creationOptions, {});
+      s.creationOptions = {dropElements: ["test", "t"]};
+      assert_object_equals(s.creationOptions, {dropElements: ["DIV"]});
 
-      s.creationOptions['testConfig'] = [1,2,3];
-      assert_object_equals(s.creationOptions, {});
+      s.creationOptions['dropElements'] = [1,2,3];
+      assert_object_equals(s.creationOptions, {dropElements: ["DIV"]});
     }, "SanitizerAPI config is not editable.");
 
+    test(t => {
+      let s = new Sanitizer({dropElements: []});
+      assert_true(s instanceof Sanitizer);
+      assert_equals(s.sanitizeToString("<div>balabala<i>test</i></div>"), "<div>balabala<i>test</i></div>");
+    }, "SanitizerAPI creator with config {dropElements: []}.")
+
+    test(t => {
+      let s = new Sanitizer({dropElements: null});
+      assert_true(s instanceof Sanitizer);
+      assert_true(s.creationOptions instanceof Object);
+      assert_object_equals(s.creationOptions, default_option);
+    }, "SanitizerAPI creator with config {dropElements: null}.")
+
+    test(t => {
+      let s = new Sanitizer({dropElements: undefined});
+      assert_true(s instanceof Sanitizer);
+      assert_true(s.creationOptions instanceof Object);
+      assert_object_equals(s.creationOptions, default_option);
+    }, "SanitizerAPI creator with config {dropElements: undefined}.");
+
+    test(t => {
+      assert_throws_js(TypeError, _ => {let s = new Sanitizer({dropElements: 123})});
+    }, "SanitizerAPI creator with config {dropElements: 123}.");
+
+    test(t => {
+      assert_throws_js(TypeError, _ => {let s = new Sanitizer({dropElements: "div"})});
+    }, "SanitizerAPI creator with config {dropElements: div}.");
+
 </script>
 </body>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitize.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitize.tentative-expected.txt
index 0b905ce..c5224d4 100644
--- a/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitize.tentative-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitize.tentative-expected.txt
@@ -13,5 +13,13 @@
 PASS SanitizerAPI sanitize function for html without close tag
 FAIL SanitizerAPI sanitize function for scripts assert_equals: expected "" but got "<script>alert('i am a test')</script>"
 FAIL SanitizerAPI sanitize function for onclick scripts assert_equals: expected "<p>Click.</p>" but got "<p onclick=\"a= 123\">Click.</p>"
+PASS SanitizerAPI sanitize function for invalid config_input
+PASS SanitizerAPI sanitize function for empty dropElements list
+PASS SanitizerAPI sanitize function for test html without close tag with dropElements list ['div']
+PASS SanitizerAPI sanitize function for test script with ["script"] as dropElements list
+PASS SanitizerAPI sanitize function for dropElements list ["test", "i"]}
+PASS SanitizerAPI sanitize function for dropElements list ["I", "AM"]}
+PASS SanitizerAPI sanitize function for dropElements list ["am", "p"]}
+PASS SanitizerAPI sanitize function for dropElements list with invalid values}
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitize.tentative.html b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitize.tentative.html
index 219eff4..44961e0 100644
--- a/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitize.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitize.tentative.html
@@ -13,9 +13,12 @@
       d.appendChild(fragment);
       return d.innerHTML;
     }
-    const s = new Sanitizer({});
 
     testcases.forEach(c => test(t => {
+        let s = new Sanitizer(c.config_input);
+        assert_true(s.creationOptions instanceof Object);
+        assert_object_equals(s.creationOptions, c.config_value);
+
         fragment = s.sanitize(c.value);
         assert_true(fragment instanceof DocumentFragment);
         assert_equals(getString(fragment), c.result);
diff --git a/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt
index 04e4c68..de05576 100644
--- a/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitizeToString.tentative-expected.txt
@@ -13,5 +13,13 @@
 PASS SanitizerAPI sanitizeToString function for html without close tag
 FAIL SanitizerAPI sanitizeToString function for scripts assert_equals: expected "" but got "<script>alert('i am a test')</script>"
 FAIL SanitizerAPI sanitizeToString function for onclick scripts assert_equals: expected "<p>Click.</p>" but got "<p onclick=\"a= 123\">Click.</p>"
+PASS SanitizerAPI sanitizeToString function for invalid config_input
+PASS SanitizerAPI sanitizeToString function for empty dropElements list
+PASS SanitizerAPI sanitizeToString function for test html without close tag with dropElements list ['div']
+PASS SanitizerAPI sanitizeToString function for test script with ["script"] as dropElements list
+PASS SanitizerAPI sanitizeToString function for dropElements list ["test", "i"]}
+PASS SanitizerAPI sanitizeToString function for dropElements list ["I", "AM"]}
+PASS SanitizerAPI sanitizeToString function for dropElements list ["am", "p"]}
+PASS SanitizerAPI sanitizeToString function for dropElements list with invalid values}
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitizeToString.tentative.html b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitizeToString.tentative.html
index 98bb4a4..7efbc3ca 100644
--- a/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitizeToString.tentative.html
+++ b/third_party/blink/web_tests/external/wpt/sanitizer-api/sanitizer-sanitizeToString.tentative.html
@@ -8,9 +8,10 @@
 
 <body>
 <script>
-    const s = new Sanitizer({});
-
     testcases.forEach(c => test(t => {
+        let s = new Sanitizer(c.config_input);
+        assert_true(s.creationOptions instanceof Object);
+        assert_object_equals(s.creationOptions, c.config_value);
         assert_equals(s.sanitizeToString(c.value), c.result);
     }, "SanitizerAPI sanitizeToString function for " + c.message));
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/sanitizer-api/support/testcases.sub.js b/third_party/blink/web_tests/external/wpt/sanitizer-api/support/testcases.sub.js
index d1af1c9b..a3cc6d38 100644
--- a/third_party/blink/web_tests/external/wpt/sanitizer-api/support/testcases.sub.js
+++ b/third_party/blink/web_tests/external/wpt/sanitizer-api/support/testcases.sub.js
@@ -1,17 +1,24 @@
 const testcases = [
-  {value: "test", result: "test", message: "string"},
-  {value: "<b>bla</b>", result: "<b>bla</b>", message: "html fragment"},
-  {value: "<a<embla", result: "", message: "broken html"},
-  {value: {}, result: "[object Object]", message: "empty object"},
-  {value: 1, result: "1", message: "number"},
-  {value: 000, result: "0", message: "zeros"},
-  {value: 1+2, result: "3", message: "arithmetic"},
-  {value: "", result: "", message: "empty string"},
-  {value: undefined, result: "undefined", message: "undefined"},
-  {value: null, result: "null", message: "null"},
-  {value: "<html><head></head><body>test</body></html>", result: "test", message: "document"},
-  {value: "<div>test", result: "<div>test</div>", message: "html without close tag"},
-  {value: "<script>alert('i am a test')<\/script>", result: "", message: "scripts"},
-  {value: "<p onclick='a= 123'>Click.</p>", result: "<p>Click.</p>", message: "onclick scripts"}
-
+  {config_input: {}, config_value: {dropElements: null}, value: "test", result: "test", message: "string"},
+  {config_input: {}, config_value: {dropElements: null}, value: "<b>bla</b>", result: "<b>bla</b>", message: "html fragment"},
+  {config_input: {}, config_value: {dropElements: null}, value: "<a<embla", result: "", message: "broken html"},
+  {config_input: {}, config_value: {dropElements: null}, value: {}, result: "[object Object]", message: "empty object"},
+  {config_input: {}, config_value: {dropElements: null}, value: 1, result: "1", message: "number"},
+  {config_input: {}, config_value: {dropElements: null}, value: 000, result: "0", message: "zeros"},
+  {config_input: {}, config_value: {dropElements: null}, value: 1+2, result: "3", message: "arithmetic"},
+  {config_input: {}, config_value: {dropElements: null}, value: "", result: "", message: "empty string"},
+  {config_input: {}, config_value: {dropElements: null}, value: undefined, result: "undefined", message: "undefined"},
+  {config_input: {}, config_value: {dropElements: null}, value: null, result: "null", message: "null"},
+  {config_input: {}, config_value: {dropElements: null}, value: "<html><head></head><body>test</body></html>", result: "test", message: "document"},
+  {config_input: {}, config_value: {dropElements: null}, value: "<div>test", result: "<div>test</div>", message: "html without close tag"},
+  {config_input: {}, config_value: {dropElements: null}, value: "<script>alert('i am a test')<\/script>", result: "", message: "scripts"},
+  {config_input: {}, config_value: {dropElements: null}, value: "<p onclick='a= 123'>Click.</p>", result: "<p>Click.</p>", message: "onclick scripts"},
+  {config_input: {test: 123}, config_value: {dropElements: null}, value: "test", result: "test", message: "invalid config_input"},
+  {config_input: {dropElements: []}, config_value: {dropElements:[]}, value: "test", result: "test", message: "empty dropElements list"},
+  {config_input: {dropElements: ["div"]}, config_value: {dropElements:["DIV"]}, value: "<div>test</div><c>bla", result: "<c>bla</c>", message: "test html without close tag with dropElements list ['div']"},
+  {config_input: {dropElements: ["script"]}, config_value: {dropElements:["SCRIPT"]}, value: "<script>alert('i am a test')<\/script>", result: "", message: "test script with [\"script\"] as dropElements list"},
+  {config_input: {dropElements: ["test", "i"]}, config_value: {dropElements:["TEST","I"]}, value: "<div>balabala<i>test</i></div><test>t</test>", result: "<div>balabala</div>", message: "dropElements list [\"test\", \"i\"]}"},
+  {config_input: {dropElements: ["I", "AM"]}, config_value: {dropElements:["I", "AM"]}, value: "<div>balabala<am>test</am></div>", result: "<div>balabala</div>", message: "dropElements list [\"I\", \"AM\"]}"},
+  {config_input: {dropElements: ["am", "p"]}, config_value: {dropElements:["AM","P"]}, value: "<div>balabala<i>i</i><p>t</p><test>a</test></div>", result: "<div>balabala<i>i</i><test>a</test></div>", message: "dropElements list [\"am\", \"p\"]}"},
+  {config_input: {dropElements: [123, [], "test", "i"]}, config_value: {dropElements:["123","","TEST","I"]}, value: "<div>balabala<i>test</i></div><test>t</test>", result: "<div>balabala</div>", message: "dropElements list with invalid values}"}
 ];
diff --git a/third_party/blink/web_tests/external/wpt/screen-wake-lock/wakelock-onrelease.https.html b/third_party/blink/web_tests/external/wpt/screen-wake-lock/wakelock-onrelease.https.html
index 88c0cdb6..524580c 100644
--- a/third_party/blink/web_tests/external/wpt/screen-wake-lock/wakelock-onrelease.https.html
+++ b/third_party/blink/web_tests/external/wpt/screen-wake-lock/wakelock-onrelease.https.html
@@ -5,17 +5,19 @@
 <script src="/resources/testdriver.js"></script>
 <script src="/resources/testdriver-vendor.js"></script>
 <script>
-async_test(async t => {
+promise_test(async t => {
   await test_driver.set_permission({name: 'screen-wake-lock'}, 'granted', false);
 
   const lock = await navigator.wakeLock.request("screen");
-  lock.onrelease = t.step_func_done((ev) => {
+  return new Promise(resolve => {
+    lock.onrelease = resolve;
+    lock.release();
+  }).then(ev => {
     assert_class_string(ev, "Event", "release() must fire an Event object");
     assert_equals(ev.target, lock, "The event's target must be the lock that was acquired");
     assert_true(ev.isTrusted);
     assert_false(ev.bubbles);
     assert_false(ev.cancelable);
   });
-  await lock.release();
 }, "Test onreleased event's basic properties");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/request.py b/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/request.py
index 28f407c..dbfe067 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/request.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/request.py
@@ -169,6 +169,10 @@
     Regexp match object from matching the request path to the route
     selected for the request.
 
+    .. attribute:: client_address
+
+    Contains a tuple of the form (host, port) representing the client's address.
+
     .. attribute:: protocol_version
 
     HTTP version specified in the request.
@@ -245,6 +249,7 @@
     def __init__(self, request_handler):
         self.doc_root = request_handler.server.router.doc_root
         self.route_match = None  # Set by the router
+        self.client_address = request_handler.client_address
 
         self.protocol_version = request_handler.protocol_version
         self.method = request_handler.command
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/server.py b/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/server.py
index 56342ed2..d6718df 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/server.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptserve/wptserve/server.py
@@ -528,6 +528,7 @@
         self.h2_stream_id = req_frame.stream_id
         self.server = handler.server
         self.protocol_version = handler.protocol_version
+        self.client_address = handler.client_address
         self.raw_requestline = ''
         self.rfile = rfile
         self.request = handler.request
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt
index cfc6abc..f8df3e6 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-area-expected.txt
@@ -345,7 +345,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-direction-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-direction-expected.txt
index 6cb940e5..498c6bb 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-direction-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-direction-expected.txt
@@ -254,7 +254,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
@@ -514,7 +515,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
@@ -780,7 +782,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
@@ -1046,7 +1049,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-expected.txt
index c9e3c1f..6ab1cba0 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-expected.txt
@@ -290,7 +290,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
@@ -574,7 +575,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-huge-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-huge-expected.txt
index f462926..d3694ab 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-huge-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-huge-expected.txt
@@ -7943,7 +7943,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-line-names-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-line-names-expected.txt
index 112fff8..82a49d0 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-line-names-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-line-names-expected.txt
@@ -483,7 +483,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-writing-mode-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-writing-mode-expected.txt
index dc4fc7a..4df6966f 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-writing-mode-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-grid-writing-mode-expected.txt
@@ -203,7 +203,8 @@
     "columnGapColor": "rgba(0, 0, 255, 0)",
     "rowHatchColor": "rgba(255, 255, 255, 0)",
     "columnHatchColor": "rgba(128, 128, 128, 0)",
-    "areaBorderColor": "rgba(255, 0, 0, 0)"
+    "areaBorderColor": "rgba(255, 0, 0, 0)",
+    "gridBackgroundColor": "rgba(255, 0, 0, 0)"
   },
   "isPrimaryGrid": true
 }
@@ -410,7 +411,8 @@
     "columnGapColor": "rgba(0, 0, 255, 0)",
     "rowHatchColor": "rgba(255, 255, 255, 0)",
     "columnHatchColor": "rgba(128, 128, 128, 0)",
-    "areaBorderColor": "rgba(255, 0, 0, 0)"
+    "areaBorderColor": "rgba(255, 0, 0, 0)",
+    "gridBackgroundColor": "rgba(255, 0, 0, 0)"
   },
   "isPrimaryGrid": true
 }
@@ -618,7 +620,8 @@
     "columnGapColor": "rgba(0, 0, 255, 0)",
     "rowHatchColor": "rgba(255, 255, 255, 0)",
     "columnHatchColor": "rgba(128, 128, 128, 0)",
-    "areaBorderColor": "rgba(255, 0, 0, 0)"
+    "areaBorderColor": "rgba(255, 0, 0, 0)",
+    "gridBackgroundColor": "rgba(255, 0, 0, 0)"
   },
   "isPrimaryGrid": true
 }
@@ -826,7 +829,8 @@
     "columnGapColor": "rgba(0, 0, 255, 0)",
     "rowHatchColor": "rgba(255, 255, 255, 0)",
     "columnHatchColor": "rgba(128, 128, 128, 0)",
-    "areaBorderColor": "rgba(255, 0, 0, 0)"
+    "areaBorderColor": "rgba(255, 0, 0, 0)",
+    "gridBackgroundColor": "rgba(255, 0, 0, 0)"
   },
   "isPrimaryGrid": true
 }
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-huge-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-huge-expected.txt
index d4ef659..865671f 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-huge-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-huge-expected.txt
@@ -7849,7 +7849,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-iframe-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-iframe-expected.txt
index fedce18..195b565 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-iframe-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-css-persistent-grid-iframe-expected.txt
@@ -321,7 +321,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
diff --git a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-multiple-css-grid-expected.txt b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-multiple-css-grid-expected.txt
index aa3949e..833f9b0 100644
--- a/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-multiple-css-grid-expected.txt
+++ b/third_party/blink/web_tests/http/tests/devtools/elements/highlight/highlight-multiple-css-grid-expected.txt
@@ -195,7 +195,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     },
@@ -392,7 +393,8 @@
         "columnGapColor": "rgba(0, 0, 255, 0)",
         "rowHatchColor": "rgba(255, 255, 255, 0)",
         "columnHatchColor": "rgba(128, 128, 128, 0)",
-        "areaBorderColor": "rgba(255, 0, 0, 0)"
+        "areaBorderColor": "rgba(255, 0, 0, 0)",
+        "gridBackgroundColor": "rgba(255, 0, 0, 0)"
       },
       "isPrimaryGrid": true
     }
diff --git a/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-1-expected.txt b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-1-expected.txt
new file mode 100644
index 0000000..cf2aed88
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-1-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test evaluation order of modules assert_array_equals: expected property 2 to be "global-error" but got "microtask" (expected array ["step-1-1", "step-1-2", "global-error", "error", "microtask", "script-load", "global-load"] got ["step-1-1", "step-1-2", "microtask", "global-error", "error", "script-load", "global-load"])
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-1-worker-expected.txt b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-1-worker-expected.txt
new file mode 100644
index 0000000..7ce88a5
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-1-worker-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test evaluation order of modules assert_array_equals: expected property 2 to be "global-error" but got "microtask" (expected array ["step-1-1", "step-1-2", "global-error", "error", "microtask"] got ["step-1-1", "step-1-2", "microtask", "global-error", "error"])
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-2-import-expected.txt b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-2-import-expected.txt
new file mode 100644
index 0000000..7433b031
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-2-import-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test evaluation order of modules assert_array_equals: expected property 2 to be "global-error" but got "microtask-2.2" (expected array ["step-2.2-1", "step-2.2-2", "global-error", "error", "microtask-2.2", "script-load", "global-load"] got ["step-2.2-1", "step-2.2-2", "microtask-2.2", "global-error", "error", "script-load", "global-load"])
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-2-import-worker-expected.txt b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-2-import-worker-expected.txt
new file mode 100644
index 0000000..269cc86
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-2-import-worker-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL Test evaluation order of modules assert_array_equals: expected property 2 to be "global-error" but got "microtask-2.2" (expected array ["step-2.2-1", "step-2.2-2", "global-error", "error", "microtask-2.2"] got ["step-2.2-1", "step-2.2-2", "microtask-2.2", "global-error", "error"])
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/module-in-xhtml-expected.txt b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/module-in-xhtml-expected.txt
new file mode 100644
index 0000000..eb817cba
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/semantics/scripting-1/the-script-element/module/module-in-xhtml-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL module script in XHTML documents should be evaluated. assert_true: expected true got undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed-expected.txt b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed-expected.txt
new file mode 100644
index 0000000..ab8b9e3
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-delayed-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL document.write in an imported module assert_equals: expected "Initial body contents\n" but got "FAIL"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-immediate-promise-expected.txt b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-immediate-promise-expected.txt
new file mode 100644
index 0000000..8dc5a1ae
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/module-top-level-await/external/wpt/html/webappapis/dynamic-markup-insertion/document-write/module-tla-immediate-promise-expected.txt
@@ -0,0 +1,4 @@
+This is a testharness.js-based test.
+FAIL document.write in an imported module assert_true: expected true got false
+Harness: the test ran to completion.
+
diff --git a/third_party/hunspell/BUILD.gn b/third_party/hunspell/BUILD.gn
index beac57c..b586771 100644
--- a/third_party/hunspell/BUILD.gn
+++ b/third_party/hunspell/BUILD.gn
@@ -89,7 +89,7 @@
     ]
   }
 
-  if (is_posix && !is_mac && !is_ios && !is_clang) {
+  if (is_posix && !is_apple && !is_clang) {
     cflags += [
       # affentry.hxx has NULL as default parameter for a FLAG in two
       # places.
diff --git a/tools/clang/scripts/update.py b/tools/clang/scripts/update.py
index 7635fb0..15b08a2 100755
--- a/tools/clang/scripts/update.py
+++ b/tools/clang/scripts/update.py
@@ -38,8 +38,8 @@
 # https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md
 # Reverting problematic clang rolls is safe, though.
 # This is the output of `git describe` and is usable as a commit-ish.
-CLANG_REVISION = 'llvmorg-12-init-5035-gd0abc757'
-CLANG_SUB_REVISION = 2
+CLANG_REVISION = 'llvmorg-12-init-5627-gf086e85e'
+CLANG_SUB_REVISION = 1
 
 PACKAGE_VERSION = '%s-%s' % (CLANG_REVISION, CLANG_SUB_REVISION)
 RELEASE_VERSION = '12.0.0'
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 494e8a4..21e81b3 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -20568,6 +20568,14 @@
   </description>
 </action>
 
+<action name="Settings.DefaultBrowser">
+  <owner>gambard@chromium.org</owner>
+  <owner>thegreenfrog@chromium.org</owner>
+  <description>
+    Reported when user opens DefaultBrowser screen. iOS only.
+  </description>
+</action>
+
 <action name="Settings.GoogleServices">
   <owner>jlebel@chromium.org</owner>
   <owner>fernandex@chromium.org</owner>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 305e198..d1a6bd03 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -86208,6 +86208,36 @@
   </summary>
 </histogram>
 
+<histogram name="Memory.Browser.MemoryFootprint.NumLiveOverscroll" units="tabs"
+    expires_after="M88">
+  <owner>rkgibson@google.com</owner>
+  <owner>eugenebut@chromium.org</owner>
+  <summary>
+    Investigation into crbug.com/1102494 shows that OverscrollActionsController
+    is allocating thousands of objects in it's -initWithScrollView:. This is
+    likely because thousands of OverscrollActionsControllers are being
+    initialized. The theory is that there are users that have many many tabs,
+    causing many OverscrollActionsControllers to be allocated. This histogram
+    tests that theory by logging how many live OverscrollActionsControllers
+    there are. This is recorded every time histograms are uploaded.
+  </summary>
+</histogram>
+
+<histogram name="Memory.Browser.MemoryFootprint.NumOpenTabs" units="tabs"
+    expires_after="M88">
+  <owner>rkgibson@google.com</owner>
+  <owner>eugenebut@chromium.org</owner>
+  <summary>
+    Investigation into crbug.com/1102494 shows that OverscrollActionsController
+    is allocating thousands of objects in it's -initWithScrollView:. This is
+    likely because thousands of OverscrollActionsControllers are being
+    initialized. The theory is that there are users that have many many tabs,
+    causing many OverscrollActionsControllers to be allocated. This histogram
+    tests that theory by logging how many open tabs there are. This is recorded
+    every time histograms are uploaded.
+  </summary>
+</histogram>
+
 <histogram name="Memory.Browser.MemoryFootprint.OnBackground" units="MiB"
     expires_after="2021-08-27">
   <owner>eugenebut@chromium.org</owner>
@@ -129646,6 +129676,9 @@
 
 <histogram name="PasswordManager.NumFormsExtractedIOS" units="forms"
     expires_after="2020-09-27">
+  <obsolete>
+    Removed as of 09/2020.
+  </obsolete>
   <owner>jdoerrie@chromium.org</owner>
   <owner>kazinova@google.com</owner>
   <summary>
@@ -184472,7 +184505,7 @@
 </histogram>
 
 <histogram name="TileManager.ExceededMemoryBudget" enum="TileMemoryBudget"
-    expires_after="M87">
+    expires_after="M90">
   <owner>pdr@chromium.org</owner>
   <owner>vmpstr@chromium.org</owner>
   <summary>
diff --git a/ui/accessibility/extensions/strings/accessibility_extensions_strings_sq.xtb b/ui/accessibility/extensions/strings/accessibility_extensions_strings_sq.xtb
index 454d53e..78ae8d7 100644
--- a/ui/accessibility/extensions/strings/accessibility_extensions_strings_sq.xtb
+++ b/ui/accessibility/extensions/strings/accessibility_extensions_strings_sq.xtb
@@ -13,12 +13,12 @@
 <translation id="2079545284768500474">Zhbëj</translation>
 <translation id="2179565792157161713">Hap përshkrimin e gjatë në skedën e re</translation>
 <translation id="2223143012868735942">Në filtër i personalizueshëm ngjyrash i aplikuar në faqet e uebit për të përmirësuar perceptimin e ngjyrave.</translation>
-<translation id="2394933097471027016">Provoje tani - Shfletimi "Caret" është gjithmonë i aktivizuar në këtë faqe!</translation>
+<translation id="2394933097471027016">Provoje tani - Shfletimi me kursorin e tekstit është gjithmonë i aktivizuar në këtë faqe!</translation>
 <translation id="2471847333270902538">Skema e ngjyrave për <ph name="SITE" />:</translation>
 <translation id="2648340354586434750">Mbaj të shtypur &lt;span class='key'&gt;Opsioni&lt;/span&gt; për të lëvizur sipas fjalëve.</translation>
 <translation id="2795227192542594043">Kjo shtesë të jep një kursor të lëvizshëm në faqen e uebit, duke të lejuar ta zgjedhësh tekstin me tastierë.</translation>
 <translation id="2808027189040546825">Hapi 1: Zgjidh radhën me yjet më të zbehtë:</translation>
-<translation id="2965611304828530558">&lt;p&gt;Kur arrin te një lidhje ose një kontroll, ai fokusohet automatikisht. Shtyp &lt;span class='key'&gt;Enter&lt;/span&gt; për të klikuar te një lidhje ose një buton. &lt;/p&gt; &lt;p&gt;   Kur një kontroll i fokusuar (si p.sh. një kuti teksti ose një kuti liste) kap tastet e shigjetave, shtyp tastin &lt;span class='key'&gt;Esc&lt;/span&gt; të pasuar nga shigjeta e majtë ose e djathtë për të vazhduar me shfletimin me tastierë. &lt;/p&gt; &lt;p&gt;   Si alternativë, shtyp tastin &lt;span class='key'&gt;Tab&lt;/span&gt; për të lëvizur te kontrolli tjetër që mund të fokusohet. &lt;/p&gt;</translation>
+<translation id="2965611304828530558">&lt;p&gt;Kur arrin te një lidhje ose një kontroll, ai fokusohet automatikisht. Shtyp &lt;span class='key'&gt;Enter&lt;/span&gt; për të klikuar te një lidhje ose një buton. &lt;/p&gt; &lt;p&gt;   Kur një kontroll i fokusuar (si p.sh. një kuti teksti ose një kuti liste) kap tastet e shigjetave, shtyp tastin &lt;span class='key'&gt;Esc&lt;/span&gt; të pasuar nga shigjeta e majtë ose e djathtë për të vazhduar me "Shfletimin me kursorin e tekstit". &lt;/p&gt; &lt;p&gt;   Si alternativë, shtyp tastin &lt;span class='key'&gt;Tab&lt;/span&gt; për të lëvizur te kontrolli tjetër që mund të fokusohet. &lt;/p&gt;</translation>
 <translation id="3252573918265662711">Konfigurimi</translation>
 <translation id="3410969471888629217">Harro personalizimet e sajtit</translation>
 <translation id="3435896845095436175">Aktivizo</translation>
@@ -31,7 +31,7 @@
 <translation id="4769065380738716500">Imazhet janë zëvendësuar me tekstet e tyre alternative.</translation>
 <translation id="4896660567607030658">Nuk ka komente, thjesht trego kursorin.</translation>
 <translation id="4937901943818762779">Lejo imazhet e animuara, por vetëm një herë.</translation>
-<translation id="4949131196216960195">Shtyp &lt;span class='key'&gt;Kërko&lt;/span&gt; + &lt;img src='increase_brightness.png'&gt; (tasti i rritjes së ndriçimit ose F7) për të aktivizuar shfletimin "Caret". Shtype përsëri për ta çaktivizuar.</translation>
+<translation id="4949131196216960195">Shtyp &lt;span class='key'&gt;Kërko&lt;/span&gt; + &lt;img src='increase_brightness.png'&gt; (tasti i rritjes së ndriçimit ose F7) për të aktivizuar "Shfletimin me kursorin e tekstit". Shtype përsëri për ta çaktivizuar.</translation>
 <translation id="4954450790315188152">Kur shfletimi me kursorin e tekstit është i aktivizuar:</translation>
 <translation id="5041932793799765940">Rregullimi i ngjyrave</translation>
 <translation id="5094574508723441140">Kontrasti i rritur</translation>
@@ -52,7 +52,7 @@
 <translation id="633394792577263429">Mbaj shtypur poshtë &lt;span class='key'&gt;Kontrollo&lt;/span&gt; për të lëvizur sipas fjalëve.</translation>
 <translation id="6550675742724504774">Opsionet</translation>
 <translation id="6838518108677880446">Konfigurimi:</translation>
-<translation id="690628312087070417">Kur shenja e vendosjes kërcen me një distancë të madhe:</translation>
+<translation id="690628312087070417">Kur kursori i tekstit kërcen me një distancë të madhe:</translation>
 <translation id="6965382102122355670">Në rregull</translation>
 <translation id="7379645913608427028">Shkalla</translation>
 <translation id="7384431257964758081">Kontrasti i lartë është i aktivizuar</translation>
diff --git a/ui/android/delegated_frame_host_android.h b/ui/android/delegated_frame_host_android.h
index 886c819..fcea61c1 100644
--- a/ui/android/delegated_frame_host_android.h
+++ b/ui/android/delegated_frame_host_android.h
@@ -49,6 +49,11 @@
 
   ~DelegatedFrameHostAndroid() override;
 
+  static int64_t TimeDeltaToFrames(base::TimeDelta delta) {
+    return base::ClampRound<int64_t>(delta /
+                                     viz::BeginFrameArgs::DefaultInterval());
+  }
+
   // Wait up to 5 seconds for the first frame to be produced. Having Android
   // display a placeholder for a longer period of time is preferable to drawing
   // nothing, and the first frame can take a while on low-end systems.
@@ -56,8 +61,7 @@
     return base::TimeDelta::FromSeconds(5);
   }
   static int64_t FirstFrameTimeoutFrames() {
-    return base::ClampRound<int64_t>(FirstFrameTimeout() /
-                                     viz::BeginFrameArgs::DefaultInterval());
+    return TimeDeltaToFrames(FirstFrameTimeout());
   }
 
   // Wait up to 1 second for a frame of the correct size to be produced. Android
@@ -67,8 +71,7 @@
     return base::TimeDelta::FromSeconds(1);
   }
   static int64_t ResizeTimeoutFrames() {
-    return base::ClampRound<int64_t>(ResizeTimeout() /
-                                     viz::BeginFrameArgs::DefaultInterval());
+    return TimeDeltaToFrames(ResizeTimeout());
   }
 
   // Advances the fallback surface to the first surface after navigation. This
diff --git a/ui/android/view_android.cc b/ui/android/view_android.cc
index 07629909..bb6d185 100644
--- a/ui/android/view_android.cc
+++ b/ui/android/view_android.cc
@@ -511,15 +511,17 @@
   }
 }
 
-void ViewAndroid::OnPhysicalBackingSizeChanged(const gfx::Size& size) {
+void ViewAndroid::OnPhysicalBackingSizeChanged(
+    const gfx::Size& size,
+    base::Optional<base::TimeDelta> deadline_override) {
   if (physical_size_ == size)
     return;
   physical_size_ = size;
   if (event_handler_)
-    event_handler_->OnPhysicalBackingSizeChanged();
+    event_handler_->OnPhysicalBackingSizeChanged(deadline_override);
 
   for (auto* child : children_)
-    child->OnPhysicalBackingSizeChanged(size);
+    child->OnPhysicalBackingSizeChanged(size, deadline_override);
 }
 
 void ViewAndroid::OnControlsResizeViewChanged(bool controls_resize_view) {
diff --git a/ui/android/view_android.h b/ui/android/view_android.h
index 5a3208a8..680f463 100644
--- a/ui/android/view_android.h
+++ b/ui/android/view_android.h
@@ -14,6 +14,8 @@
 #include "base/callback.h"
 #include "base/memory/ref_counted.h"
 #include "base/observer_list.h"
+#include "base/optional.h"
+#include "base/time/time.h"
 #include "ui/android/ui_android_export.h"
 #include "ui/android/view_android_observer.h"
 #include "ui/gfx/geometry/rect_f.h"
@@ -152,7 +154,11 @@
   gfx::Rect bounds() const { return bounds_; }
 
   void OnSizeChanged(int width, int height);
-  void OnPhysicalBackingSizeChanged(const gfx::Size& size);
+  // |deadline_override| if not nullopt will be used as the cc::DeadlinePolicy
+  // timeout for this resize.
+  void OnPhysicalBackingSizeChanged(
+      const gfx::Size& size,
+      base::Optional<base::TimeDelta> deadline_override = base::nullopt);
   void OnCursorChanged(const Cursor& cursor);
   void OnBackgroundColorChanged(unsigned int color);
   void OnTopControlsChanged(float top_controls_offset,
diff --git a/ui/aura/native_window_occlusion_tracker_win.cc b/ui/aura/native_window_occlusion_tracker_win.cc
index 6310b83e..6dcc8e61 100644
--- a/ui/aura/native_window_occlusion_tracker_win.cc
+++ b/ui/aura/native_window_occlusion_tracker_win.cc
@@ -4,6 +4,7 @@
 
 #include "ui/aura/native_window_occlusion_tracker_win.h"
 
+#include <dwmapi.h>
 #include <memory>
 
 #include "base/bind.h"
@@ -19,8 +20,6 @@
 #include "base/win/windows_version.h"
 #include "ui/aura/window_tree_host.h"
 
-#include "dwmapi.h"
-
 namespace aura {
 
 namespace {
@@ -669,18 +668,18 @@
         HWND hwnd,
         gfx::Rect* window_rect) {
   return IsWindowVisibleAndFullyOpaque(hwnd, window_rect) &&
-         (IsWindowOnCurrentVirtualDesktop(hwnd) != false);
+         (IsWindowOnCurrentVirtualDesktop(hwnd) == true);
 }
 
 base::Optional<bool> NativeWindowOcclusionTrackerWin::
     WindowOcclusionCalculator::IsWindowOnCurrentVirtualDesktop(HWND hwnd) {
-  if (virtual_desktop_manager_) {
-    BOOL on_current_desktop;
+  if (!virtual_desktop_manager_)
+    return true;
 
-    if (SUCCEEDED(virtual_desktop_manager_->IsWindowOnCurrentVirtualDesktop(
-            hwnd, &on_current_desktop))) {
-      return on_current_desktop;
-    }
+  BOOL on_current_desktop;
+  if (SUCCEEDED(virtual_desktop_manager_->IsWindowOnCurrentVirtualDesktop(
+          hwnd, &on_current_desktop))) {
+    return on_current_desktop;
   }
   return base::nullopt;
 }
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
index a37eb4d..6a76925 100644
--- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
+++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -657,7 +657,7 @@
 <translation id="8137331602592933310">تمت مشاركة "<ph name="FILENAME" />" معك. لا يمكنك حذفه، نظرًا لأنك لا تمتلكه.</translation>
 <translation id="8145409227593688472">‏أسلوب الإدخال لنظام Wubi</translation>
 <translation id="8148264977957212129">‏أسلوب الإدخال لنظام Pinyin</translation>
-<translation id="8151638057146502721">تهيئة</translation>
+<translation id="8151638057146502721">إعداد</translation>
 <translation id="8153607920959057464">يتعذر عرض هذا الملف.</translation>
 <translation id="8154842056504218462">تم اختيار جميع الإدخالات.</translation>
 <translation id="8157684860301034423">تعذّر جلب معلومات التطبيق.</translation>
diff --git a/ui/events/android/event_handler_android.cc b/ui/events/android/event_handler_android.cc
index dd949c7..7124711 100644
--- a/ui/events/android/event_handler_android.cc
+++ b/ui/events/android/event_handler_android.cc
@@ -49,7 +49,8 @@
 
 void EventHandlerAndroid::OnSizeChanged() {}
 
-void EventHandlerAndroid::OnPhysicalBackingSizeChanged() {}
+void EventHandlerAndroid::OnPhysicalBackingSizeChanged(
+    base::Optional<base::TimeDelta> deadline_override) {}
 
 void EventHandlerAndroid::OnBrowserControlsHeightChanged() {}
 
diff --git a/ui/events/android/event_handler_android.h b/ui/events/android/event_handler_android.h
index 2865f98..d2eaa35e 100644
--- a/ui/events/android/event_handler_android.h
+++ b/ui/events/android/event_handler_android.h
@@ -5,6 +5,8 @@
 #ifndef UI_EVENTS_ANDROID_EVENT_HANDLER_ANDROID_H_
 #define UI_EVENTS_ANDROID_EVENT_HANDLER_ANDROID_H_
 
+#include "base/optional.h"
+#include "base/time/time.h"
 #include "ui/events/events_export.h"
 
 namespace ui {
@@ -28,7 +30,8 @@
   virtual bool OnMouseWheelEvent(const MotionEventAndroid& event);
   virtual bool OnGestureEvent(const GestureEventAndroid& event);
   virtual void OnSizeChanged();
-  virtual void OnPhysicalBackingSizeChanged();
+  virtual void OnPhysicalBackingSizeChanged(
+      base::Optional<base::TimeDelta> deadline_override);
   virtual void OnBrowserControlsHeightChanged();
   virtual void OnControlsResizeViewChanged();
 
diff --git a/ui/gfx/BUILD.gn b/ui/gfx/BUILD.gn
index e688b1c5..c537d245 100644
--- a/ui/gfx/BUILD.gn
+++ b/ui/gfx/BUILD.gn
@@ -304,7 +304,7 @@
     "//third_party/zlib",
   ]
 
-  if (!is_mac && !is_ios) {
+  if (!is_apple) {
     sources += [
       "platform_font_skia.cc",
       "platform_font_skia.h",
@@ -796,7 +796,7 @@
     deps += [ "//ui/resources:ui_test_pak_bundle_data" ]
   }
 
-  if (!is_mac && !is_ios) {
+  if (!is_apple) {
     sources += [
       "interpolated_transform_unittest.cc",
       "transform_unittest.cc",
diff --git a/ui/ozone/platform/wayland/host/wayland_screen.cc b/ui/ozone/platform/wayland/host/wayland_screen.cc
index df8c224..fcebc07 100644
--- a/ui/ozone/platform/wayland/host/wayland_screen.cc
+++ b/ui/ozone/platform/wayland/host/wayland_screen.cc
@@ -8,6 +8,8 @@
 #include <vector>
 
 #include "base/stl_util.h"
+#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
 #include "ui/display/display.h"
 #include "ui/display/display_finder.h"
 #include "ui/display/display_list.h"
@@ -37,14 +39,19 @@
       connection_->buffer_manager_host()->GetSupportedBufferFormats();
   for (const auto& buffer_format : buffer_formats) {
     auto format = buffer_format.first;
-    // RGBA_8888 is the preferred format.
+
+    // TODO(crbug.com/1127822): Investigate a better fix for this.
+#if !BUILDFLAG(IS_LACROS)
+    // RGBA_8888 is the preferred format, except when running on ChromiumOS. See
+    // crbug.com/1127558.
     if (format == gfx::BufferFormat::RGBA_8888)
       image_format_alpha_ = gfx::BufferFormat::RGBA_8888;
-    if (!image_format_alpha_ && format == gfx::BufferFormat::BGRA_8888)
-      image_format_alpha_ = gfx::BufferFormat::BGRA_8888;
-
     if (format == gfx::BufferFormat::RGBX_8888)
       image_format_no_alpha_ = format;
+#endif  // !BUILDFLAG(IS_LACROS)
+
+    if (!image_format_alpha_ && format == gfx::BufferFormat::BGRA_8888)
+      image_format_alpha_ = gfx::BufferFormat::BGRA_8888;
 
     if (image_format_alpha_ && image_format_no_alpha_)
       break;
diff --git a/weblayer/browser/content_view_render_view.cc b/weblayer/browser/content_view_render_view.cc
index 98cd8bc..67b039c1 100644
--- a/weblayer/browser/content_view_render_view.cc
+++ b/weblayer/browser/content_view_render_view.cc
@@ -83,13 +83,26 @@
     JNIEnv* env,
     const JavaParamRef<jobject>& jweb_contents,
     jint width,
-    jint height) {
+    jint height,
+    jboolean for_config_change) {
   bool height_changed = height_ != height;
   height_ = height;
   content::WebContents* web_contents =
       content::WebContents::FromJavaWebContents(jweb_contents);
   gfx::Size size(width, height);
-  web_contents->GetNativeView()->OnPhysicalBackingSizeChanged(size);
+
+  // The default resize timeout on Android is 1s. It was chosen with browser
+  // use case in mind where resize is rare (eg orientation change, fullscreen)
+  // and users are generally willing to wait for those cases instead of seeing
+  // a frame at the wrong size. Weblayer currently can be resized while user
+  // is interacting with the page, in which case the timeout is too long.
+  // For now, use the default long timeout only for rotation (ie config change)
+  // and just use a zero timeout for all other cases.
+  base::Optional<base::TimeDelta> override_deadline;
+  if (!for_config_change)
+    override_deadline = base::TimeDelta();
+  web_contents->GetNativeView()->OnPhysicalBackingSizeChanged(
+      size, override_deadline);
 
   if (height_changed && !height_changed_listener_.is_null())
     height_changed_listener_.Run();
diff --git a/weblayer/browser/content_view_render_view.h b/weblayer/browser/content_view_render_view.h
index 3a28dac..ddf177c 100644
--- a/weblayer/browser/content_view_render_view.h
+++ b/weblayer/browser/content_view_render_view.h
@@ -49,7 +49,8 @@
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& jweb_contents,
       jint width,
-      jint height);
+      jint height,
+      jboolean for_config_change);
   void SurfaceCreated(JNIEnv* env);
   void SurfaceDestroyed(JNIEnv* env, jboolean cache_back_buffer);
   void SurfaceChanged(JNIEnv* env,
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java
index 1fc0c5bf..924388c49 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java
@@ -140,7 +140,8 @@
         assert mEmbedderActivityContext == null;
         mWindowAndroid = windowAndroid;
         mEmbedderActivityContext = embedderAppContext;
-        mViewController = new BrowserViewController(windowAndroid, this, mViewControllerState);
+        mViewController = new BrowserViewController(
+                windowAndroid, this, mViewControllerState, mFragmentStoppedForConfigurationChange);
         mLocaleReceiver = new LocaleChangedBroadcastReceiver(windowAndroid.getContext().get());
         mPasswordEchoEnabled = null;
     }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java
index 2f873c28..44dae73 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java
@@ -87,11 +87,12 @@
     private boolean mCachedDoBrowserControlsShrinkRendererSize;
 
     public BrowserViewController(FragmentWindowAndroid windowAndroid,
-            View.OnAttachStateChangeListener listener, @Nullable State savedState) {
+            View.OnAttachStateChangeListener listener, @Nullable State savedState,
+            boolean recreateForConfigurationChange) {
         mWindowAndroid = windowAndroid;
         mOnAttachedStateChangeListener = listener;
         Context context = mWindowAndroid.getContext().get();
-        mContentViewRenderView = new ContentViewRenderView(context);
+        mContentViewRenderView = new ContentViewRenderView(context, recreateForConfigurationChange);
         mContentViewRenderView.addOnAttachStateChangeListener(listener);
 
         mContentViewRenderView.onNativeLibraryLoaded(
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java b/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java
index fc8a52a..ad3702b 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java
@@ -9,6 +9,7 @@
 import android.graphics.PixelFormat;
 import android.graphics.Rect;
 import android.graphics.SurfaceTexture;
+import android.os.SystemClock;
 import android.util.Size;
 import android.view.Surface;
 import android.view.SurfaceHolder;
@@ -31,6 +32,7 @@
 import org.chromium.content_public.browser.UiThreadTaskTraits;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.WindowAndroid;
+import org.chromium.ui.display.DisplayAndroid;
 import org.chromium.ui.resources.ResourceManager;
 
 import java.lang.annotation.Retention;
@@ -52,6 +54,8 @@
     public static final int MODE_SURFACE_VIEW = 0;
     public static final int MODE_TEXTURE_VIEW = 1;
 
+    private static final int CONFIG_TIMEOUT_MS = 1000;
+
     // A child view of this class. Parent of SurfaceView/TextureView.
     // Needed to support not resizing the surface when soft keyboard is showing.
     private final SurfaceParent mSurfaceParent;
@@ -85,6 +89,13 @@
 
     private boolean mCompositorHasSurface;
 
+    private DisplayAndroid.DisplayAndroidObserver mDisplayAndroidObserver;
+
+    // The time stamp when a configuration was detected (if any).
+    // This is used along with a timeout to determine if a resize surface resize
+    // is due to screen rotation.
+    private long mConfigurationChangedTimestamp;
+
     // Common interface to listen to surface related events.
     private interface SurfaceEventListener {
         void surfaceCreated();
@@ -153,10 +164,7 @@
             ContentViewRenderViewJni.get().surfaceChanged(mNativeContentViewRenderView,
                     canBeUsedWithSurfaceControl, format, width, height, surface);
             mCompositorHasSurface = surface != null;
-            if (mWebContents != null) {
-                ContentViewRenderViewJni.get().onPhysicalBackingSizeChanged(
-                        mNativeContentViewRenderView, mWebContents, width, height);
-            }
+            maybeUpdatePhysicalBackingSize(width, height);
         }
 
         @Override
@@ -616,8 +624,11 @@
      * hierarchy before the first draw to avoid a black flash that is seen every time a
      * {@link SurfaceView} is added.
      * @param context The context used to create this.
+     * @param recreateForConfigurationChange indicates that views are recreated after BrowserImpl
+     *                                       is retained, but Activity is recreated, for a
+     *                                       configuration change.
      */
-    public ContentViewRenderView(Context context) {
+    public ContentViewRenderView(Context context, boolean recreateForConfigurationChange) {
         super(context);
         mSurfaceParent = new SurfaceParent(context);
         addView(mSurfaceParent,
@@ -637,6 +648,7 @@
             @Override
             public void onSafeAreaChanged(Rect area) {}
         });
+        if (recreateForConfigurationChange) updateConfigChangeTimeStamp();
     }
 
     /**
@@ -651,6 +663,13 @@
         assert mNativeContentViewRenderView != 0;
         mWindowAndroid = rootWindow;
         requestMode(mode, (Boolean result) -> {});
+        mDisplayAndroidObserver = new DisplayAndroid.DisplayAndroidObserver() {
+            @Override
+            public void onRotationChanged(int rotation) {
+                updateConfigChangeTimeStamp();
+            }
+        };
+        mWindowAndroid.getDisplay().addObserver(mDisplayAndroidObserver);
     }
 
     public void requestMode(@Mode int mode, ValueCallback<Boolean> callback) {
@@ -761,6 +780,10 @@
         mRequested = null;
         mCurrent = null;
 
+        if (mDisplayAndroidObserver != null) {
+            mWindowAndroid.getDisplay().removeObserver(mDisplayAndroidObserver);
+            mDisplayAndroidObserver = null;
+        }
         mWindowAndroid = null;
 
         while (!mPendingRunnables.isEmpty()) {
@@ -777,12 +800,9 @@
         assert mNativeContentViewRenderView != 0;
         mWebContents = webContents;
 
-        if (webContents != null) {
-            if (getWidth() != 0 && getHeight() != 0) {
-                updateWebContentsSize();
-            }
-            ContentViewRenderViewJni.get().onPhysicalBackingSizeChanged(
-                    mNativeContentViewRenderView, webContents, mPhysicalWidth, mPhysicalHeight);
+        if (webContents != null && getWidth() != 0 && getHeight() != 0) {
+            updateWebContentsSize();
+            maybeUpdatePhysicalBackingSize(mPhysicalWidth, mPhysicalHeight);
         }
         ContentViewRenderViewJni.get().setCurrentWebContents(
                 mNativeContentViewRenderView, webContents);
@@ -831,13 +851,25 @@
         return inputMethodManager.isActive();
     }
 
+    private void updateConfigChangeTimeStamp() {
+        mConfigurationChangedTimestamp = SystemClock.uptimeMillis();
+    }
+
+    private void maybeUpdatePhysicalBackingSize(int width, int height) {
+        if (mWebContents == null) return;
+        boolean forConfigChange =
+                SystemClock.uptimeMillis() - mConfigurationChangedTimestamp < CONFIG_TIMEOUT_MS;
+        ContentViewRenderViewJni.get().onPhysicalBackingSizeChanged(
+                mNativeContentViewRenderView, mWebContents, width, height, forConfigChange);
+    }
+
     @NativeMethods
     interface Natives {
         long init(ContentViewRenderView caller, WindowAndroid rootWindow);
         void destroy(long nativeContentViewRenderView);
         void setCurrentWebContents(long nativeContentViewRenderView, WebContents webContents);
-        void onPhysicalBackingSizeChanged(
-                long nativeContentViewRenderView, WebContents webContents, int width, int height);
+        void onPhysicalBackingSizeChanged(long nativeContentViewRenderView, WebContents webContents,
+                int width, int height, boolean forConfigChange);
         void surfaceCreated(long nativeContentViewRenderView);
         void surfaceDestroyed(long nativeContentViewRenderView, boolean cacheBackBuffer);
         void surfaceChanged(long nativeContentViewRenderView, boolean canBeUsedWithSurfaceControl,