diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 9fb6467d..51997f9 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -494,6 +494,7 @@
     "java/src/org/chromium/android_webview/WebMessageListenerHolder.java",
     "java/src/org/chromium/android_webview/WebMessageListenerInfo.java",
     "java/src/org/chromium/android_webview/WebViewChromiumRunQueue.java",
+    "java/src/org/chromium/android_webview/WebviewErrorCode.java",
     "java/src/org/chromium/android_webview/gfx/AwDrawFnImpl.java",
     "java/src/org/chromium/android_webview/gfx/AwFunctor.java",
     "java/src/org/chromium/android_webview/gfx/AwGLFunctor.java",
diff --git a/android_webview/browser/aw_autofill_client.cc b/android_webview/browser/aw_autofill_client.cc
index 7887e18..307ef02 100644
--- a/android_webview/browser/aw_autofill_client.cc
+++ b/android_webview/browser/aw_autofill_client.cc
@@ -109,6 +109,10 @@
   return security_state::SecurityLevel::SECURITY_LEVEL_COUNT;
 }
 
+const translate::LanguageState* AwAutofillClient::GetLanguageState() {
+  return nullptr;
+}
+
 void AwAutofillClient::ShowAutofillSettings(bool show_credit_card_settings) {
   NOTIMPLEMENTED();
 }
diff --git a/android_webview/browser/aw_autofill_client.h b/android_webview/browser/aw_autofill_client.h
index 31f9720..28e1655 100644
--- a/android_webview/browser/aw_autofill_client.h
+++ b/android_webview/browser/aw_autofill_client.h
@@ -74,6 +74,7 @@
   autofill::AddressNormalizer* GetAddressNormalizer() override;
   const GURL& GetLastCommittedURL() override;
   security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
+  const translate::LanguageState* GetLanguageState() override;
   void ShowAutofillSettings(bool show_credit_card_settings) override;
   void ShowUnmaskPrompt(
       const autofill::CreditCard& card,
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java b/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java
index a995da83..10f64098 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContentsClient.java
@@ -151,7 +151,7 @@
      * Parameters for {@link AwContentsClient#onReceivedError} method.
      */
     public static class AwWebResourceError {
-        public int errorCode = ErrorCodeConversionHelper.ERROR_UNKNOWN;
+        public @WebviewErrorCode int errorCode = WebviewErrorCode.ERROR_UNKNOWN;
         public String description;
     }
 
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java b/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java
index 741f8269..7769581 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java
@@ -304,14 +304,14 @@
         AwContentsClient.AwWebResourceRequest request = new AwContentsClient.AwWebResourceRequest(
                 url, isMainFrame, hasUserGesture, method, requestHeaderNames, requestHeaderValues);
         AwContentsClient.AwWebResourceError error = new AwContentsClient.AwWebResourceError();
-        error.errorCode = errorCode;
+        error.errorCode = ErrorCodeConversionHelper.convertErrorCode(errorCode);
         error.description = description;
 
         String unreachableWebDataUrl = AwContentsStatics.getUnreachableWebDataUrl();
         boolean isErrorUrl =
                 unreachableWebDataUrl != null && unreachableWebDataUrl.equals(request.url);
 
-        if ((!isErrorUrl && error.errorCode != NetError.ERR_ABORTED) || safebrowsingHit) {
+        if ((!isErrorUrl && errorCode != NetError.ERR_ABORTED) || safebrowsingHit) {
             // NetError.ERR_ABORTED error code is generated for the following reasons:
             // - WebView.stopLoading is called;
             // - the navigation is intercepted by the embedder via shouldOverrideUrlLoading;
@@ -326,10 +326,8 @@
                     // dismissed.
                     return;
                 } else {
-                    error.errorCode = ErrorCodeConversionHelper.ERROR_UNSAFE_RESOURCE;
+                    error.errorCode = WebviewErrorCode.ERROR_UNSAFE_RESOURCE;
                 }
-            } else {
-                error.errorCode = ErrorCodeConversionHelper.convertErrorCode(error.errorCode);
             }
             if (request.isMainFrame
                     && AwFeatureList.pageStartedOnCommitEnabled(isRendererInitiated)) {
diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java
index 7bc0afb0..a5f1c0e 100644
--- a/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java
+++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java
@@ -99,7 +99,7 @@
     @Override
     public void didFinishNavigation(NavigationHandle navigation) {
         String url = navigation.getUrl();
-        if (navigation.errorCode() != 0 && !navigation.isDownload()) {
+        if (navigation.errorCode() != NetError.OK && !navigation.isDownload()) {
             didFailLoad(navigation.isInMainFrame(), navigation.errorCode(), url);
         }
 
diff --git a/android_webview/java/src/org/chromium/android_webview/ErrorCodeConversionHelper.java b/android_webview/java/src/org/chromium/android_webview/ErrorCodeConversionHelper.java
index 677b445..4f9ce8af 100644
--- a/android_webview/java/src/org/chromium/android_webview/ErrorCodeConversionHelper.java
+++ b/android_webview/java/src/org/chromium/android_webview/ErrorCodeConversionHelper.java
@@ -4,90 +4,52 @@
 
 package org.chromium.android_webview;
 
-import android.webkit.WebViewClient;
-
 import org.chromium.net.NetError;
 
 /**
  * This is a helper class to map native error code about loading a page to Android specific ones.
  */
 public final class ErrorCodeConversionHelper {
-    // Success
-    public static final int ERROR_OK = 0;
-    // Generic error
-    public static final int ERROR_UNKNOWN = WebViewClient.ERROR_UNKNOWN;
-    // Server or proxy hostname lookup failed
-    public static final int ERROR_HOST_LOOKUP = WebViewClient.ERROR_HOST_LOOKUP;
-    // Unsupported authentication scheme (not basic or digest)
-    public static final int ERROR_UNSUPPORTED_AUTH_SCHEME =
-            WebViewClient.ERROR_UNSUPPORTED_AUTH_SCHEME;
-    // User authentication failed on server
-    public static final int ERROR_AUTHENTICATION = WebViewClient.ERROR_AUTHENTICATION;
-    // User authentication failed on proxy
-    public static final int ERROR_PROXY_AUTHENTICATION = WebViewClient.ERROR_PROXY_AUTHENTICATION;
-    // Failed to connect to the server
-    public static final int ERROR_CONNECT = WebViewClient.ERROR_CONNECT;
-    // Failed to read or write to the server
-    public static final int ERROR_IO = WebViewClient.ERROR_IO;
-    // Connection timed out
-    public static final int ERROR_TIMEOUT = WebViewClient.ERROR_TIMEOUT;
-    // Too many redirects
-    public static final int ERROR_REDIRECT_LOOP = WebViewClient.ERROR_REDIRECT_LOOP;
-    // Unsupported URI scheme
-    public static final int ERROR_UNSUPPORTED_SCHEME = WebViewClient.ERROR_UNSUPPORTED_SCHEME;
-    // Failed to perform SSL handshake
-    public static final int ERROR_FAILED_SSL_HANDSHAKE = WebViewClient.ERROR_FAILED_SSL_HANDSHAKE;
-    // Malformed URL
-    public static final int ERROR_BAD_URL = WebViewClient.ERROR_BAD_URL;
-    // Generic file error
-    public static final int ERROR_FILE = WebViewClient.ERROR_FILE;
-    // File not found
-    public static final int ERROR_FILE_NOT_FOUND = WebViewClient.ERROR_FILE_NOT_FOUND;
-    // Too many requests during this load
-    public static final int ERROR_TOO_MANY_REQUESTS = WebViewClient.ERROR_TOO_MANY_REQUESTS;
-    // Request was identified as a bad url by safebrowsing.
-    public static final int ERROR_UNSAFE_RESOURCE = WebViewClient.ERROR_UNSAFE_RESOURCE;
-
-    static int convertErrorCode(@NetError int netError) {
+    static @WebviewErrorCode int convertErrorCode(@NetError int netError) {
         // Note: many NetError.Error constants don't have an obvious mapping.
         // These will be handled by the default case, ERROR_UNKNOWN.
         switch (netError) {
             case NetError.ERR_UNSUPPORTED_AUTH_SCHEME:
-                return ERROR_UNSUPPORTED_AUTH_SCHEME;
+                return WebviewErrorCode.ERROR_UNSUPPORTED_AUTH_SCHEME;
 
             case NetError.ERR_INVALID_AUTH_CREDENTIALS:
             case NetError.ERR_MISSING_AUTH_CREDENTIALS:
             case NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT:
-                return ERROR_AUTHENTICATION;
+                return WebviewErrorCode.ERROR_AUTHENTICATION;
 
             case NetError.ERR_TOO_MANY_REDIRECTS:
-                return ERROR_REDIRECT_LOOP;
+                return WebviewErrorCode.ERROR_REDIRECT_LOOP;
 
             case NetError.ERR_UPLOAD_FILE_CHANGED:
-                return ERROR_FILE_NOT_FOUND;
+                return WebviewErrorCode.ERROR_FILE_NOT_FOUND;
 
             case NetError.ERR_INVALID_URL:
-                return ERROR_BAD_URL;
+                return WebviewErrorCode.ERROR_BAD_URL;
 
             case NetError.ERR_DISALLOWED_URL_SCHEME:
             case NetError.ERR_UNKNOWN_URL_SCHEME:
-                return ERROR_UNSUPPORTED_SCHEME;
+                return WebviewErrorCode.ERROR_UNSUPPORTED_SCHEME;
 
             case NetError.ERR_IO_PENDING:
             case NetError.ERR_NETWORK_IO_SUSPENDED:
-                return ERROR_IO;
+                return WebviewErrorCode.ERROR_IO;
 
             case NetError.ERR_CONNECTION_TIMED_OUT:
             case NetError.ERR_TIMED_OUT:
-                return ERROR_TIMEOUT;
+                return WebviewErrorCode.ERROR_TIMEOUT;
 
             case NetError.ERR_FILE_TOO_BIG:
-                return ERROR_FILE;
+                return WebviewErrorCode.ERROR_FILE;
 
             case NetError.ERR_HOST_RESOLVER_QUEUE_TOO_LARGE:
             case NetError.ERR_INSUFFICIENT_RESOURCES:
             case NetError.ERR_OUT_OF_MEMORY:
-                return ERROR_TOO_MANY_REQUESTS;
+                return WebviewErrorCode.ERROR_TOO_MANY_REQUESTS;
 
             case NetError.ERR_BLOCKED_BY_ADMINISTRATOR:
             case NetError.ERR_CONNECTION_CLOSED:
@@ -96,7 +58,7 @@
             case NetError.ERR_CONNECTION_ABORTED:
             case NetError.ERR_CONNECTION_FAILED:
             case NetError.ERR_SOCKET_NOT_CONNECTED:
-                return ERROR_CONNECT;
+                return WebviewErrorCode.ERROR_CONNECT;
 
             case NetError.ERR_INTERNET_DISCONNECTED:
             case NetError.ERR_ADDRESS_INVALID:
@@ -104,7 +66,7 @@
             case NetError.ERR_NAME_NOT_RESOLVED:
             case NetError.ERR_NAME_RESOLUTION_FAILED:
             case NetError.ERR_ICANN_NAME_COLLISION:
-                return ERROR_HOST_LOOKUP;
+                return WebviewErrorCode.ERROR_HOST_LOOKUP;
 
             case NetError.ERR_SSL_PROTOCOL_ERROR:
             case NetError.ERR_SSL_CLIENT_AUTH_CERT_NEEDED:
@@ -119,13 +81,13 @@
             case NetError.ERR_SSL_BAD_RECORD_MAC_ALERT:
             case NetError.ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED:
             case NetError.ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY:
-                return ERROR_FAILED_SSL_HANDSHAKE;
+                return WebviewErrorCode.ERROR_FAILED_SSL_HANDSHAKE;
 
             case NetError.ERR_PROXY_AUTH_UNSUPPORTED:
             case NetError.ERR_PROXY_AUTH_REQUESTED:
             case NetError.ERR_PROXY_CONNECTION_FAILED:
             case NetError.ERR_UNEXPECTED_PROXY_AUTH:
-                return ERROR_PROXY_AUTHENTICATION;
+                return WebviewErrorCode.ERROR_PROXY_AUTHENTICATION;
 
             // The certificate errors are handled by onReceivedSslError
             // and don't need to be reported here.
@@ -140,10 +102,10 @@
             case NetError.ERR_CERT_INVALID:
             case NetError.ERR_CERT_WEAK_SIGNATURE_ALGORITHM:
             case NetError.ERR_CERT_NON_UNIQUE_NAME:
-                return ERROR_OK;
+                return WebviewErrorCode.ERROR_OK;
 
             default:
-                return ERROR_UNKNOWN;
+                return WebviewErrorCode.ERROR_UNKNOWN;
         }
     }
 
diff --git a/android_webview/java/src/org/chromium/android_webview/WebviewErrorCode.java b/android_webview/java/src/org/chromium/android_webview/WebviewErrorCode.java
new file mode 100644
index 0000000..a6266661
--- /dev/null
+++ b/android_webview/java/src/org/chromium/android_webview/WebviewErrorCode.java
@@ -0,0 +1,58 @@
+// 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.android_webview;
+
+import android.webkit.WebViewClient;
+
+import androidx.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.SOURCE)
+@IntDef({WebviewErrorCode.ERROR_OK, WebviewErrorCode.ERROR_UNKNOWN,
+        WebviewErrorCode.ERROR_HOST_LOOKUP, WebviewErrorCode.ERROR_UNSUPPORTED_AUTH_SCHEME,
+        WebviewErrorCode.ERROR_AUTHENTICATION, WebviewErrorCode.ERROR_PROXY_AUTHENTICATION,
+        WebviewErrorCode.ERROR_CONNECT, WebviewErrorCode.ERROR_IO, WebviewErrorCode.ERROR_TIMEOUT,
+        WebviewErrorCode.ERROR_REDIRECT_LOOP, WebviewErrorCode.ERROR_UNSUPPORTED_SCHEME,
+        WebviewErrorCode.ERROR_FAILED_SSL_HANDSHAKE, WebviewErrorCode.ERROR_BAD_URL,
+        WebviewErrorCode.ERROR_FILE, WebviewErrorCode.ERROR_FILE_NOT_FOUND,
+        WebviewErrorCode.ERROR_TOO_MANY_REQUESTS, WebviewErrorCode.ERROR_UNSAFE_RESOURCE})
+public @interface WebviewErrorCode {
+    // Success
+    int ERROR_OK = 0;
+    // Generic error
+    int ERROR_UNKNOWN = WebViewClient.ERROR_UNKNOWN;
+    // Server or proxy hostname lookup failed
+    int ERROR_HOST_LOOKUP = WebViewClient.ERROR_HOST_LOOKUP;
+    // Unsupported authentication scheme (not basic or digest)
+    int ERROR_UNSUPPORTED_AUTH_SCHEME = WebViewClient.ERROR_UNSUPPORTED_AUTH_SCHEME;
+    // User authentication failed on server
+    int ERROR_AUTHENTICATION = WebViewClient.ERROR_AUTHENTICATION;
+    // User authentication failed on proxy
+    int ERROR_PROXY_AUTHENTICATION = WebViewClient.ERROR_PROXY_AUTHENTICATION;
+    // Failed to connect to the server
+    int ERROR_CONNECT = WebViewClient.ERROR_CONNECT;
+    // Failed to read or write to the server
+    int ERROR_IO = WebViewClient.ERROR_IO;
+    // Connection timed out
+    int ERROR_TIMEOUT = WebViewClient.ERROR_TIMEOUT;
+    // Too many redirects
+    int ERROR_REDIRECT_LOOP = WebViewClient.ERROR_REDIRECT_LOOP;
+    // Unsupported URI scheme
+    int ERROR_UNSUPPORTED_SCHEME = WebViewClient.ERROR_UNSUPPORTED_SCHEME;
+    // Failed to perform SSL handshake
+    int ERROR_FAILED_SSL_HANDSHAKE = WebViewClient.ERROR_FAILED_SSL_HANDSHAKE;
+    // Malformed URL
+    int ERROR_BAD_URL = WebViewClient.ERROR_BAD_URL;
+    // Generic file error
+    int ERROR_FILE = WebViewClient.ERROR_FILE;
+    // File not found
+    int ERROR_FILE_NOT_FOUND = WebViewClient.ERROR_FILE_NOT_FOUND;
+    // Too many requests during this load
+    int ERROR_TOO_MANY_REQUESTS = WebViewClient.ERROR_TOO_MANY_REQUESTS;
+    // Request was identified as a bad url by safebrowsing.
+    int ERROR_UNSAFE_RESOURCE = WebViewClient.ERROR_UNSAFE_RESOURCE;
+}
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsStaticsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsStaticsTest.java
index 9220f10..8ef3dcec 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsStaticsTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsStaticsTest.java
@@ -15,7 +15,7 @@
 
 import org.chromium.android_webview.AwContents;
 import org.chromium.android_webview.AwContentsStatics;
-import org.chromium.android_webview.ErrorCodeConversionHelper;
+import org.chromium.android_webview.WebviewErrorCode;
 import org.chromium.android_webview.test.TestAwContentsClient.OnReceivedError2Helper;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.Feature;
@@ -95,8 +95,8 @@
                     mAwContents, mContentsClient.getOnPageFinishedHelper(), url);
             Assert.assertEquals("onReceivedError should be called.", errorCount + 1,
                     errorHelper.getCallCount());
-            Assert.assertEquals("Incorrect network error code.",
-                    ErrorCodeConversionHelper.ERROR_UNKNOWN, errorHelper.getError().errorCode);
+            Assert.assertEquals("Incorrect network error code.", WebviewErrorCode.ERROR_UNKNOWN,
+                    errorHelper.getError().errorCode);
             Assert.assertEquals("onReceivedError was called for the wrong URL.", url,
                     errorHelper.getRequest().url);
         } finally {
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedError2Test.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedError2Test.java
index 2b0932a..dd3051c 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedError2Test.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedError2Test.java
@@ -22,7 +22,7 @@
 import org.chromium.android_webview.AwContents;
 import org.chromium.android_webview.AwContentsClient.AwWebResourceError;
 import org.chromium.android_webview.AwContentsClient.AwWebResourceRequest;
-import org.chromium.android_webview.ErrorCodeConversionHelper;
+import org.chromium.android_webview.WebviewErrorCode;
 import org.chromium.android_webview.test.util.AwTestTouchUtils;
 import org.chromium.android_webview.test.util.CommonResources;
 import org.chromium.base.test.util.Feature;
@@ -123,7 +123,7 @@
         AwWebResourceError error = onReceivedError2Helper.getError();
         // The particular error code that is returned depends on the configuration of the device
         // (such as existence of a proxy) so we don't test for it.
-        assertNotEquals(ErrorCodeConversionHelper.ERROR_UNKNOWN, error.errorCode);
+        assertNotEquals(WebviewErrorCode.ERROR_UNKNOWN, error.errorCode);
         Assert.assertNotNull(error.description);
     }
 
@@ -157,7 +157,7 @@
         AwWebResourceError error = onReceivedError2Helper.getError();
         // The particular error code that is returned depends on the configuration of the device
         // (such as existence of a proxy) so we don't test for it.
-        assertNotEquals(ErrorCodeConversionHelper.ERROR_UNKNOWN, error.errorCode);
+        assertNotEquals(WebviewErrorCode.ERROR_UNKNOWN, error.errorCode);
         Assert.assertNotNull(error.description);
     }
 
@@ -184,7 +184,7 @@
         AwWebResourceError error = onReceivedError2Helper.getError();
         // The particular error code that is returned depends on the configuration of the device
         // (such as existence of a proxy) so we don't test for it.
-        assertNotEquals(ErrorCodeConversionHelper.ERROR_UNKNOWN, error.errorCode);
+        assertNotEquals(WebviewErrorCode.ERROR_UNKNOWN, error.errorCode);
         Assert.assertNotNull(error.description);
     }
 
@@ -222,7 +222,7 @@
         AwWebResourceError error = onReceivedError2Helper.getError();
         // The particular error code that is returned depends on the configuration of the device
         // (such as existence of a proxy) so we don't test for it.
-        assertNotEquals(ErrorCodeConversionHelper.ERROR_UNKNOWN, error.errorCode);
+        assertNotEquals(WebviewErrorCode.ERROR_UNKNOWN, error.errorCode);
         Assert.assertNotNull(error.description);
     }
 
@@ -250,7 +250,7 @@
         AwWebResourceError error = onReceivedError2Helper.getError();
         // The particular error code that is returned depends on the configuration of the device
         // (such as existence of a proxy) so we don't test for it.
-        assertNotEquals(ErrorCodeConversionHelper.ERROR_UNKNOWN, error.errorCode);
+        assertNotEquals(WebviewErrorCode.ERROR_UNKNOWN, error.errorCode);
         Assert.assertNotNull(error.description);
     }
 
@@ -275,7 +275,7 @@
         Assert.assertFalse(request.isMainFrame);
         Assert.assertFalse(request.hasUserGesture);
         AwWebResourceError error = onReceivedError2Helper.getError();
-        Assert.assertEquals(ErrorCodeConversionHelper.ERROR_UNSUPPORTED_SCHEME, error.errorCode);
+        Assert.assertEquals(WebviewErrorCode.ERROR_UNSUPPORTED_SCHEME, error.errorCode);
         Assert.assertNotNull(error.description);
     }
 
@@ -302,7 +302,7 @@
         Assert.assertFalse(request.isMainFrame);
         Assert.assertFalse(request.hasUserGesture);
         AwWebResourceError error = onReceivedError2Helper.getError();
-        Assert.assertEquals(ErrorCodeConversionHelper.ERROR_UNKNOWN, error.errorCode);
+        Assert.assertEquals(WebviewErrorCode.ERROR_UNKNOWN, error.errorCode);
         Assert.assertNotNull(error.description);
     }
 
@@ -329,7 +329,7 @@
         Assert.assertFalse(request.isMainFrame);
         Assert.assertFalse(request.hasUserGesture);
         AwWebResourceError error = onReceivedError2Helper.getError();
-        Assert.assertEquals(ErrorCodeConversionHelper.ERROR_UNKNOWN, error.errorCode);
+        Assert.assertEquals(WebviewErrorCode.ERROR_UNKNOWN, error.errorCode);
         Assert.assertNotNull(error.description);
     }
 
@@ -356,7 +356,7 @@
         Assert.assertFalse(request.isMainFrame);
         Assert.assertFalse(request.hasUserGesture);
         AwWebResourceError error = onReceivedError2Helper.getError();
-        Assert.assertEquals(ErrorCodeConversionHelper.ERROR_UNKNOWN, error.errorCode);
+        Assert.assertEquals(WebviewErrorCode.ERROR_UNKNOWN, error.errorCode);
         Assert.assertNotNull(error.description);
     }
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedErrorTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedErrorTest.java
index 37fade9..1dcbd3e9 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedErrorTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/ClientOnReceivedErrorTest.java
@@ -17,7 +17,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.android_webview.AwContents;
-import org.chromium.android_webview.ErrorCodeConversionHelper;
+import org.chromium.android_webview.WebviewErrorCode;
 import org.chromium.base.test.util.Feature;
 import org.chromium.content_public.browser.test.util.TestCallbackHelperContainer;
 
@@ -76,8 +76,8 @@
         mActivityTestRule.loadUrlAsync(mAwContents, url);
 
         onReceivedErrorHelper.waitForCallback(onReceivedErrorCallCount);
-        Assert.assertEquals(ErrorCodeConversionHelper.ERROR_UNSUPPORTED_SCHEME,
-                onReceivedErrorHelper.getErrorCode());
+        Assert.assertEquals(
+                WebviewErrorCode.ERROR_UNSUPPORTED_SCHEME, onReceivedErrorHelper.getErrorCode());
         Assert.assertEquals(url, onReceivedErrorHelper.getFailingUrl());
         Assert.assertNotNull(onReceivedErrorHelper.getDescription());
     }
@@ -110,8 +110,7 @@
         mActivityTestRule.loadUrlAsync(mAwContents, url);
 
         onReceivedErrorHelper.waitForCallback(onReceivedErrorCallCount);
-        Assert.assertEquals(
-                ErrorCodeConversionHelper.ERROR_UNKNOWN, onReceivedErrorHelper.getErrorCode());
+        Assert.assertEquals(WebviewErrorCode.ERROR_UNKNOWN, onReceivedErrorHelper.getErrorCode());
         Assert.assertEquals(url, onReceivedErrorHelper.getFailingUrl());
         Assert.assertNotNull(onReceivedErrorHelper.getDescription());
     }
@@ -127,8 +126,7 @@
         mActivityTestRule.loadUrlAsync(mAwContents, url);
 
         onReceivedErrorHelper.waitForCallback(onReceivedErrorCallCount);
-        Assert.assertEquals(
-                ErrorCodeConversionHelper.ERROR_UNKNOWN, onReceivedErrorHelper.getErrorCode());
+        Assert.assertEquals(WebviewErrorCode.ERROR_UNKNOWN, onReceivedErrorHelper.getErrorCode());
         Assert.assertEquals(url, onReceivedErrorHelper.getFailingUrl());
         Assert.assertNotNull(onReceivedErrorHelper.getDescription());
     }
@@ -146,8 +144,7 @@
         mActivityTestRule.loadUrlAsync(mAwContents, url);
 
         onReceivedErrorHelper.waitForCallback(onReceivedErrorCallCount);
-        Assert.assertEquals(
-                ErrorCodeConversionHelper.ERROR_UNKNOWN, onReceivedErrorHelper.getErrorCode());
+        Assert.assertEquals(WebviewErrorCode.ERROR_UNKNOWN, onReceivedErrorHelper.getErrorCode());
         Assert.assertEquals(url, onReceivedErrorHelper.getFailingUrl());
         Assert.assertFalse(onReceivedErrorHelper.getDescription().isEmpty());
     }
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/PolicyUrlFilteringTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/PolicyUrlFilteringTest.java
index 3919b35..9a286448 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/PolicyUrlFilteringTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/PolicyUrlFilteringTest.java
@@ -20,7 +20,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.android_webview.AwContents;
-import org.chromium.android_webview.ErrorCodeConversionHelper;
+import org.chromium.android_webview.WebviewErrorCode;
 import org.chromium.android_webview.policy.AwPolicyProvider;
 import org.chromium.base.test.util.Feature;
 import org.chromium.content_public.browser.test.util.TestCallbackHelperContainer;
@@ -88,7 +88,7 @@
         setFilteringPolicy(testProvider, new String[] {"localhost"}, new String[] {});
 
         navigateAndCheckOutcome(mFooTestUrl, 0 /* error count before */, 1 /* error count after */);
-        Assert.assertEquals(ErrorCodeConversionHelper.ERROR_CONNECT,
+        Assert.assertEquals(WebviewErrorCode.ERROR_CONNECT,
                 mContentsClient.getOnReceivedErrorHelper().getErrorCode());
     }
 
@@ -107,7 +107,7 @@
 
         // Make sure it goes through the blocklist
         navigateAndCheckOutcome(mBarTestUrl, 0 /* error count before */, 1 /* error count after */);
-        Assert.assertEquals(ErrorCodeConversionHelper.ERROR_CONNECT,
+        Assert.assertEquals(WebviewErrorCode.ERROR_CONNECT,
                 mContentsClient.getOnReceivedErrorHelper().getErrorCode());
     }
     // clang-format on
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
index 985755d1..7e649a8d 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
@@ -33,8 +33,8 @@
 import org.chromium.android_webview.AwContentsClient;
 import org.chromium.android_webview.AwContentsStatics;
 import org.chromium.android_webview.AwSettings;
-import org.chromium.android_webview.ErrorCodeConversionHelper;
 import org.chromium.android_webview.SafeBrowsingAction;
+import org.chromium.android_webview.WebviewErrorCode;
 import org.chromium.android_webview.common.AwSwitches;
 import org.chromium.android_webview.safe_browsing.AwSafeBrowsingConfigHelper;
 import org.chromium.android_webview.safe_browsing.AwSafeBrowsingConversionHelper;
@@ -565,7 +565,7 @@
                 mAwContents, mContentsClient.getOnPageFinishedHelper(), WEB_UI_MALWARE_URL);
         errorHelper.waitForCallback(errorCount);
         Assert.assertEquals(
-                ErrorCodeConversionHelper.ERROR_UNSAFE_RESOURCE, errorHelper.getError().errorCode);
+                WebviewErrorCode.ERROR_UNSAFE_RESOURCE, errorHelper.getError().errorCode);
         Assert.assertEquals("Network error is for the malicious page", WEB_UI_MALWARE_URL,
                 errorHelper.getRequest().url);
 
@@ -672,7 +672,7 @@
         clickBackToSafety();
         errorHelper.waitForCallback(errorCount);
         Assert.assertEquals(
-                ErrorCodeConversionHelper.ERROR_UNSAFE_RESOURCE, errorHelper.getError().errorCode);
+                WebviewErrorCode.ERROR_UNSAFE_RESOURCE, errorHelper.getError().errorCode);
         final String responseUrl = mTestServer.getURL(MALWARE_HTML_PATH);
         Assert.assertEquals("Network error is for the malicious page", responseUrl,
                 errorHelper.getRequest().url);
@@ -768,7 +768,7 @@
         mActivityTestRule.loadUrlAsync(mAwContents, responseUrl);
         errorHelper.waitForCallback(errorCount);
         Assert.assertEquals(
-                ErrorCodeConversionHelper.ERROR_UNSAFE_RESOURCE, errorHelper.getError().errorCode);
+                WebviewErrorCode.ERROR_UNSAFE_RESOURCE, errorHelper.getError().errorCode);
         Assert.assertEquals("Network error is for the malicious page", responseUrl,
                 errorHelper.getRequest().url);
     }
@@ -882,7 +882,7 @@
         mActivityTestRule.loadUrlAsync(mAwContents, responseUrl);
         errorHelper.waitForCallback(errorCount);
         Assert.assertEquals(
-                ErrorCodeConversionHelper.ERROR_UNSAFE_RESOURCE, errorHelper.getError().errorCode);
+                WebviewErrorCode.ERROR_UNSAFE_RESOURCE, errorHelper.getError().errorCode);
         Assert.assertEquals("Network error is for the malicious page", responseUrl,
                 errorHelper.getRequest().url);
 
diff --git a/android_webview/tools/OWNERS b/android_webview/tools/OWNERS
index 4ba176e..606a16b7 100644
--- a/android_webview/tools/OWNERS
+++ b/android_webview/tools/OWNERS
@@ -1,3 +1 @@
 ntfschr@chromium.org
-
-per-file apk_merger.py=benmason@chromium.org
diff --git a/android_webview/tools/apk_merger.py b/android_webview/tools/apk_merger.py
deleted file mode 100755
index 7c82b120..0000000
--- a/android_webview/tools/apk_merger.py
+++ /dev/null
@@ -1,270 +0,0 @@
-#!/usr/bin/python
-# Copyright 2014 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-""" Merges a 32-bit APK into a 32/64-bit APK.
-
-This script is used to make the 32-bit parts of a pure 32-bit APK identical to
-those of an APK built on a 64-bit configuration (whether adding 32-bit parts to
-a pure 64-bit build, or replacing 32-bit parts in a multi-architecture build to
-ensurce consistency with pure 32-bit builds).
-
-In an ideal world, the libraries and assets in a pure 32-bit APK would be
-identical to the 32-bit equivalents in a 64-bit-generated APK (with secondary
-ABI). However, this isn't reality. For example, subtle differences due to paths
-yield different native libraries (a benign difference). Accidental differences
-in build configuration yield legitimate differences (impacting functionality and
-binary size). This script overwrites parts of the 64-bit APK with pieces from
-the 32-bit APK, so that the two versions are identical from a 32-bit
-perspective.
-
-Longer term, the 64-bit build configuration should be updated to generate pure
-32-bit APKs. While slightly counter-intuitive, this would ensure that 32-bit
-pieces are identical across the different versions without having to merge
-anything.
-
-To use this script, you need to
-1. Build 32-bit APK as usual.
-2. Build 64-bit APK.
-3. Use this script to merge the 2 APKs.
-
-"""
-
-import argparse
-import collections
-import filecmp
-import logging
-import os
-import pprint
-import shutil
-import sys
-import tempfile
-import zipfile
-
-SRC_DIR = os.path.join(os.path.dirname(__file__), '..', '..')
-SRC_DIR = os.path.abspath(SRC_DIR)
-BUILD_ANDROID_DIR = os.path.join(SRC_DIR, 'build', 'android')
-BUILD_ANDROID_GYP_DIR = os.path.join(BUILD_ANDROID_DIR, 'gyp')
-sys.path.append(BUILD_ANDROID_GYP_DIR)
-
-import finalize_apk  # pylint: disable=wrong-import-position
-from util import build_utils  # pylint: disable=wrong-import-position
-
-sys.path.append(BUILD_ANDROID_DIR)
-
-from pylib import constants  # pylint: disable=wrong-import-position
-
-DEFAULT_ZIPALIGN_PATH = os.path.join(
-    SRC_DIR, 'third_party', 'android_sdk', 'public', 'build-tools',
-    constants.ANDROID_SDK_BUILD_TOOLS_VERSION, 'zipalign')
-
-
-class ApkMergeFailure(Exception):
-  pass
-
-
-def UnpackApk(file_name, dst, ignore_paths=()):
-  zippy = zipfile.ZipFile(file_name)
-  files_to_extract = [f for f in zippy.namelist() if f not in ignore_paths]
-  zippy.extractall(dst, files_to_extract)
-
-
-def GetNonDirFiles(top, base_dir):
-  """ Return a list containing all (non-directory) files in tree with top as
-  root.
-
-  Each file is represented by the relative path from base_dir to that file.
-  If top is a file (not a directory) then a list containing only top is
-  returned.
-  """
-  if os.path.isdir(top):
-    ret = []
-    for dirpath, _, filenames in os.walk(top):
-      for filename in filenames:
-        ret.append(
-            os.path.relpath(os.path.join(dirpath, filename), base_dir))
-    return ret
-  else:
-    return [os.path.relpath(top, base_dir)]
-
-
-def GetDiffFiles(dcmp, base_dir):
-  """ Return the list of files contained only in the right directory of dcmp.
-
-  The files returned are represented by relative paths from base_dir.
-  """
-  copy_files = []
-  for file_name in dcmp.right_only:
-    copy_files.extend(
-        GetNonDirFiles(os.path.join(dcmp.right, file_name), base_dir))
-
-  # we cannot merge APKs with files with similar names but different contents
-  if len(dcmp.diff_files) > 0:
-    raise ApkMergeFailure('found differing files: %s in %s and %s' %
-                          (dcmp.diff_files, dcmp.left, dcmp.right))
-
-  if len(dcmp.funny_files) > 0:
-    raise ApkMergeFailure('found uncomparable files: %s in %s and %s' %
-                          (dcmp.funny_files, dcmp.left, dcmp.right))
-
-  for sub_dcmp in dcmp.subdirs.itervalues():
-    copy_files.extend(GetDiffFiles(sub_dcmp, base_dir))
-  return copy_files
-
-
-def CheckFilesExpected(actual_files, expected_files):
-  """ Check that the lists of actual and expected files are the same. """
-  actual_file_names = collections.defaultdict(int)
-  for f in actual_files:
-    actual_file_names[f] += 1
-  actual_file_set = set(actual_file_names.iterkeys())
-  expected_file_set = set(expected_files)
-
-  unexpected_file_set = actual_file_set.difference(expected_file_set)
-  missing_file_set = expected_file_set.difference(actual_file_set)
-  duplicate_file_set = set(
-      f for f, n in actual_file_names.iteritems() if n > 1)
-
-  errors = []
-  if unexpected_file_set:
-    errors.append(
-        '  unexpected files: %s' % pprint.pformat(unexpected_file_set))
-  if missing_file_set:
-    errors.append('  missing files: %s' % pprint.pformat(missing_file_set))
-  if duplicate_file_set:
-    errors.append('  duplicate files: %s' % pprint.pformat(duplicate_file_set))
-
-  if errors:
-    raise ApkMergeFailure(
-        "Files don't match expectations:\n%s" % '\n'.join(errors))
-
-
-def AddDiffFiles(diff_files, tmp_dir_32, out_zip, uncompress_shared_libraries):
-  """ Insert files only present in 32-bit APK into 64-bit APK (tmp_apk). """
-  for diff_file in diff_files:
-    compress = not uncompress_shared_libraries and diff_file.endswith('.so')
-    build_utils.AddToZipHermetic(out_zip,
-                                 diff_file,
-                                 os.path.join(tmp_dir_32, diff_file),
-                                 compress=compress)
-
-
-def MergeApk(args, tmp_apk, tmp_dir_32, tmp_dir_64):
-  # expected_files is the set of 32-bit related files that we expect to differ
-  # between a 32- and 64-bit build. Hence, they will be skipped when seeding the
-  # generated APK with the original 64-bit version, and explicitly copied in
-  # from the 32-bit version.
-  expected_files = []
-
-  assets_path = 'base/assets' if args.bundle else 'assets'
-  expected_files.append('%s/snapshot_blob_32.bin' % assets_path)
-
-  if args.has_unwind_cfi:
-    expected_files.append('%s/unwind_cfi_32' % assets_path)
-
-  # All native libraries are assumed to differ, and will be merged.
-  with zipfile.ZipFile(args.apk_32bit) as z:
-    expected_files.extend([p for p in z.namelist() if p.endswith('.so')])
-
-  UnpackApk(args.apk_32bit, tmp_dir_32)
-  UnpackApk(args.apk_64bit, tmp_dir_64, expected_files)
-
-  # These are files that we know will be different, and we will hence ignore in
-  # the file comparison.
-  ignores = ['META-INF', 'AndroidManifest.xml']
-  if args.ignore_classes_dex:
-    ignores += ['classes.dex', 'classes2.dex', 'classes3.dex']
-  if args.debug:
-    # see http://crbug.com/648720
-    ignores += ['webview_licenses.notice']
-  if args.bundle:
-    # if merging a bundle we must ignore the bundle specific
-    # proto files as they will always be different.
-    ignores += ['BundleConfig.pb', 'native.pb']
-
-  dcmp = filecmp.dircmp(
-      tmp_dir_64,
-      tmp_dir_32,
-      ignore=ignores)
-
-  diff_files = GetDiffFiles(dcmp, tmp_dir_32)
-
-  # Check that diff_files match exactly those files we want to insert into
-  # the 64-bit APK.
-  CheckFilesExpected(diff_files, expected_files)
-
-  with zipfile.ZipFile(tmp_apk, 'w') as out_zip:
-    exclude_patterns = ['META-INF/*'] + expected_files
-
-    # Build the initial merged APK from the 64-bit APK, excluding all files we
-    # will pull from the 32-bit APK.
-    path_transform = (
-        lambda p: None if build_utils.MatchesGlob(p, exclude_patterns) else p)
-    build_utils.MergeZips(
-        out_zip, [args.apk_64bit], path_transform=path_transform)
-
-    # Add the files from the 32-bit APK.
-    AddDiffFiles(diff_files, tmp_dir_32, out_zip,
-                 args.uncompress_shared_libraries)
-
-
-def main():
-  parser = argparse.ArgumentParser(
-      description='Merge a 32-bit APK into a 64-bit APK')
-  # Using type=os.path.abspath converts file paths to absolute paths so that
-  # we can change working directory without affecting these paths
-  parser.add_argument('--apk_32bit', required=True, type=os.path.abspath)
-  parser.add_argument('--apk_64bit', required=True, type=os.path.abspath)
-  parser.add_argument('--out_apk', required=True, type=os.path.abspath)
-  parser.add_argument('--zipalign_path', type=os.path.abspath)
-  parser.add_argument('--keystore_path', required=True, type=os.path.abspath)
-  parser.add_argument('--key_name', required=True)
-  parser.add_argument('--key_password', required=True)
-  parser.add_argument('--uncompress-shared-libraries', action='store_true')
-  parser.add_argument('--bundle', action='store_true')
-  parser.add_argument('--debug', action='store_true')
-  # This option shall only used in debug build, see http://crbug.com/631494.
-  parser.add_argument('--ignore-classes-dex', action='store_true')
-  parser.add_argument('--has-unwind-cfi', action='store_true',
-                      help='Specifies if the 32-bit apk has unwind_cfi file')
-  args = parser.parse_args()
-
-  if (args.zipalign_path is not None and
-      not os.path.isfile(args.zipalign_path)):
-    # If given an invalid path, fall back to try the default.
-    logging.warning('zipalign path not found: %s', args.zipalign_path)
-    logging.warning('falling back to: %s', DEFAULT_ZIPALIGN_PATH)
-    args.zipalign_path = None
-
-  if args.zipalign_path is None:
-    # When no path given, try the default.
-    if not os.path.isfile(DEFAULT_ZIPALIGN_PATH):
-      return 'ERROR: zipalign path not found: %s' % DEFAULT_ZIPALIGN_PATH
-    args.zipalign_path = DEFAULT_ZIPALIGN_PATH
-
-  tmp_dir = tempfile.mkdtemp()
-  tmp_dir_64 = os.path.join(tmp_dir, '64_bit')
-  tmp_dir_32 = os.path.join(tmp_dir, '32_bit')
-  tmp_apk = os.path.join(tmp_dir, 'tmp.apk')
-  new_apk = args.out_apk
-
-  try:
-    MergeApk(args, tmp_apk, tmp_dir_32, tmp_dir_64)
-
-    apksigner_jar = os.path.join(
-        os.path.dirname(args.zipalign_path), 'lib', 'apksigner.jar')
-    # Official APKs are re-signed anyways, so it is not important to figure out
-    # the correct min_sdk_version. Use 21 since that's the lowest supported
-    # webview version.
-    min_sdk_version = 21
-    finalize_apk.FinalizeApk(apksigner_jar, args.zipalign_path, tmp_apk,
-                             new_apk, args.keystore_path, args.key_password,
-                             args.key_name, min_sdk_version)
-  finally:
-    shutil.rmtree(tmp_dir)
-  return 0
-
-
-if __name__ == '__main__':
-  sys.exit(main())
diff --git a/ash/wallpaper/wallpaper_view.cc b/ash/wallpaper/wallpaper_view.cc
index c514a0c..6ead2320 100644
--- a/ash/wallpaper/wallpaper_view.cc
+++ b/ash/wallpaper/wallpaper_view.cc
@@ -256,9 +256,6 @@
                                                  ::wm::ANIMATE_NONE);
   }
 
-  aura::Window* container = root_window->GetChildById(container_id);
-  wallpaper_widget->SetBounds(container->bounds());
-
   return wallpaper_widget;
 }
 
diff --git a/base/android/jni_array.cc b/base/android/jni_array.cc
index 156aad63..32a5fc9 100644
--- a/base/android/jni_array.cc
+++ b/base/android/jni_array.cc
@@ -164,7 +164,7 @@
 
 ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
     JNIEnv* env,
-    base::span<std::vector<uint8_t>> v) {
+    base::span<const std::vector<uint8_t>> v) {
   ScopedJavaLocalRef<jclass> byte_array_clazz = GetClass(env, "[B");
   jobjectArray joa =
       env->NewObjectArray(v.size(), byte_array_clazz.obj(), nullptr);
diff --git a/base/android/jni_array.h b/base/android/jni_array.h
index 05963a5..b571653d 100644
--- a/base/android/jni_array.h
+++ b/base/android/jni_array.h
@@ -77,7 +77,7 @@
 
 BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfByteArray(
     JNIEnv* env,
-    base::span<std::vector<uint8_t>> v);
+    base::span<const std::vector<uint8_t>> v);
 
 BASE_EXPORT ScopedJavaLocalRef<jobjectArray> ToJavaArrayOfStrings(
     JNIEnv* env,
diff --git a/build/android/gyp/lint.py b/build/android/gyp/lint.py
index 1b10be0..a93907a0 100755
--- a/build/android/gyp/lint.py
+++ b/build/android/gyp/lint.py
@@ -232,12 +232,16 @@
   env['JAVA_HOME'] = build_utils.JAVA_HOME
   # This is necessary so that lint errors print stack traces in stdout.
   env['LINT_PRINT_STACKTRACE'] = 'true'
+  if baseline and not os.path.exists(baseline):
+    # Generating new baselines is only done locally, and requires more memory to
+    # avoid OOMs.
+    env['LINT_OPTS'] = '-Xmx4g'
   # This filter is necessary for JDK11.
   stderr_filter = build_utils.FilterReflectiveAccessJavaWarnings
   stdout_filter = lambda x: build_utils.FilterLines(x, 'No issues found')
 
   start = time.time()
-  logging.debug('Lint command %s', cmd)
+  logging.debug('Lint command %s', ' '.join(cmd))
   failed = True
   try:
     failed = bool(
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 8b6412e..fd8a868f 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -501,11 +501,13 @@
       "-instcombine-lower-dbg-declare=0",
     ]
 
-    cflags += [
-      # TODO(https://crbug.com/1127713): Investigate, remove.
-      "-mllvm",
-      "-enable-dse-memoryssa=false",
-    ]
+    if (!llvm_force_head_revision) {
+      cflags += [
+        # TODO(https://crbug.com/1127713): Investigate, remove.
+        "-mllvm",
+        "-enable-dse-memoryssa=false",
+      ]
+    }
   }
 
   # C11/C++11 compiler flags setup.
diff --git a/cc/base/features.cc b/cc/base/features.cc
index 43d2f22..635bba5 100644
--- a/cc/base/features.cc
+++ b/cc/base/features.cc
@@ -17,11 +17,6 @@
 const base::Feature kSynchronizedScrolling = {"SynchronizedScrolling",
                                               base::FEATURE_ENABLED_BY_DEFAULT};
 
-// When enabled BeginMainFrame does not wait for activation in the compositor
-// thread for texture layers (crbug.com/1046463)
-const base::Feature kTextureLayerSkipWaitForActivation{
-    "TextureLayerSkipWaitForActivation", base::FEATURE_DISABLED_BY_DEFAULT};
-
 #if !defined(OS_ANDROID)
 // Enables latency recovery on the impl thread.
 const base::Feature kImplLatencyRecovery = {"ImplLatencyRecovery",
diff --git a/cc/base/features.h b/cc/base/features.h
index ea86ee6..f4ba786 100644
--- a/cc/base/features.h
+++ b/cc/base/features.h
@@ -13,7 +13,6 @@
 
 CC_BASE_EXPORT extern const base::Feature kImpulseScrollAnimations;
 CC_BASE_EXPORT extern const base::Feature kSynchronizedScrolling;
-CC_BASE_EXPORT extern const base::Feature kTextureLayerSkipWaitForActivation;
 
 #if !defined(OS_ANDROID)
 CC_BASE_EXPORT extern const base::Feature kImplLatencyRecovery;
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
index 14c21fd5..9c40eed 100644
--- a/cc/layers/layer.cc
+++ b/cc/layers/layer.cc
@@ -222,13 +222,6 @@
   layer_tree_host_->SetNeedsFullTreeSync();
 }
 
-void Layer::SetNextCommitWaitsForActivation() {
-  if (!layer_tree_host_)
-    return;
-
-  layer_tree_host_->SetNextCommitWaitsForActivation();
-}
-
 void Layer::SetNeedsPushProperties() {
   if (layer_tree_host_)
     layer_tree_host_->AddLayerShouldPushProperties(this);
diff --git a/cc/layers/layer.h b/cc/layers/layer.h
index 9fba1846..cc2369b 100644
--- a/cc/layers/layer.h
+++ b/cc/layers/layer.h
@@ -733,11 +733,6 @@
   // (the full tree is synced over).
   void SetNeedsFullTreeSync();
 
-  // Called when the next commit should wait until the pending tree is activated
-  // before finishing the commit and unblocking the main thread. Used to ensure
-  // unused resources on the impl thread are returned before commit completes.
-  void SetNextCommitWaitsForActivation();
-
   // Will recalculate whether the layer draws content and set draws_content_
   // appropriately.
   void UpdateDrawsContent(bool has_drawable_content);
diff --git a/cc/layers/texture_layer.cc b/cc/layers/texture_layer.cc
index 41193fb..0eba3220 100644
--- a/cc/layers/texture_layer.cc
+++ b/cc/layers/texture_layer.cc
@@ -110,11 +110,6 @@
     SetNeedsPushProperties();
 
   UpdateDrawsContent(HasDrawableContent());
-  // The active frame needs to be replaced and the mailbox returned before the
-  // commit is called complete.
-  if (!base::FeatureList::IsEnabled(
-          features::kTextureLayerSkipWaitForActivation))
-    SetNextCommitWaitsForActivation();
 }
 
 void TextureLayer::SetTransferableResource(
@@ -138,14 +133,8 @@
   // If we're removed from the tree, the TextureLayerImpl will be destroyed, and
   // we will need to set the mailbox again on a new TextureLayerImpl the next
   // time we push.
-  if (!host && holder_ref_) {
+  if (!host && holder_ref_)
     needs_set_resource_ = true;
-    // The active frame needs to be replaced and the mailbox returned before the
-    // commit is called complete.
-    if (!base::FeatureList::IsEnabled(
-            features::kTextureLayerSkipWaitForActivation))
-      SetNextCommitWaitsForActivation();
-  }
   if (host) {
     // When attached to a new LayerTreeHost, all previously registered
     // SharedBitmapIds will need to be re-sent to the new TextureLayerImpl
diff --git a/cc/layers/texture_layer_unittest.cc b/cc/layers/texture_layer_unittest.cc
index 3517cf1b..9e5e834 100644
--- a/cc/layers/texture_layer_unittest.cc
+++ b/cc/layers/texture_layer_unittest.cc
@@ -745,107 +745,6 @@
 
 SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerImplWithMailboxThreadedCallback);
 
-class TextureLayerMailboxIsActivatedDuringCommit : public LayerTreeTest {
- protected:
-  void ReleaseCallback(const gpu::SyncToken& original_sync_token,
-                       const gpu::SyncToken& release_sync_token,
-                       bool lost_resource) {
-    released_count_++;
-    switch (released_count_) {
-      case 1:
-        break;
-      case 2:
-        EXPECT_EQ(3, layer_tree_host()->SourceFrameNumber());
-        EndTest();
-        break;
-      default:
-        NOTREACHED();
-    }
-  }
-
-  void SetMailbox(char mailbox_char) {
-    const gpu::SyncToken sync_token =
-        SyncTokenFromUInt(static_cast<uint32_t>(mailbox_char));
-    std::unique_ptr<viz::SingleReleaseCallback> callback =
-        viz::SingleReleaseCallback::Create(base::BindOnce(
-            &TextureLayerMailboxIsActivatedDuringCommit::ReleaseCallback,
-            base::Unretained(this), sync_token));
-    constexpr gfx::Size size(64, 64);
-    auto resource = viz::TransferableResource::MakeGL(
-        MailboxFromChar(mailbox_char), GL_LINEAR, GL_TEXTURE_2D, sync_token,
-        size, false /* is_overlay_candidate */);
-    layer_->SetTransferableResource(resource, std::move(callback));
-  }
-
-  void BeginTest() override {
-    gfx::Size bounds(100, 100);
-    root_ = Layer::Create();
-    root_->SetBounds(bounds);
-
-    layer_ = TextureLayer::CreateForMailbox(nullptr);
-    layer_->SetIsDrawable(true);
-    layer_->SetBounds(bounds);
-
-    root_->AddChild(layer_);
-    layer_tree_host()->SetRootLayer(root_);
-    layer_tree_host()->SetViewportRectAndScale(gfx::Rect(bounds), 1.f,
-                                               viz::LocalSurfaceIdAllocation());
-    SetMailbox('1');
-
-    PostSetNeedsCommitToMainThread();
-  }
-
-  void WillActivateTreeOnThread(LayerTreeHostImpl* impl) override {
-    base::AutoLock lock(activate_count_lock_);
-    ++activate_count_;
-  }
-
-  void DidCommit() override {
-    // The first frame doesn't cause anything to be returned so it does not
-    // need to wait for activation.
-    if (layer_tree_host()->SourceFrameNumber() > 1) {
-      base::AutoLock lock(activate_count_lock_);
-      // The activate happened before commit is done on the main side.
-      EXPECT_EQ(activate_count_, layer_tree_host()->SourceFrameNumber());
-    }
-
-    switch (layer_tree_host()->SourceFrameNumber()) {
-      case 1:
-        // The first mailbox has been activated. Set a new mailbox, and
-        // expect the next commit to finish *after* it is activated.
-        SetMailbox('2');
-        break;
-      case 2:
-        // The second mailbox has been activated. Remove the layer from
-        // the tree to cause another commit/activation. The commit should
-        // finish *after* the layer is removed from the active tree.
-        layer_->RemoveFromParent();
-        break;
-      case 3:
-        // This ensures all texture mailboxes are released before the end of the
-        // test.
-        layer_->ClearClient();
-        break;
-      default:
-        NOTREACHED();
-    }
-  }
-
-  void CommitCompleteOnThread(LayerTreeHostImpl* host_impl) override {
-    // The activate didn't happen before commit is done on the impl side (but it
-    // should happen before the main thread is done).
-    EXPECT_EQ(activate_count_, host_impl->sync_tree()->source_frame_number());
-  }
-
-  base::Lock activate_count_lock_;
-  int activate_count_ = 0;
-  scoped_refptr<Layer> root_;
-  scoped_refptr<TextureLayer> layer_;
-  int released_count_ = 0;
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(TextureLayerMailboxIsActivatedDuringCommit);
-
 class TextureLayerImplWithResourceTest : public TextureLayerTest {
  protected:
   void SetUp() override {
diff --git a/cc/tiles/picture_layer_tiling.cc b/cc/tiles/picture_layer_tiling.cc
index ab56acb..a887995c 100644
--- a/cc/tiles/picture_layer_tiling.cc
+++ b/cc/tiles/picture_layer_tiling.cc
@@ -50,12 +50,21 @@
   DCHECK_GE(raster_transform.translation().y(), 0.f);
   DCHECK_LT(raster_transform.translation().y(), 1.f);
 
-  DCHECK(!gfx::ScaleToFlooredSize(raster_source_->GetSize(),
-                                  raster_transform.scale())
-              .IsEmpty())
+#if DCHECK_IS_ON()
+  gfx::SizeF scaled_source_size(gfx::ScaleSize(
+      gfx::SizeF(raster_source_->GetSize()), raster_transform.scale()));
+  gfx::Size floored_size = gfx::ToFlooredSize(scaled_source_size);
+  bool is_width_empty =
+      !floored_size.width() &&
+      !MathUtil::IsWithinEpsilon(scaled_source_size.width(), 1.f);
+  bool is_height_empty =
+      !floored_size.height() &&
+      !MathUtil::IsWithinEpsilon(scaled_source_size.height(), 1.f);
+  DCHECK(!is_width_empty && !is_height_empty)
       << "Tiling created with scale too small as contents become empty."
       << " Layer bounds: " << raster_source_->GetSize().ToString()
       << " Raster transform: " << raster_transform_.ToString();
+#endif
 
   gfx::Rect content_bounds_rect =
       EnclosingContentsRectFromLayerRect(gfx::Rect(raster_source_->GetSize()));
diff --git a/cc/tiles/picture_layer_tiling_unittest.cc b/cc/tiles/picture_layer_tiling_unittest.cc
index 8ac09590..604d589 100644
--- a/cc/tiles/picture_layer_tiling_unittest.cc
+++ b/cc/tiles/picture_layer_tiling_unittest.cc
@@ -1316,5 +1316,18 @@
   }
 }
 
+TEST_F(PictureLayerTilingIteratorTest, SmallRasterTransforms) {
+  gfx::Size tile_size(1, 1);
+  gfx::Size layer_bounds(4357, 4357);
+  float scale = 1.f / layer_bounds.width();
+  Initialize(tile_size, scale, layer_bounds);
+  EXPECT_EQ(tiling_->tiling_size(), tile_size);
+
+  layer_bounds = {378, 378};
+  scale = 1.f / layer_bounds.width();
+  Initialize(tile_size, scale, layer_bounds);
+  EXPECT_EQ(tiling_->tiling_size(), tile_size);
+}
+
 }  // namespace
 }  // namespace cc
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index e7fe71f..dff36488 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -1347,6 +1347,7 @@
   "java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationManager.java",
   "java/src/org/chromium/chrome/browser/send_tab_to_self/NotificationSharedPrefManager.java",
   "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfAndroidBridge.java",
+  "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfCoordinator.java",
   "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfEntry.java",
   "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfInfoBar.java",
   "java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfInfoBarController.java",
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index 0905fc6..8c0e91f 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -483,6 +483,7 @@
   "javatests/src/org/chromium/chrome/browser/search_engines/settings/SearchEngineSettingsTest.java",
   "javatests/src/org/chromium/chrome/browser/searchwidget/SearchActivityTest.java",
   "javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java",
+  "javatests/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfCoordinatorTest.java",
   "javatests/src/org/chromium/chrome/browser/settings/MainSettingsFragmentTest.java",
   "javatests/src/org/chromium/chrome/browser/settings/SettingsActivityTest.java",
   "javatests/src/org/chromium/chrome/browser/shape_detection/ShapeDetectionTest.java",
diff --git a/chrome/android/expectations/lint-baseline.xml b/chrome/android/expectations/lint-baseline.xml
index 0c9bf9a..e238d6b 100644
--- a/chrome/android/expectations/lint-baseline.xml
+++ b/chrome/android/expectations/lint-baseline.xml
@@ -2,259 +2,6 @@
 <issues format="5" by="lint 4.0.1" client="cli" variant="all" version="4.0.1">
 
     <issue
-        id="WrongConstant"
-        message="Must be one of: NetError.ERR_IO_PENDING, NetError.ERR_FAILED, NetError.ERR_ABORTED, NetError.ERR_INVALID_ARGUMENT, NetError.ERR_INVALID_HANDLE, NetError.ERR_FILE_NOT_FOUND, NetError.ERR_TIMED_OUT, NetError.ERR_FILE_TOO_BIG, NetError.ERR_UNEXPECTED, NetError.ERR_ACCESS_DENIED, NetError.ERR_NOT_IMPLEMENTED, NetError.ERR_INSUFFICIENT_RESOURCES, NetError.ERR_OUT_OF_MEMORY, NetError.ERR_UPLOAD_FILE_CHANGED, NetError.ERR_SOCKET_NOT_CONNECTED, NetError.ERR_FILE_EXISTS, NetError.ERR_FILE_PATH_TOO_LONG, NetError.ERR_FILE_NO_SPACE, NetError.ERR_FILE_VIRUS_INFECTED, NetError.ERR_BLOCKED_BY_CLIENT, NetError.ERR_NETWORK_CHANGED, NetError.ERR_BLOCKED_BY_ADMINISTRATOR, NetError.ERR_SOCKET_IS_CONNECTED, NetError.ERR_BLOCKED_ENROLLMENT_CHECK_PENDING, NetError.ERR_UPLOAD_STREAM_REWIND_NOT_SUPPORTED, NetError.ERR_CONTEXT_SHUT_DOWN, NetError.ERR_BLOCKED_BY_RESPONSE, NetError.ERR_CLEARTEXT_NOT_PERMITTED, NetError.ERR_BLOCKED_BY_CSP, NetError.ERR_H2_OR_QUIC_REQUIRED, NetError.ERR_INSECURE_PRIVATE_NETWORK_REQUEST, NetError.ERR_CONNECTION_CLOSED, NetError.ERR_CONNECTION_RESET, NetError.ERR_CONNECTION_REFUSED, NetError.ERR_CONNECTION_ABORTED, NetError.ERR_CONNECTION_FAILED, NetError.ERR_NAME_NOT_RESOLVED, NetError.ERR_INTERNET_DISCONNECTED, NetError.ERR_SSL_PROTOCOL_ERROR, NetError.ERR_ADDRESS_INVALID, NetError.ERR_ADDRESS_UNREACHABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_NEEDED, NetError.ERR_TUNNEL_CONNECTION_FAILED, NetError.ERR_NO_SSL_VERSIONS_ENABLED, NetError.ERR_SSL_VERSION_OR_CIPHER_MISMATCH, NetError.ERR_SSL_RENEGOTIATION_REQUESTED, NetError.ERR_PROXY_AUTH_UNSUPPORTED, NetError.ERR_CERT_ERROR_IN_SSL_RENEGOTIATION, NetError.ERR_BAD_SSL_CLIENT_AUTH_CERT, NetError.ERR_CONNECTION_TIMED_OUT, NetError.ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, NetError.ERR_SOCKS_CONNECTION_FAILED, NetError.ERR_SOCKS_CONNECTION_HOST_UNREACHABLE, NetError.ERR_ALPN_NEGOTIATION_FAILED, NetError.ERR_SSL_NO_RENEGOTIATION, NetError.ERR_WINSOCK_UNEXPECTED_WRITTEN_BYTES, NetError.ERR_SSL_DECOMPRESSION_FAILURE_ALERT, NetError.ERR_SSL_BAD_RECORD_MAC_ALERT, NetError.ERR_PROXY_AUTH_REQUESTED, NetError.ERR_PROXY_CONNECTION_FAILED, NetError.ERR_MANDATORY_PROXY_CONFIGURATION_FAILED, NetError.ERR_PRECONNECT_MAX_SOCKET_LIMIT, NetError.ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED, NetError.ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY, NetError.ERR_PROXY_CERTIFICATE_INVALID, NetError.ERR_NAME_RESOLUTION_FAILED, NetError.ERR_NETWORK_ACCESS_DENIED, NetError.ERR_TEMPORARILY_THROTTLED, NetError.ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT, NetError.ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED, NetError.ERR_MSG_TOO_BIG, NetError.ERR_WS_PROTOCOL_ERROR, NetError.ERR_ADDRESS_IN_USE, NetError.ERR_SSL_HANDSHAKE_NOT_COMPLETED, NetError.ERR_SSL_BAD_PEER_PUBLIC_KEY, NetError.ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN, NetError.ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, NetError.ERR_SSL_DECRYPT_ERROR_ALERT, NetError.ERR_WS_THROTTLE_QUEUE_TOO_LARGE, NetError.ERR_SSL_SERVER_CERT_CHANGED, NetError.ERR_SSL_UNRECOGNIZED_NAME_ALERT, NetError.ERR_SOCKET_SET_RECEIVE_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_SET_SEND_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_RECEIVE_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SOCKET_SEND_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT, NetError.ERR_ICANN_NAME_COLLISION, NetError.ERR_SSL_SERVER_CERT_BAD_FORMAT, NetError.ERR_CT_STH_PARSING_FAILED, NetError.ERR_CT_STH_INCOMPLETE, NetError.ERR_UNABLE_TO_REUSE_CONNECTION_FOR_PROXY_AUTH, NetError.ERR_CT_CONSISTENCY_PROOF_PARSING_FAILED, NetError.ERR_SSL_OBSOLETE_CIPHER, NetError.ERR_WS_UPGRADE, NetError.ERR_READ_IF_READY_NOT_IMPLEMENTED, NetError.ERR_NO_BUFFER_SPACE, NetError.ERR_SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS, NetError.ERR_EARLY_DATA_REJECTED, NetError.ERR_WRONG_VERSION_ON_EARLY_DATA, NetError.ERR_TLS13_DOWNGRADE_DETECTED, NetError.ERR_SSL_KEY_USAGE_INCOMPATIBLE, NetError.ERR_CERT_COMMON_NAME_INVALID, NetError.ERR_CERT_DATE_INVALID, NetError.ERR_CERT_AUTHORITY_INVALID, NetError.ERR_CERT_CONTAINS_ERRORS, NetError.ERR_CERT_NO_REVOCATION_MECHANISM, NetError.ERR_CERT_UNABLE_TO_CHECK_REVOCATION, NetError.ERR_CERT_REVOKED, NetError.ERR_CERT_INVALID, NetError.ERR_CERT_WEAK_SIGNATURE_ALGORITHM, NetError.ERR_CERT_NON_UNIQUE_NAME, NetError.ERR_CERT_WEAK_KEY, NetError.ERR_CERT_NAME_CONSTRAINT_VIOLATION, NetError.ERR_CERT_VALIDITY_TOO_LONG, NetError.ERR_CERTIFICATE_TRANSPARENCY_REQUIRED, NetError.ERR_CERT_SYMANTEC_LEGACY, NetError.ERR_CERT_KNOWN_INTERCEPTION_BLOCKED, NetError.ERR_SSL_OBSOLETE_VERSION, NetError.ERR_CERT_END, NetError.ERR_INVALID_URL, NetError.ERR_DISALLOWED_URL_SCHEME, NetError.ERR_UNKNOWN_URL_SCHEME, NetError.ERR_INVALID_REDIRECT, NetError.ERR_TOO_MANY_REDIRECTS, NetError.ERR_UNSAFE_REDIRECT, NetError.ERR_UNSAFE_PORT, NetError.ERR_INVALID_RESPONSE, NetError.ERR_INVALID_CHUNKED_ENCODING, NetError.ERR_METHOD_NOT_SUPPORTED, NetError.ERR_UNEXPECTED_PROXY_AUTH, NetError.ERR_EMPTY_RESPONSE, NetError.ERR_RESPONSE_HEADERS_TOO_BIG, NetError.ERR_PAC_SCRIPT_FAILED, NetError.ERR_REQUEST_RANGE_NOT_SATISFIABLE, NetError.ERR_MALFORMED_IDENTITY, NetError.ERR_CONTENT_DECODING_FAILED, NetError.ERR_NETWORK_IO_SUSPENDED, NetError.ERR_SYN_REPLY_NOT_RECEIVED, NetError.ERR_ENCODING_CONVERSION_FAILED, NetError.ERR_UNRECOGNIZED_FTP_DIRECTORY_LISTING_FORMAT, NetError.ERR_NO_SUPPORTED_PROXIES, NetError.ERR_HTTP2_PROTOCOL_ERROR, NetError.ERR_INVALID_AUTH_CREDENTIALS, NetError.ERR_UNSUPPORTED_AUTH_SCHEME, NetError.ERR_ENCODING_DETECTION_FAILED, NetError.ERR_MISSING_AUTH_CREDENTIALS, NetError.ERR_UNEXPECTED_SECURITY_LIBRARY_STATUS, NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, NetError.ERR_UNDOCUMENTED_SECURITY_LIBRARY_STATUS, NetError.ERR_RESPONSE_BODY_TOO_BIG_TO_DRAIN, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH, NetError.ERR_INCOMPLETE_HTTP2_HEADERS, NetError.ERR_PAC_NOT_IN_DHCP, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION, NetError.ERR_HTTP2_SERVER_REFUSED_STREAM, NetError.ERR_HTTP2_PING_FAILED, NetError.ERR_CONTENT_LENGTH_MISMATCH, NetError.ERR_INCOMPLETE_CHUNKED_ENCODING, NetError.ERR_QUIC_PROTOCOL_ERROR, NetError.ERR_RESPONSE_HEADERS_TRUNCATED, NetError.ERR_QUIC_HANDSHAKE_FAILED, NetError.ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY, NetError.ERR_HTTP2_FLOW_CONTROL_ERROR, NetError.ERR_HTTP2_FRAME_SIZE_ERROR, NetError.ERR_HTTP2_COMPRESSION_ERROR, NetError.ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION, NetError.ERR_HTTP_1_1_REQUIRED, NetError.ERR_PROXY_HTTP_1_1_REQUIRED, NetError.ERR_PAC_SCRIPT_TERMINATED, NetError.ERR_INVALID_HTTP_RESPONSE, NetError.ERR_CONTENT_DECODING_INIT_FAILED, NetError.ERR_HTTP2_RST_STREAM_NO_ERROR_RECEIVED, NetError.ERR_HTTP2_PUSHED_STREAM_NOT_AVAILABLE, NetError.ERR_HTTP2_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER, NetError.ERR_TOO_MANY_RETRIES, NetError.ERR_HTTP2_STREAM_CLOSED, NetError.ERR_HTTP2_CLIENT_REFUSED_STREAM, NetError.ERR_HTTP2_PUSHED_RESPONSE_DOES_NOT_MATCH, NetError.ERR_HTTP_RESPONSE_CODE_FAILURE, NetError.ERR_QUIC_CERT_ROOT_NOT_KNOWN, NetError.ERR_CACHE_MISS, NetError.ERR_CACHE_READ_FAILURE, NetError.ERR_CACHE_WRITE_FAILURE, NetError.ERR_CACHE_OPERATION_NOT_SUPPORTED, NetError.ERR_CACHE_OPEN_FAILURE, NetError.ERR_CACHE_CREATE_FAILURE, NetError.ERR_CACHE_RACE, NetError.ERR_CACHE_CHECKSUM_READ_FAILURE, NetError.ERR_CACHE_CHECKSUM_MISMATCH, NetError.ERR_CACHE_LOCK_TIMEOUT, NetError.ERR_CACHE_AUTH_FAILURE_AFTER_READ, NetError.ERR_CACHE_ENTRY_NOT_SUITABLE, NetError.ERR_CACHE_DOOM_FAILURE, NetError.ERR_CACHE_OPEN_OR_CREATE_FAILURE, NetError.ERR_INSECURE_RESPONSE, NetError.ERR_NO_PRIVATE_KEY_FOR_CERT, NetError.ERR_ADD_USER_CERT_FAILED, NetError.ERR_INVALID_SIGNED_EXCHANGE, NetError.ERR_INVALID_WEB_BUNDLE, NetError.ERR_TRUST_TOKEN_OPERATION_FAILED, NetError.ERR_TRUST_TOKEN_OPERATION_CACHE_HIT, NetError.ERR_FTP_FAILED, NetError.ERR_FTP_SERVICE_UNAVAILABLE, NetError.ERR_FTP_TRANSFER_ABORTED, NetError.ERR_FTP_FILE_BUSY, NetError.ERR_FTP_SYNTAX_ERROR, NetError.ERR_FTP_COMMAND_NOT_SUPPORTED, NetError.ERR_FTP_BAD_COMMAND_SEQUENCE, NetError.ERR_PKCS12_IMPORT_BAD_PASSWORD, NetError.ERR_PKCS12_IMPORT_FAILED, NetError.ERR_IMPORT_CA_CERT_NOT_CA, NetError.ERR_IMPORT_CERT_ALREADY_EXISTS, NetError.ERR_IMPORT_CA_CERT_FAILED, NetError.ERR_IMPORT_SERVER_CERT_FAILED, NetError.ERR_PKCS12_IMPORT_INVALID_MAC, NetError.ERR_PKCS12_IMPORT_INVALID_FILE, NetError.ERR_PKCS12_IMPORT_UNSUPPORTED, NetError.ERR_KEY_GENERATION_FAILED, NetError.ERR_PRIVATE_KEY_EXPORT_FAILED, NetError.ERR_SELF_SIGNED_CERT_GENERATION_FAILED, NetError.ERR_CERT_DATABASE_CHANGED, NetError.ERR_DNS_MALFORMED_RESPONSE, NetError.ERR_DNS_SERVER_REQUIRES_TCP, NetError.ERR_DNS_SERVER_FAILED, NetError.ERR_DNS_TIMED_OUT, NetError.ERR_DNS_CACHE_MISS, NetError.ERR_DNS_SEARCH_EMPTY, NetError.ERR_DNS_SORT_ERROR, NetError.ERR_DNS_SECURE_RESOLVER_HOSTNAME_RESOLUTION_FAILED, NetError.OK"
-        errorLine1="                error.errorCode = ErrorCodeConversionHelper.convertErrorCode(error.errorCode);"
-        errorLine2="                                                                             ~~~~~~~~~~~~~~~">
-        <location
-            file="../../android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java"
-            line="337"
-            column="78"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: NetError.ERR_IO_PENDING, NetError.ERR_FAILED, NetError.ERR_ABORTED, NetError.ERR_INVALID_ARGUMENT, NetError.ERR_INVALID_HANDLE, NetError.ERR_FILE_NOT_FOUND, NetError.ERR_TIMED_OUT, NetError.ERR_FILE_TOO_BIG, NetError.ERR_UNEXPECTED, NetError.ERR_ACCESS_DENIED, NetError.ERR_NOT_IMPLEMENTED, NetError.ERR_INSUFFICIENT_RESOURCES, NetError.ERR_OUT_OF_MEMORY, NetError.ERR_UPLOAD_FILE_CHANGED, NetError.ERR_SOCKET_NOT_CONNECTED, NetError.ERR_FILE_EXISTS, NetError.ERR_FILE_PATH_TOO_LONG, NetError.ERR_FILE_NO_SPACE, NetError.ERR_FILE_VIRUS_INFECTED, NetError.ERR_BLOCKED_BY_CLIENT, NetError.ERR_NETWORK_CHANGED, NetError.ERR_BLOCKED_BY_ADMINISTRATOR, NetError.ERR_SOCKET_IS_CONNECTED, NetError.ERR_BLOCKED_ENROLLMENT_CHECK_PENDING, NetError.ERR_UPLOAD_STREAM_REWIND_NOT_SUPPORTED, NetError.ERR_CONTEXT_SHUT_DOWN, NetError.ERR_BLOCKED_BY_RESPONSE, NetError.ERR_CLEARTEXT_NOT_PERMITTED, NetError.ERR_BLOCKED_BY_CSP, NetError.ERR_H2_OR_QUIC_REQUIRED, NetError.ERR_INSECURE_PRIVATE_NETWORK_REQUEST, NetError.ERR_CONNECTION_CLOSED, NetError.ERR_CONNECTION_RESET, NetError.ERR_CONNECTION_REFUSED, NetError.ERR_CONNECTION_ABORTED, NetError.ERR_CONNECTION_FAILED, NetError.ERR_NAME_NOT_RESOLVED, NetError.ERR_INTERNET_DISCONNECTED, NetError.ERR_SSL_PROTOCOL_ERROR, NetError.ERR_ADDRESS_INVALID, NetError.ERR_ADDRESS_UNREACHABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_NEEDED, NetError.ERR_TUNNEL_CONNECTION_FAILED, NetError.ERR_NO_SSL_VERSIONS_ENABLED, NetError.ERR_SSL_VERSION_OR_CIPHER_MISMATCH, NetError.ERR_SSL_RENEGOTIATION_REQUESTED, NetError.ERR_PROXY_AUTH_UNSUPPORTED, NetError.ERR_CERT_ERROR_IN_SSL_RENEGOTIATION, NetError.ERR_BAD_SSL_CLIENT_AUTH_CERT, NetError.ERR_CONNECTION_TIMED_OUT, NetError.ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, NetError.ERR_SOCKS_CONNECTION_FAILED, NetError.ERR_SOCKS_CONNECTION_HOST_UNREACHABLE, NetError.ERR_ALPN_NEGOTIATION_FAILED, NetError.ERR_SSL_NO_RENEGOTIATION, NetError.ERR_WINSOCK_UNEXPECTED_WRITTEN_BYTES, NetError.ERR_SSL_DECOMPRESSION_FAILURE_ALERT, NetError.ERR_SSL_BAD_RECORD_MAC_ALERT, NetError.ERR_PROXY_AUTH_REQUESTED, NetError.ERR_PROXY_CONNECTION_FAILED, NetError.ERR_MANDATORY_PROXY_CONFIGURATION_FAILED, NetError.ERR_PRECONNECT_MAX_SOCKET_LIMIT, NetError.ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED, NetError.ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY, NetError.ERR_PROXY_CERTIFICATE_INVALID, NetError.ERR_NAME_RESOLUTION_FAILED, NetError.ERR_NETWORK_ACCESS_DENIED, NetError.ERR_TEMPORARILY_THROTTLED, NetError.ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT, NetError.ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED, NetError.ERR_MSG_TOO_BIG, NetError.ERR_WS_PROTOCOL_ERROR, NetError.ERR_ADDRESS_IN_USE, NetError.ERR_SSL_HANDSHAKE_NOT_COMPLETED, NetError.ERR_SSL_BAD_PEER_PUBLIC_KEY, NetError.ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN, NetError.ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, NetError.ERR_SSL_DECRYPT_ERROR_ALERT, NetError.ERR_WS_THROTTLE_QUEUE_TOO_LARGE, NetError.ERR_SSL_SERVER_CERT_CHANGED, NetError.ERR_SSL_UNRECOGNIZED_NAME_ALERT, NetError.ERR_SOCKET_SET_RECEIVE_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_SET_SEND_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_RECEIVE_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SOCKET_SEND_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT, NetError.ERR_ICANN_NAME_COLLISION, NetError.ERR_SSL_SERVER_CERT_BAD_FORMAT, NetError.ERR_CT_STH_PARSING_FAILED, NetError.ERR_CT_STH_INCOMPLETE, NetError.ERR_UNABLE_TO_REUSE_CONNECTION_FOR_PROXY_AUTH, NetError.ERR_CT_CONSISTENCY_PROOF_PARSING_FAILED, NetError.ERR_SSL_OBSOLETE_CIPHER, NetError.ERR_WS_UPGRADE, NetError.ERR_READ_IF_READY_NOT_IMPLEMENTED, NetError.ERR_NO_BUFFER_SPACE, NetError.ERR_SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS, NetError.ERR_EARLY_DATA_REJECTED, NetError.ERR_WRONG_VERSION_ON_EARLY_DATA, NetError.ERR_TLS13_DOWNGRADE_DETECTED, NetError.ERR_SSL_KEY_USAGE_INCOMPATIBLE, NetError.ERR_CERT_COMMON_NAME_INVALID, NetError.ERR_CERT_DATE_INVALID, NetError.ERR_CERT_AUTHORITY_INVALID, NetError.ERR_CERT_CONTAINS_ERRORS, NetError.ERR_CERT_NO_REVOCATION_MECHANISM, NetError.ERR_CERT_UNABLE_TO_CHECK_REVOCATION, NetError.ERR_CERT_REVOKED, NetError.ERR_CERT_INVALID, NetError.ERR_CERT_WEAK_SIGNATURE_ALGORITHM, NetError.ERR_CERT_NON_UNIQUE_NAME, NetError.ERR_CERT_WEAK_KEY, NetError.ERR_CERT_NAME_CONSTRAINT_VIOLATION, NetError.ERR_CERT_VALIDITY_TOO_LONG, NetError.ERR_CERTIFICATE_TRANSPARENCY_REQUIRED, NetError.ERR_CERT_SYMANTEC_LEGACY, NetError.ERR_CERT_KNOWN_INTERCEPTION_BLOCKED, NetError.ERR_SSL_OBSOLETE_VERSION, NetError.ERR_CERT_END, NetError.ERR_INVALID_URL, NetError.ERR_DISALLOWED_URL_SCHEME, NetError.ERR_UNKNOWN_URL_SCHEME, NetError.ERR_INVALID_REDIRECT, NetError.ERR_TOO_MANY_REDIRECTS, NetError.ERR_UNSAFE_REDIRECT, NetError.ERR_UNSAFE_PORT, NetError.ERR_INVALID_RESPONSE, NetError.ERR_INVALID_CHUNKED_ENCODING, NetError.ERR_METHOD_NOT_SUPPORTED, NetError.ERR_UNEXPECTED_PROXY_AUTH, NetError.ERR_EMPTY_RESPONSE, NetError.ERR_RESPONSE_HEADERS_TOO_BIG, NetError.ERR_PAC_SCRIPT_FAILED, NetError.ERR_REQUEST_RANGE_NOT_SATISFIABLE, NetError.ERR_MALFORMED_IDENTITY, NetError.ERR_CONTENT_DECODING_FAILED, NetError.ERR_NETWORK_IO_SUSPENDED, NetError.ERR_SYN_REPLY_NOT_RECEIVED, NetError.ERR_ENCODING_CONVERSION_FAILED, NetError.ERR_UNRECOGNIZED_FTP_DIRECTORY_LISTING_FORMAT, NetError.ERR_NO_SUPPORTED_PROXIES, NetError.ERR_HTTP2_PROTOCOL_ERROR, NetError.ERR_INVALID_AUTH_CREDENTIALS, NetError.ERR_UNSUPPORTED_AUTH_SCHEME, NetError.ERR_ENCODING_DETECTION_FAILED, NetError.ERR_MISSING_AUTH_CREDENTIALS, NetError.ERR_UNEXPECTED_SECURITY_LIBRARY_STATUS, NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, NetError.ERR_UNDOCUMENTED_SECURITY_LIBRARY_STATUS, NetError.ERR_RESPONSE_BODY_TOO_BIG_TO_DRAIN, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH, NetError.ERR_INCOMPLETE_HTTP2_HEADERS, NetError.ERR_PAC_NOT_IN_DHCP, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION, NetError.ERR_HTTP2_SERVER_REFUSED_STREAM, NetError.ERR_HTTP2_PING_FAILED, NetError.ERR_CONTENT_LENGTH_MISMATCH, NetError.ERR_INCOMPLETE_CHUNKED_ENCODING, NetError.ERR_QUIC_PROTOCOL_ERROR, NetError.ERR_RESPONSE_HEADERS_TRUNCATED, NetError.ERR_QUIC_HANDSHAKE_FAILED, NetError.ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY, NetError.ERR_HTTP2_FLOW_CONTROL_ERROR, NetError.ERR_HTTP2_FRAME_SIZE_ERROR, NetError.ERR_HTTP2_COMPRESSION_ERROR, NetError.ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION, NetError.ERR_HTTP_1_1_REQUIRED, NetError.ERR_PROXY_HTTP_1_1_REQUIRED, NetError.ERR_PAC_SCRIPT_TERMINATED, NetError.ERR_INVALID_HTTP_RESPONSE, NetError.ERR_CONTENT_DECODING_INIT_FAILED, NetError.ERR_HTTP2_RST_STREAM_NO_ERROR_RECEIVED, NetError.ERR_HTTP2_PUSHED_STREAM_NOT_AVAILABLE, NetError.ERR_HTTP2_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER, NetError.ERR_TOO_MANY_RETRIES, NetError.ERR_HTTP2_STREAM_CLOSED, NetError.ERR_HTTP2_CLIENT_REFUSED_STREAM, NetError.ERR_HTTP2_PUSHED_RESPONSE_DOES_NOT_MATCH, NetError.ERR_HTTP_RESPONSE_CODE_FAILURE, NetError.ERR_QUIC_CERT_ROOT_NOT_KNOWN, NetError.ERR_CACHE_MISS, NetError.ERR_CACHE_READ_FAILURE, NetError.ERR_CACHE_WRITE_FAILURE, NetError.ERR_CACHE_OPERATION_NOT_SUPPORTED, NetError.ERR_CACHE_OPEN_FAILURE, NetError.ERR_CACHE_CREATE_FAILURE, NetError.ERR_CACHE_RACE, NetError.ERR_CACHE_CHECKSUM_READ_FAILURE, NetError.ERR_CACHE_CHECKSUM_MISMATCH, NetError.ERR_CACHE_LOCK_TIMEOUT, NetError.ERR_CACHE_AUTH_FAILURE_AFTER_READ, NetError.ERR_CACHE_ENTRY_NOT_SUITABLE, NetError.ERR_CACHE_DOOM_FAILURE, NetError.ERR_CACHE_OPEN_OR_CREATE_FAILURE, NetError.ERR_INSECURE_RESPONSE, NetError.ERR_NO_PRIVATE_KEY_FOR_CERT, NetError.ERR_ADD_USER_CERT_FAILED, NetError.ERR_INVALID_SIGNED_EXCHANGE, NetError.ERR_INVALID_WEB_BUNDLE, NetError.ERR_TRUST_TOKEN_OPERATION_FAILED, NetError.ERR_TRUST_TOKEN_OPERATION_CACHE_HIT, NetError.ERR_FTP_FAILED, NetError.ERR_FTP_SERVICE_UNAVAILABLE, NetError.ERR_FTP_TRANSFER_ABORTED, NetError.ERR_FTP_FILE_BUSY, NetError.ERR_FTP_SYNTAX_ERROR, NetError.ERR_FTP_COMMAND_NOT_SUPPORTED, NetError.ERR_FTP_BAD_COMMAND_SEQUENCE, NetError.ERR_PKCS12_IMPORT_BAD_PASSWORD, NetError.ERR_PKCS12_IMPORT_FAILED, NetError.ERR_IMPORT_CA_CERT_NOT_CA, NetError.ERR_IMPORT_CERT_ALREADY_EXISTS, NetError.ERR_IMPORT_CA_CERT_FAILED, NetError.ERR_IMPORT_SERVER_CERT_FAILED, NetError.ERR_PKCS12_IMPORT_INVALID_MAC, NetError.ERR_PKCS12_IMPORT_INVALID_FILE, NetError.ERR_PKCS12_IMPORT_UNSUPPORTED, NetError.ERR_KEY_GENERATION_FAILED, NetError.ERR_PRIVATE_KEY_EXPORT_FAILED, NetError.ERR_SELF_SIGNED_CERT_GENERATION_FAILED, NetError.ERR_CERT_DATABASE_CHANGED, NetError.ERR_DNS_MALFORMED_RESPONSE, NetError.ERR_DNS_SERVER_REQUIRES_TCP, NetError.ERR_DNS_SERVER_FAILED, NetError.ERR_DNS_TIMED_OUT, NetError.ERR_DNS_CACHE_MISS, NetError.ERR_DNS_SEARCH_EMPTY, NetError.ERR_DNS_SORT_ERROR, NetError.ERR_DNS_SECURE_RESOLVER_HOSTNAME_RESOLUTION_FAILED, NetError.OK"
-        errorLine1="        if (navigation.errorCode() != 0 &amp;&amp; !navigation.isDownload()) {"
-        errorLine2="                                      ~">
-        <location
-            file="../../android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java"
-            line="102"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: NetworkType.NONE, NetworkType.ANY, NetworkType.UNMETERED"
-        errorLine1="                return -1;"
-        errorLine2="                       ~~">
-        <location
-            file="../../components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskBroadcastReceiver.java"
-            line="202"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: ContentViewRenderView.MODE_SURFACE_VIEW, ContentViewRenderView.MODE_SURFACE_VIEW"
-        errorLine1="        mContentViewRenderView.requestMode(enable ? ContentViewRenderView.MODE_TEXTURE_VIEW"
-        errorLine2="                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../weblayer/browser/java/org/chromium/weblayer_private/BrowserViewController.java"
-            line="305"
-            column="53"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: TabLaunchType.FROM_LINK, TabLaunchType.FROM_EXTERNAL_APP, TabLaunchType.FROM_CHROME_UI, TabLaunchType.FROM_RESTORE, TabLaunchType.FROM_LONGPRESS_FOREGROUND, TabLaunchType.FROM_LONGPRESS_BACKGROUND, TabLaunchType.FROM_REPARENTING, TabLaunchType.FROM_LAUNCHER_SHORTCUT, TabLaunchType.FROM_SPECULATIVE_BACKGROUND_CREATION, TabLaunchType.FROM_BROWSER_ACTIONS, TabLaunchType.FROM_LAUNCH_NEW_INCOGNITO_TAB, TabLaunchType.FROM_STARTUP, TabLaunchType.FROM_START_SURFACE, TabLaunchType.SIZE"
-        errorLine1="                return -1;"
-        errorLine2="                       ~~">
-        <location
-            file="../../chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java"
-            line="281"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: DownloadLaterDialogChoice.DOWNLOAD_NOW, DownloadLaterDialogChoice.ON_WIFI, DownloadLaterDialogChoice.DOWNLOAD_LATER"
-        errorLine1="        recordDialogMetrics(false /*complete*/, -1);"
-        errorLine2="                                                ~~">
-        <location
-            file="../../chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLaterDialogHelper.java"
-            line="123"
-            column="49"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: ErrorType.UNKNOWN, ErrorType.NO_CARDS_ERROR, ErrorType.PAGINATION_ERROR"
-        errorLine1="                raiseErrorOnToken(new ModelError(ErrorType.SYNTHETIC_TOKEN_ERROR,"
-        errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/feedmodelprovider/FeedModelProvider.java"
-            line="902"
-            column="50"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: MediaSessionActionSource.MEDIA_NOTIFICATION, MediaSessionActionSource.MEDIA_SESSION, MediaSessionActionSource.HEADSET_UNPLUG"
-        errorLine1="        return MediaSessionUma.MediaSessionActionSource.NUM_ENTRIES;"
-        errorLine2="               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionHelper.java"
-            line="425"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: ChildType.NONE, ChildType.DEFAULT_CONTENT, ChildType.PERSONALIZED_SIGNIN_PROMO, ChildType.SYNC_PROMO"
-        errorLine1="            return ChildType.PERSONALIZED_SYNC_PROMO;"
-        errorLine2="                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java"
-            line="459"
-            column="20"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: PasswordsState.UNCHECKED, PasswordsState.CHECKING, PasswordsState.SAFE, PasswordsState.COMPROMISED_EXIST, PasswordsState.OFFLINE, PasswordsState.NO_PASSWORDS, PasswordsState.SIGNED_OUT, PasswordsState.QUOTA_LIMIT, PasswordsState.ERROR"
-        errorLine1="        return 0;"
-        errorLine2="               ~">
-        <location
-            file="../../chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckProperties.java"
-            line="76"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: SafeBrowsingState.UNCHECKED, SafeBrowsingState.CHECKING, SafeBrowsingState.ENABLED_STANDARD, SafeBrowsingState.ENABLED_ENHANCED, SafeBrowsingState.DISABLED, SafeBrowsingState.DISABLED_BY_ADMIN, SafeBrowsingState.ERROR"
-        errorLine1="                return 0;"
-        errorLine2="                       ~">
-        <location
-            file="../../chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckProperties.java"
-            line="138"
-            column="24"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: SafeBrowsingState.UNCHECKED, SafeBrowsingState.CHECKING, SafeBrowsingState.ENABLED_STANDARD, SafeBrowsingState.ENABLED_ENHANCED, SafeBrowsingState.DISABLED, SafeBrowsingState.DISABLED_BY_ADMIN, SafeBrowsingState.ERROR"
-        errorLine1="        return 0;"
-        errorLine2="               ~">
-        <location
-            file="../../chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckProperties.java"
-            line="143"
-            column="16"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: TabSwitcherType.GRID, TabSwitcherType.CAROUSEL, TabSwitcherType.SINGLE"
-        errorLine1="                        ? TabSwitcherType.NONE"
-        errorLine2="                          ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../chrome/android/features/start_surface/internal/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java"
-            line="340"
-            column="27"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: ThumbnailFetchingResult.GOT_JPEG, ThumbnailFetchingResult.GOT_ETC1, ThumbnailFetchingResult.GOT_NOTHING"
-        errorLine1="                                    ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG);"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java"
-            line="466"
-            column="37"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: NetError.ERR_IO_PENDING, NetError.ERR_FAILED, NetError.ERR_ABORTED, NetError.ERR_INVALID_ARGUMENT, NetError.ERR_INVALID_HANDLE, NetError.ERR_FILE_NOT_FOUND, NetError.ERR_TIMED_OUT, NetError.ERR_FILE_TOO_BIG, NetError.ERR_UNEXPECTED, NetError.ERR_ACCESS_DENIED, NetError.ERR_NOT_IMPLEMENTED, NetError.ERR_INSUFFICIENT_RESOURCES, NetError.ERR_OUT_OF_MEMORY, NetError.ERR_UPLOAD_FILE_CHANGED, NetError.ERR_SOCKET_NOT_CONNECTED, NetError.ERR_FILE_EXISTS, NetError.ERR_FILE_PATH_TOO_LONG, NetError.ERR_FILE_NO_SPACE, NetError.ERR_FILE_VIRUS_INFECTED, NetError.ERR_BLOCKED_BY_CLIENT, NetError.ERR_NETWORK_CHANGED, NetError.ERR_BLOCKED_BY_ADMINISTRATOR, NetError.ERR_SOCKET_IS_CONNECTED, NetError.ERR_BLOCKED_ENROLLMENT_CHECK_PENDING, NetError.ERR_UPLOAD_STREAM_REWIND_NOT_SUPPORTED, NetError.ERR_CONTEXT_SHUT_DOWN, NetError.ERR_BLOCKED_BY_RESPONSE, NetError.ERR_CLEARTEXT_NOT_PERMITTED, NetError.ERR_BLOCKED_BY_CSP, NetError.ERR_H2_OR_QUIC_REQUIRED, NetError.ERR_INSECURE_PRIVATE_NETWORK_REQUEST, NetError.ERR_CONNECTION_CLOSED, NetError.ERR_CONNECTION_RESET, NetError.ERR_CONNECTION_REFUSED, NetError.ERR_CONNECTION_ABORTED, NetError.ERR_CONNECTION_FAILED, NetError.ERR_NAME_NOT_RESOLVED, NetError.ERR_INTERNET_DISCONNECTED, NetError.ERR_SSL_PROTOCOL_ERROR, NetError.ERR_ADDRESS_INVALID, NetError.ERR_ADDRESS_UNREACHABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_NEEDED, NetError.ERR_TUNNEL_CONNECTION_FAILED, NetError.ERR_NO_SSL_VERSIONS_ENABLED, NetError.ERR_SSL_VERSION_OR_CIPHER_MISMATCH, NetError.ERR_SSL_RENEGOTIATION_REQUESTED, NetError.ERR_PROXY_AUTH_UNSUPPORTED, NetError.ERR_CERT_ERROR_IN_SSL_RENEGOTIATION, NetError.ERR_BAD_SSL_CLIENT_AUTH_CERT, NetError.ERR_CONNECTION_TIMED_OUT, NetError.ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, NetError.ERR_SOCKS_CONNECTION_FAILED, NetError.ERR_SOCKS_CONNECTION_HOST_UNREACHABLE, NetError.ERR_ALPN_NEGOTIATION_FAILED, NetError.ERR_SSL_NO_RENEGOTIATION, NetError.ERR_WINSOCK_UNEXPECTED_WRITTEN_BYTES, NetError.ERR_SSL_DECOMPRESSION_FAILURE_ALERT, NetError.ERR_SSL_BAD_RECORD_MAC_ALERT, NetError.ERR_PROXY_AUTH_REQUESTED, NetError.ERR_PROXY_CONNECTION_FAILED, NetError.ERR_MANDATORY_PROXY_CONFIGURATION_FAILED, NetError.ERR_PRECONNECT_MAX_SOCKET_LIMIT, NetError.ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED, NetError.ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY, NetError.ERR_PROXY_CERTIFICATE_INVALID, NetError.ERR_NAME_RESOLUTION_FAILED, NetError.ERR_NETWORK_ACCESS_DENIED, NetError.ERR_TEMPORARILY_THROTTLED, NetError.ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT, NetError.ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED, NetError.ERR_MSG_TOO_BIG, NetError.ERR_WS_PROTOCOL_ERROR, NetError.ERR_ADDRESS_IN_USE, NetError.ERR_SSL_HANDSHAKE_NOT_COMPLETED, NetError.ERR_SSL_BAD_PEER_PUBLIC_KEY, NetError.ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN, NetError.ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, NetError.ERR_SSL_DECRYPT_ERROR_ALERT, NetError.ERR_WS_THROTTLE_QUEUE_TOO_LARGE, NetError.ERR_SSL_SERVER_CERT_CHANGED, NetError.ERR_SSL_UNRECOGNIZED_NAME_ALERT, NetError.ERR_SOCKET_SET_RECEIVE_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_SET_SEND_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_RECEIVE_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SOCKET_SEND_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT, NetError.ERR_ICANN_NAME_COLLISION, NetError.ERR_SSL_SERVER_CERT_BAD_FORMAT, NetError.ERR_CT_STH_PARSING_FAILED, NetError.ERR_CT_STH_INCOMPLETE, NetError.ERR_UNABLE_TO_REUSE_CONNECTION_FOR_PROXY_AUTH, NetError.ERR_CT_CONSISTENCY_PROOF_PARSING_FAILED, NetError.ERR_SSL_OBSOLETE_CIPHER, NetError.ERR_WS_UPGRADE, NetError.ERR_READ_IF_READY_NOT_IMPLEMENTED, NetError.ERR_NO_BUFFER_SPACE, NetError.ERR_SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS, NetError.ERR_EARLY_DATA_REJECTED, NetError.ERR_WRONG_VERSION_ON_EARLY_DATA, NetError.ERR_TLS13_DOWNGRADE_DETECTED, NetError.ERR_SSL_KEY_USAGE_INCOMPATIBLE, NetError.ERR_CERT_COMMON_NAME_INVALID, NetError.ERR_CERT_DATE_INVALID, NetError.ERR_CERT_AUTHORITY_INVALID, NetError.ERR_CERT_CONTAINS_ERRORS, NetError.ERR_CERT_NO_REVOCATION_MECHANISM, NetError.ERR_CERT_UNABLE_TO_CHECK_REVOCATION, NetError.ERR_CERT_REVOKED, NetError.ERR_CERT_INVALID, NetError.ERR_CERT_WEAK_SIGNATURE_ALGORITHM, NetError.ERR_CERT_NON_UNIQUE_NAME, NetError.ERR_CERT_WEAK_KEY, NetError.ERR_CERT_NAME_CONSTRAINT_VIOLATION, NetError.ERR_CERT_VALIDITY_TOO_LONG, NetError.ERR_CERTIFICATE_TRANSPARENCY_REQUIRED, NetError.ERR_CERT_SYMANTEC_LEGACY, NetError.ERR_CERT_KNOWN_INTERCEPTION_BLOCKED, NetError.ERR_SSL_OBSOLETE_VERSION, NetError.ERR_CERT_END, NetError.ERR_INVALID_URL, NetError.ERR_DISALLOWED_URL_SCHEME, NetError.ERR_UNKNOWN_URL_SCHEME, NetError.ERR_INVALID_REDIRECT, NetError.ERR_TOO_MANY_REDIRECTS, NetError.ERR_UNSAFE_REDIRECT, NetError.ERR_UNSAFE_PORT, NetError.ERR_INVALID_RESPONSE, NetError.ERR_INVALID_CHUNKED_ENCODING, NetError.ERR_METHOD_NOT_SUPPORTED, NetError.ERR_UNEXPECTED_PROXY_AUTH, NetError.ERR_EMPTY_RESPONSE, NetError.ERR_RESPONSE_HEADERS_TOO_BIG, NetError.ERR_PAC_SCRIPT_FAILED, NetError.ERR_REQUEST_RANGE_NOT_SATISFIABLE, NetError.ERR_MALFORMED_IDENTITY, NetError.ERR_CONTENT_DECODING_FAILED, NetError.ERR_NETWORK_IO_SUSPENDED, NetError.ERR_SYN_REPLY_NOT_RECEIVED, NetError.ERR_ENCODING_CONVERSION_FAILED, NetError.ERR_UNRECOGNIZED_FTP_DIRECTORY_LISTING_FORMAT, NetError.ERR_NO_SUPPORTED_PROXIES, NetError.ERR_HTTP2_PROTOCOL_ERROR, NetError.ERR_INVALID_AUTH_CREDENTIALS, NetError.ERR_UNSUPPORTED_AUTH_SCHEME, NetError.ERR_ENCODING_DETECTION_FAILED, NetError.ERR_MISSING_AUTH_CREDENTIALS, NetError.ERR_UNEXPECTED_SECURITY_LIBRARY_STATUS, NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, NetError.ERR_UNDOCUMENTED_SECURITY_LIBRARY_STATUS, NetError.ERR_RESPONSE_BODY_TOO_BIG_TO_DRAIN, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH, NetError.ERR_INCOMPLETE_HTTP2_HEADERS, NetError.ERR_PAC_NOT_IN_DHCP, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION, NetError.ERR_HTTP2_SERVER_REFUSED_STREAM, NetError.ERR_HTTP2_PING_FAILED, NetError.ERR_CONTENT_LENGTH_MISMATCH, NetError.ERR_INCOMPLETE_CHUNKED_ENCODING, NetError.ERR_QUIC_PROTOCOL_ERROR, NetError.ERR_RESPONSE_HEADERS_TRUNCATED, NetError.ERR_QUIC_HANDSHAKE_FAILED, NetError.ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY, NetError.ERR_HTTP2_FLOW_CONTROL_ERROR, NetError.ERR_HTTP2_FRAME_SIZE_ERROR, NetError.ERR_HTTP2_COMPRESSION_ERROR, NetError.ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION, NetError.ERR_HTTP_1_1_REQUIRED, NetError.ERR_PROXY_HTTP_1_1_REQUIRED, NetError.ERR_PAC_SCRIPT_TERMINATED, NetError.ERR_INVALID_HTTP_RESPONSE, NetError.ERR_CONTENT_DECODING_INIT_FAILED, NetError.ERR_HTTP2_RST_STREAM_NO_ERROR_RECEIVED, NetError.ERR_HTTP2_PUSHED_STREAM_NOT_AVAILABLE, NetError.ERR_HTTP2_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER, NetError.ERR_TOO_MANY_RETRIES, NetError.ERR_HTTP2_STREAM_CLOSED, NetError.ERR_HTTP2_CLIENT_REFUSED_STREAM, NetError.ERR_HTTP2_PUSHED_RESPONSE_DOES_NOT_MATCH, NetError.ERR_HTTP_RESPONSE_CODE_FAILURE, NetError.ERR_QUIC_CERT_ROOT_NOT_KNOWN, NetError.ERR_CACHE_MISS, NetError.ERR_CACHE_READ_FAILURE, NetError.ERR_CACHE_WRITE_FAILURE, NetError.ERR_CACHE_OPERATION_NOT_SUPPORTED, NetError.ERR_CACHE_OPEN_FAILURE, NetError.ERR_CACHE_CREATE_FAILURE, NetError.ERR_CACHE_RACE, NetError.ERR_CACHE_CHECKSUM_READ_FAILURE, NetError.ERR_CACHE_CHECKSUM_MISMATCH, NetError.ERR_CACHE_LOCK_TIMEOUT, NetError.ERR_CACHE_AUTH_FAILURE_AFTER_READ, NetError.ERR_CACHE_ENTRY_NOT_SUITABLE, NetError.ERR_CACHE_DOOM_FAILURE, NetError.ERR_CACHE_OPEN_OR_CREATE_FAILURE, NetError.ERR_INSECURE_RESPONSE, NetError.ERR_NO_PRIVATE_KEY_FOR_CERT, NetError.ERR_ADD_USER_CERT_FAILED, NetError.ERR_INVALID_SIGNED_EXCHANGE, NetError.ERR_INVALID_WEB_BUNDLE, NetError.ERR_TRUST_TOKEN_OPERATION_FAILED, NetError.ERR_TRUST_TOKEN_OPERATION_CACHE_HIT, NetError.ERR_FTP_FAILED, NetError.ERR_FTP_SERVICE_UNAVAILABLE, NetError.ERR_FTP_TRANSFER_ABORTED, NetError.ERR_FTP_FILE_BUSY, NetError.ERR_FTP_SYNTAX_ERROR, NetError.ERR_FTP_COMMAND_NOT_SUPPORTED, NetError.ERR_FTP_BAD_COMMAND_SEQUENCE, NetError.ERR_PKCS12_IMPORT_BAD_PASSWORD, NetError.ERR_PKCS12_IMPORT_FAILED, NetError.ERR_IMPORT_CA_CERT_NOT_CA, NetError.ERR_IMPORT_CERT_ALREADY_EXISTS, NetError.ERR_IMPORT_CA_CERT_FAILED, NetError.ERR_IMPORT_SERVER_CERT_FAILED, NetError.ERR_PKCS12_IMPORT_INVALID_MAC, NetError.ERR_PKCS12_IMPORT_INVALID_FILE, NetError.ERR_PKCS12_IMPORT_UNSUPPORTED, NetError.ERR_KEY_GENERATION_FAILED, NetError.ERR_PRIVATE_KEY_EXPORT_FAILED, NetError.ERR_SELF_SIGNED_CERT_GENERATION_FAILED, NetError.ERR_CERT_DATABASE_CHANGED, NetError.ERR_DNS_MALFORMED_RESPONSE, NetError.ERR_DNS_SERVER_REQUIRES_TCP, NetError.ERR_DNS_SERVER_FAILED, NetError.ERR_DNS_TIMED_OUT, NetError.ERR_DNS_CACHE_MISS, NetError.ERR_DNS_SEARCH_EMPTY, NetError.ERR_DNS_SORT_ERROR, NetError.ERR_DNS_SECURE_RESOLVER_HOSTNAME_RESOLUTION_FAILED, NetError.OK"
-        errorLine1="        if (navigation.errorCode() != 0) updateIfNeeded(true);"
-        errorLine2="                                      ~">
-        <location
-            file="../../chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java"
-            line="243"
-            column="39"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: NetError.ERR_IO_PENDING, NetError.ERR_FAILED, NetError.ERR_ABORTED, NetError.ERR_INVALID_ARGUMENT, NetError.ERR_INVALID_HANDLE, NetError.ERR_FILE_NOT_FOUND, NetError.ERR_TIMED_OUT, NetError.ERR_FILE_TOO_BIG, NetError.ERR_UNEXPECTED, NetError.ERR_ACCESS_DENIED, NetError.ERR_NOT_IMPLEMENTED, NetError.ERR_INSUFFICIENT_RESOURCES, NetError.ERR_OUT_OF_MEMORY, NetError.ERR_UPLOAD_FILE_CHANGED, NetError.ERR_SOCKET_NOT_CONNECTED, NetError.ERR_FILE_EXISTS, NetError.ERR_FILE_PATH_TOO_LONG, NetError.ERR_FILE_NO_SPACE, NetError.ERR_FILE_VIRUS_INFECTED, NetError.ERR_BLOCKED_BY_CLIENT, NetError.ERR_NETWORK_CHANGED, NetError.ERR_BLOCKED_BY_ADMINISTRATOR, NetError.ERR_SOCKET_IS_CONNECTED, NetError.ERR_BLOCKED_ENROLLMENT_CHECK_PENDING, NetError.ERR_UPLOAD_STREAM_REWIND_NOT_SUPPORTED, NetError.ERR_CONTEXT_SHUT_DOWN, NetError.ERR_BLOCKED_BY_RESPONSE, NetError.ERR_CLEARTEXT_NOT_PERMITTED, NetError.ERR_BLOCKED_BY_CSP, NetError.ERR_H2_OR_QUIC_REQUIRED, NetError.ERR_INSECURE_PRIVATE_NETWORK_REQUEST, NetError.ERR_CONNECTION_CLOSED, NetError.ERR_CONNECTION_RESET, NetError.ERR_CONNECTION_REFUSED, NetError.ERR_CONNECTION_ABORTED, NetError.ERR_CONNECTION_FAILED, NetError.ERR_NAME_NOT_RESOLVED, NetError.ERR_INTERNET_DISCONNECTED, NetError.ERR_SSL_PROTOCOL_ERROR, NetError.ERR_ADDRESS_INVALID, NetError.ERR_ADDRESS_UNREACHABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_NEEDED, NetError.ERR_TUNNEL_CONNECTION_FAILED, NetError.ERR_NO_SSL_VERSIONS_ENABLED, NetError.ERR_SSL_VERSION_OR_CIPHER_MISMATCH, NetError.ERR_SSL_RENEGOTIATION_REQUESTED, NetError.ERR_PROXY_AUTH_UNSUPPORTED, NetError.ERR_CERT_ERROR_IN_SSL_RENEGOTIATION, NetError.ERR_BAD_SSL_CLIENT_AUTH_CERT, NetError.ERR_CONNECTION_TIMED_OUT, NetError.ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, NetError.ERR_SOCKS_CONNECTION_FAILED, NetError.ERR_SOCKS_CONNECTION_HOST_UNREACHABLE, NetError.ERR_ALPN_NEGOTIATION_FAILED, NetError.ERR_SSL_NO_RENEGOTIATION, NetError.ERR_WINSOCK_UNEXPECTED_WRITTEN_BYTES, NetError.ERR_SSL_DECOMPRESSION_FAILURE_ALERT, NetError.ERR_SSL_BAD_RECORD_MAC_ALERT, NetError.ERR_PROXY_AUTH_REQUESTED, NetError.ERR_PROXY_CONNECTION_FAILED, NetError.ERR_MANDATORY_PROXY_CONFIGURATION_FAILED, NetError.ERR_PRECONNECT_MAX_SOCKET_LIMIT, NetError.ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED, NetError.ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY, NetError.ERR_PROXY_CERTIFICATE_INVALID, NetError.ERR_NAME_RESOLUTION_FAILED, NetError.ERR_NETWORK_ACCESS_DENIED, NetError.ERR_TEMPORARILY_THROTTLED, NetError.ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT, NetError.ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED, NetError.ERR_MSG_TOO_BIG, NetError.ERR_WS_PROTOCOL_ERROR, NetError.ERR_ADDRESS_IN_USE, NetError.ERR_SSL_HANDSHAKE_NOT_COMPLETED, NetError.ERR_SSL_BAD_PEER_PUBLIC_KEY, NetError.ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN, NetError.ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, NetError.ERR_SSL_DECRYPT_ERROR_ALERT, NetError.ERR_WS_THROTTLE_QUEUE_TOO_LARGE, NetError.ERR_SSL_SERVER_CERT_CHANGED, NetError.ERR_SSL_UNRECOGNIZED_NAME_ALERT, NetError.ERR_SOCKET_SET_RECEIVE_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_SET_SEND_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_RECEIVE_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SOCKET_SEND_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT, NetError.ERR_ICANN_NAME_COLLISION, NetError.ERR_SSL_SERVER_CERT_BAD_FORMAT, NetError.ERR_CT_STH_PARSING_FAILED, NetError.ERR_CT_STH_INCOMPLETE, NetError.ERR_UNABLE_TO_REUSE_CONNECTION_FOR_PROXY_AUTH, NetError.ERR_CT_CONSISTENCY_PROOF_PARSING_FAILED, NetError.ERR_SSL_OBSOLETE_CIPHER, NetError.ERR_WS_UPGRADE, NetError.ERR_READ_IF_READY_NOT_IMPLEMENTED, NetError.ERR_NO_BUFFER_SPACE, NetError.ERR_SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS, NetError.ERR_EARLY_DATA_REJECTED, NetError.ERR_WRONG_VERSION_ON_EARLY_DATA, NetError.ERR_TLS13_DOWNGRADE_DETECTED, NetError.ERR_SSL_KEY_USAGE_INCOMPATIBLE, NetError.ERR_CERT_COMMON_NAME_INVALID, NetError.ERR_CERT_DATE_INVALID, NetError.ERR_CERT_AUTHORITY_INVALID, NetError.ERR_CERT_CONTAINS_ERRORS, NetError.ERR_CERT_NO_REVOCATION_MECHANISM, NetError.ERR_CERT_UNABLE_TO_CHECK_REVOCATION, NetError.ERR_CERT_REVOKED, NetError.ERR_CERT_INVALID, NetError.ERR_CERT_WEAK_SIGNATURE_ALGORITHM, NetError.ERR_CERT_NON_UNIQUE_NAME, NetError.ERR_CERT_WEAK_KEY, NetError.ERR_CERT_NAME_CONSTRAINT_VIOLATION, NetError.ERR_CERT_VALIDITY_TOO_LONG, NetError.ERR_CERTIFICATE_TRANSPARENCY_REQUIRED, NetError.ERR_CERT_SYMANTEC_LEGACY, NetError.ERR_CERT_KNOWN_INTERCEPTION_BLOCKED, NetError.ERR_SSL_OBSOLETE_VERSION, NetError.ERR_CERT_END, NetError.ERR_INVALID_URL, NetError.ERR_DISALLOWED_URL_SCHEME, NetError.ERR_UNKNOWN_URL_SCHEME, NetError.ERR_INVALID_REDIRECT, NetError.ERR_TOO_MANY_REDIRECTS, NetError.ERR_UNSAFE_REDIRECT, NetError.ERR_UNSAFE_PORT, NetError.ERR_INVALID_RESPONSE, NetError.ERR_INVALID_CHUNKED_ENCODING, NetError.ERR_METHOD_NOT_SUPPORTED, NetError.ERR_UNEXPECTED_PROXY_AUTH, NetError.ERR_EMPTY_RESPONSE, NetError.ERR_RESPONSE_HEADERS_TOO_BIG, NetError.ERR_PAC_SCRIPT_FAILED, NetError.ERR_REQUEST_RANGE_NOT_SATISFIABLE, NetError.ERR_MALFORMED_IDENTITY, NetError.ERR_CONTENT_DECODING_FAILED, NetError.ERR_NETWORK_IO_SUSPENDED, NetError.ERR_SYN_REPLY_NOT_RECEIVED, NetError.ERR_ENCODING_CONVERSION_FAILED, NetError.ERR_UNRECOGNIZED_FTP_DIRECTORY_LISTING_FORMAT, NetError.ERR_NO_SUPPORTED_PROXIES, NetError.ERR_HTTP2_PROTOCOL_ERROR, NetError.ERR_INVALID_AUTH_CREDENTIALS, NetError.ERR_UNSUPPORTED_AUTH_SCHEME, NetError.ERR_ENCODING_DETECTION_FAILED, NetError.ERR_MISSING_AUTH_CREDENTIALS, NetError.ERR_UNEXPECTED_SECURITY_LIBRARY_STATUS, NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, NetError.ERR_UNDOCUMENTED_SECURITY_LIBRARY_STATUS, NetError.ERR_RESPONSE_BODY_TOO_BIG_TO_DRAIN, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH, NetError.ERR_INCOMPLETE_HTTP2_HEADERS, NetError.ERR_PAC_NOT_IN_DHCP, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION, NetError.ERR_HTTP2_SERVER_REFUSED_STREAM, NetError.ERR_HTTP2_PING_FAILED, NetError.ERR_CONTENT_LENGTH_MISMATCH, NetError.ERR_INCOMPLETE_CHUNKED_ENCODING, NetError.ERR_QUIC_PROTOCOL_ERROR, NetError.ERR_RESPONSE_HEADERS_TRUNCATED, NetError.ERR_QUIC_HANDSHAKE_FAILED, NetError.ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY, NetError.ERR_HTTP2_FLOW_CONTROL_ERROR, NetError.ERR_HTTP2_FRAME_SIZE_ERROR, NetError.ERR_HTTP2_COMPRESSION_ERROR, NetError.ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION, NetError.ERR_HTTP_1_1_REQUIRED, NetError.ERR_PROXY_HTTP_1_1_REQUIRED, NetError.ERR_PAC_SCRIPT_TERMINATED, NetError.ERR_INVALID_HTTP_RESPONSE, NetError.ERR_CONTENT_DECODING_INIT_FAILED, NetError.ERR_HTTP2_RST_STREAM_NO_ERROR_RECEIVED, NetError.ERR_HTTP2_PUSHED_STREAM_NOT_AVAILABLE, NetError.ERR_HTTP2_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER, NetError.ERR_TOO_MANY_RETRIES, NetError.ERR_HTTP2_STREAM_CLOSED, NetError.ERR_HTTP2_CLIENT_REFUSED_STREAM, NetError.ERR_HTTP2_PUSHED_RESPONSE_DOES_NOT_MATCH, NetError.ERR_HTTP_RESPONSE_CODE_FAILURE, NetError.ERR_QUIC_CERT_ROOT_NOT_KNOWN, NetError.ERR_CACHE_MISS, NetError.ERR_CACHE_READ_FAILURE, NetError.ERR_CACHE_WRITE_FAILURE, NetError.ERR_CACHE_OPERATION_NOT_SUPPORTED, NetError.ERR_CACHE_OPEN_FAILURE, NetError.ERR_CACHE_CREATE_FAILURE, NetError.ERR_CACHE_RACE, NetError.ERR_CACHE_CHECKSUM_READ_FAILURE, NetError.ERR_CACHE_CHECKSUM_MISMATCH, NetError.ERR_CACHE_LOCK_TIMEOUT, NetError.ERR_CACHE_AUTH_FAILURE_AFTER_READ, NetError.ERR_CACHE_ENTRY_NOT_SUITABLE, NetError.ERR_CACHE_DOOM_FAILURE, NetError.ERR_CACHE_OPEN_OR_CREATE_FAILURE, NetError.ERR_INSECURE_RESPONSE, NetError.ERR_NO_PRIVATE_KEY_FOR_CERT, NetError.ERR_ADD_USER_CERT_FAILED, NetError.ERR_INVALID_SIGNED_EXCHANGE, NetError.ERR_INVALID_WEB_BUNDLE, NetError.ERR_TRUST_TOKEN_OPERATION_FAILED, NetError.ERR_TRUST_TOKEN_OPERATION_CACHE_HIT, NetError.ERR_FTP_FAILED, NetError.ERR_FTP_SERVICE_UNAVAILABLE, NetError.ERR_FTP_TRANSFER_ABORTED, NetError.ERR_FTP_FILE_BUSY, NetError.ERR_FTP_SYNTAX_ERROR, NetError.ERR_FTP_COMMAND_NOT_SUPPORTED, NetError.ERR_FTP_BAD_COMMAND_SEQUENCE, NetError.ERR_PKCS12_IMPORT_BAD_PASSWORD, NetError.ERR_PKCS12_IMPORT_FAILED, NetError.ERR_IMPORT_CA_CERT_NOT_CA, NetError.ERR_IMPORT_CERT_ALREADY_EXISTS, NetError.ERR_IMPORT_CA_CERT_FAILED, NetError.ERR_IMPORT_SERVER_CERT_FAILED, NetError.ERR_PKCS12_IMPORT_INVALID_MAC, NetError.ERR_PKCS12_IMPORT_INVALID_FILE, NetError.ERR_PKCS12_IMPORT_UNSUPPORTED, NetError.ERR_KEY_GENERATION_FAILED, NetError.ERR_PRIVATE_KEY_EXPORT_FAILED, NetError.ERR_SELF_SIGNED_CERT_GENERATION_FAILED, NetError.ERR_CERT_DATABASE_CHANGED, NetError.ERR_DNS_MALFORMED_RESPONSE, NetError.ERR_DNS_SERVER_REQUIRES_TCP, NetError.ERR_DNS_SERVER_FAILED, NetError.ERR_DNS_TIMED_OUT, NetError.ERR_DNS_CACHE_MISS, NetError.ERR_DNS_SEARCH_EMPTY, NetError.ERR_DNS_SORT_ERROR, NetError.ERR_DNS_SECURE_RESOLVER_HOSTNAME_RESOLUTION_FAILED, NetError.OK"
-        errorLine1="            recordTabRestoreResult(true, restoreTime, perceivedRestoreTime, -1);"
-        errorLine2="                                                                            ~~">
-        <location
-            file="../../chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java"
-            line="273"
-            column="77"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: NetError.ERR_IO_PENDING, NetError.ERR_FAILED, NetError.ERR_ABORTED, NetError.ERR_INVALID_ARGUMENT, NetError.ERR_INVALID_HANDLE, NetError.ERR_FILE_NOT_FOUND, NetError.ERR_TIMED_OUT, NetError.ERR_FILE_TOO_BIG, NetError.ERR_UNEXPECTED, NetError.ERR_ACCESS_DENIED, NetError.ERR_NOT_IMPLEMENTED, NetError.ERR_INSUFFICIENT_RESOURCES, NetError.ERR_OUT_OF_MEMORY, NetError.ERR_UPLOAD_FILE_CHANGED, NetError.ERR_SOCKET_NOT_CONNECTED, NetError.ERR_FILE_EXISTS, NetError.ERR_FILE_PATH_TOO_LONG, NetError.ERR_FILE_NO_SPACE, NetError.ERR_FILE_VIRUS_INFECTED, NetError.ERR_BLOCKED_BY_CLIENT, NetError.ERR_NETWORK_CHANGED, NetError.ERR_BLOCKED_BY_ADMINISTRATOR, NetError.ERR_SOCKET_IS_CONNECTED, NetError.ERR_BLOCKED_ENROLLMENT_CHECK_PENDING, NetError.ERR_UPLOAD_STREAM_REWIND_NOT_SUPPORTED, NetError.ERR_CONTEXT_SHUT_DOWN, NetError.ERR_BLOCKED_BY_RESPONSE, NetError.ERR_CLEARTEXT_NOT_PERMITTED, NetError.ERR_BLOCKED_BY_CSP, NetError.ERR_H2_OR_QUIC_REQUIRED, NetError.ERR_INSECURE_PRIVATE_NETWORK_REQUEST, NetError.ERR_CONNECTION_CLOSED, NetError.ERR_CONNECTION_RESET, NetError.ERR_CONNECTION_REFUSED, NetError.ERR_CONNECTION_ABORTED, NetError.ERR_CONNECTION_FAILED, NetError.ERR_NAME_NOT_RESOLVED, NetError.ERR_INTERNET_DISCONNECTED, NetError.ERR_SSL_PROTOCOL_ERROR, NetError.ERR_ADDRESS_INVALID, NetError.ERR_ADDRESS_UNREACHABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_NEEDED, NetError.ERR_TUNNEL_CONNECTION_FAILED, NetError.ERR_NO_SSL_VERSIONS_ENABLED, NetError.ERR_SSL_VERSION_OR_CIPHER_MISMATCH, NetError.ERR_SSL_RENEGOTIATION_REQUESTED, NetError.ERR_PROXY_AUTH_UNSUPPORTED, NetError.ERR_CERT_ERROR_IN_SSL_RENEGOTIATION, NetError.ERR_BAD_SSL_CLIENT_AUTH_CERT, NetError.ERR_CONNECTION_TIMED_OUT, NetError.ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, NetError.ERR_SOCKS_CONNECTION_FAILED, NetError.ERR_SOCKS_CONNECTION_HOST_UNREACHABLE, NetError.ERR_ALPN_NEGOTIATION_FAILED, NetError.ERR_SSL_NO_RENEGOTIATION, NetError.ERR_WINSOCK_UNEXPECTED_WRITTEN_BYTES, NetError.ERR_SSL_DECOMPRESSION_FAILURE_ALERT, NetError.ERR_SSL_BAD_RECORD_MAC_ALERT, NetError.ERR_PROXY_AUTH_REQUESTED, NetError.ERR_PROXY_CONNECTION_FAILED, NetError.ERR_MANDATORY_PROXY_CONFIGURATION_FAILED, NetError.ERR_PRECONNECT_MAX_SOCKET_LIMIT, NetError.ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED, NetError.ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY, NetError.ERR_PROXY_CERTIFICATE_INVALID, NetError.ERR_NAME_RESOLUTION_FAILED, NetError.ERR_NETWORK_ACCESS_DENIED, NetError.ERR_TEMPORARILY_THROTTLED, NetError.ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT, NetError.ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED, NetError.ERR_MSG_TOO_BIG, NetError.ERR_WS_PROTOCOL_ERROR, NetError.ERR_ADDRESS_IN_USE, NetError.ERR_SSL_HANDSHAKE_NOT_COMPLETED, NetError.ERR_SSL_BAD_PEER_PUBLIC_KEY, NetError.ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN, NetError.ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, NetError.ERR_SSL_DECRYPT_ERROR_ALERT, NetError.ERR_WS_THROTTLE_QUEUE_TOO_LARGE, NetError.ERR_SSL_SERVER_CERT_CHANGED, NetError.ERR_SSL_UNRECOGNIZED_NAME_ALERT, NetError.ERR_SOCKET_SET_RECEIVE_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_SET_SEND_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_RECEIVE_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SOCKET_SEND_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT, NetError.ERR_ICANN_NAME_COLLISION, NetError.ERR_SSL_SERVER_CERT_BAD_FORMAT, NetError.ERR_CT_STH_PARSING_FAILED, NetError.ERR_CT_STH_INCOMPLETE, NetError.ERR_UNABLE_TO_REUSE_CONNECTION_FOR_PROXY_AUTH, NetError.ERR_CT_CONSISTENCY_PROOF_PARSING_FAILED, NetError.ERR_SSL_OBSOLETE_CIPHER, NetError.ERR_WS_UPGRADE, NetError.ERR_READ_IF_READY_NOT_IMPLEMENTED, NetError.ERR_NO_BUFFER_SPACE, NetError.ERR_SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS, NetError.ERR_EARLY_DATA_REJECTED, NetError.ERR_WRONG_VERSION_ON_EARLY_DATA, NetError.ERR_TLS13_DOWNGRADE_DETECTED, NetError.ERR_SSL_KEY_USAGE_INCOMPATIBLE, NetError.ERR_CERT_COMMON_NAME_INVALID, NetError.ERR_CERT_DATE_INVALID, NetError.ERR_CERT_AUTHORITY_INVALID, NetError.ERR_CERT_CONTAINS_ERRORS, NetError.ERR_CERT_NO_REVOCATION_MECHANISM, NetError.ERR_CERT_UNABLE_TO_CHECK_REVOCATION, NetError.ERR_CERT_REVOKED, NetError.ERR_CERT_INVALID, NetError.ERR_CERT_WEAK_SIGNATURE_ALGORITHM, NetError.ERR_CERT_NON_UNIQUE_NAME, NetError.ERR_CERT_WEAK_KEY, NetError.ERR_CERT_NAME_CONSTRAINT_VIOLATION, NetError.ERR_CERT_VALIDITY_TOO_LONG, NetError.ERR_CERTIFICATE_TRANSPARENCY_REQUIRED, NetError.ERR_CERT_SYMANTEC_LEGACY, NetError.ERR_CERT_KNOWN_INTERCEPTION_BLOCKED, NetError.ERR_SSL_OBSOLETE_VERSION, NetError.ERR_CERT_END, NetError.ERR_INVALID_URL, NetError.ERR_DISALLOWED_URL_SCHEME, NetError.ERR_UNKNOWN_URL_SCHEME, NetError.ERR_INVALID_REDIRECT, NetError.ERR_TOO_MANY_REDIRECTS, NetError.ERR_UNSAFE_REDIRECT, NetError.ERR_UNSAFE_PORT, NetError.ERR_INVALID_RESPONSE, NetError.ERR_INVALID_CHUNKED_ENCODING, NetError.ERR_METHOD_NOT_SUPPORTED, NetError.ERR_UNEXPECTED_PROXY_AUTH, NetError.ERR_EMPTY_RESPONSE, NetError.ERR_RESPONSE_HEADERS_TOO_BIG, NetError.ERR_PAC_SCRIPT_FAILED, NetError.ERR_REQUEST_RANGE_NOT_SATISFIABLE, NetError.ERR_MALFORMED_IDENTITY, NetError.ERR_CONTENT_DECODING_FAILED, NetError.ERR_NETWORK_IO_SUSPENDED, NetError.ERR_SYN_REPLY_NOT_RECEIVED, NetError.ERR_ENCODING_CONVERSION_FAILED, NetError.ERR_UNRECOGNIZED_FTP_DIRECTORY_LISTING_FORMAT, NetError.ERR_NO_SUPPORTED_PROXIES, NetError.ERR_HTTP2_PROTOCOL_ERROR, NetError.ERR_INVALID_AUTH_CREDENTIALS, NetError.ERR_UNSUPPORTED_AUTH_SCHEME, NetError.ERR_ENCODING_DETECTION_FAILED, NetError.ERR_MISSING_AUTH_CREDENTIALS, NetError.ERR_UNEXPECTED_SECURITY_LIBRARY_STATUS, NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, NetError.ERR_UNDOCUMENTED_SECURITY_LIBRARY_STATUS, NetError.ERR_RESPONSE_BODY_TOO_BIG_TO_DRAIN, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH, NetError.ERR_INCOMPLETE_HTTP2_HEADERS, NetError.ERR_PAC_NOT_IN_DHCP, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION, NetError.ERR_HTTP2_SERVER_REFUSED_STREAM, NetError.ERR_HTTP2_PING_FAILED, NetError.ERR_CONTENT_LENGTH_MISMATCH, NetError.ERR_INCOMPLETE_CHUNKED_ENCODING, NetError.ERR_QUIC_PROTOCOL_ERROR, NetError.ERR_RESPONSE_HEADERS_TRUNCATED, NetError.ERR_QUIC_HANDSHAKE_FAILED, NetError.ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY, NetError.ERR_HTTP2_FLOW_CONTROL_ERROR, NetError.ERR_HTTP2_FRAME_SIZE_ERROR, NetError.ERR_HTTP2_COMPRESSION_ERROR, NetError.ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION, NetError.ERR_HTTP_1_1_REQUIRED, NetError.ERR_PROXY_HTTP_1_1_REQUIRED, NetError.ERR_PAC_SCRIPT_TERMINATED, NetError.ERR_INVALID_HTTP_RESPONSE, NetError.ERR_CONTENT_DECODING_INIT_FAILED, NetError.ERR_HTTP2_RST_STREAM_NO_ERROR_RECEIVED, NetError.ERR_HTTP2_PUSHED_STREAM_NOT_AVAILABLE, NetError.ERR_HTTP2_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER, NetError.ERR_TOO_MANY_RETRIES, NetError.ERR_HTTP2_STREAM_CLOSED, NetError.ERR_HTTP2_CLIENT_REFUSED_STREAM, NetError.ERR_HTTP2_PUSHED_RESPONSE_DOES_NOT_MATCH, NetError.ERR_HTTP_RESPONSE_CODE_FAILURE, NetError.ERR_QUIC_CERT_ROOT_NOT_KNOWN, NetError.ERR_CACHE_MISS, NetError.ERR_CACHE_READ_FAILURE, NetError.ERR_CACHE_WRITE_FAILURE, NetError.ERR_CACHE_OPERATION_NOT_SUPPORTED, NetError.ERR_CACHE_OPEN_FAILURE, NetError.ERR_CACHE_CREATE_FAILURE, NetError.ERR_CACHE_RACE, NetError.ERR_CACHE_CHECKSUM_READ_FAILURE, NetError.ERR_CACHE_CHECKSUM_MISMATCH, NetError.ERR_CACHE_LOCK_TIMEOUT, NetError.ERR_CACHE_AUTH_FAILURE_AFTER_READ, NetError.ERR_CACHE_ENTRY_NOT_SUITABLE, NetError.ERR_CACHE_DOOM_FAILURE, NetError.ERR_CACHE_OPEN_OR_CREATE_FAILURE, NetError.ERR_INSECURE_RESPONSE, NetError.ERR_NO_PRIVATE_KEY_FOR_CERT, NetError.ERR_ADD_USER_CERT_FAILED, NetError.ERR_INVALID_SIGNED_EXCHANGE, NetError.ERR_INVALID_WEB_BUNDLE, NetError.ERR_TRUST_TOKEN_OPERATION_FAILED, NetError.ERR_TRUST_TOKEN_OPERATION_CACHE_HIT, NetError.ERR_FTP_FAILED, NetError.ERR_FTP_SERVICE_UNAVAILABLE, NetError.ERR_FTP_TRANSFER_ABORTED, NetError.ERR_FTP_FILE_BUSY, NetError.ERR_FTP_SYNTAX_ERROR, NetError.ERR_FTP_COMMAND_NOT_SUPPORTED, NetError.ERR_FTP_BAD_COMMAND_SEQUENCE, NetError.ERR_PKCS12_IMPORT_BAD_PASSWORD, NetError.ERR_PKCS12_IMPORT_FAILED, NetError.ERR_IMPORT_CA_CERT_NOT_CA, NetError.ERR_IMPORT_CERT_ALREADY_EXISTS, NetError.ERR_IMPORT_CA_CERT_FAILED, NetError.ERR_IMPORT_SERVER_CERT_FAILED, NetError.ERR_PKCS12_IMPORT_INVALID_MAC, NetError.ERR_PKCS12_IMPORT_INVALID_FILE, NetError.ERR_PKCS12_IMPORT_UNSUPPORTED, NetError.ERR_KEY_GENERATION_FAILED, NetError.ERR_PRIVATE_KEY_EXPORT_FAILED, NetError.ERR_SELF_SIGNED_CERT_GENERATION_FAILED, NetError.ERR_CERT_DATABASE_CHANGED, NetError.ERR_DNS_MALFORMED_RESPONSE, NetError.ERR_DNS_SERVER_REQUIRES_TCP, NetError.ERR_DNS_SERVER_FAILED, NetError.ERR_DNS_TIMED_OUT, NetError.ERR_DNS_CACHE_MISS, NetError.ERR_DNS_SEARCH_EMPTY, NetError.ERR_DNS_SORT_ERROR, NetError.ERR_DNS_SECURE_RESOLVER_HOSTNAME_RESOLUTION_FAILED, NetError.OK"
-        errorLine1="            if (navigation.errorCode() != 0) {"
-        errorLine2="                                          ~">
-        <location
-            file="../../chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java"
-            line="292"
-            column="43"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: TestCase.EXECUTE_JAVA, TestCase.EXECUTE_NATIVE"
-        errorLine1="        showDoneDialog(activity, TestCase.LOAD_JAVA_RESOURCE, result);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../chrome/browser/test_dummy/internal/android/java/src/org/chromium/chrome/browser/test_dummy/TestDummyImpl.java"
-            line="100"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: TestCase.EXECUTE_JAVA, TestCase.EXECUTE_NATIVE"
-        errorLine1="        showDoneDialog(activity, TestCase.LOAD_NATIVE_RESOURCE, result);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../chrome/browser/test_dummy/internal/android/java/src/org/chromium/chrome/browser/test_dummy/TestDummyImpl.java"
-            line="105"
-            column="34"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: NetError.ERR_IO_PENDING, NetError.ERR_FAILED, NetError.ERR_ABORTED, NetError.ERR_INVALID_ARGUMENT, NetError.ERR_INVALID_HANDLE, NetError.ERR_FILE_NOT_FOUND, NetError.ERR_TIMED_OUT, NetError.ERR_FILE_TOO_BIG, NetError.ERR_UNEXPECTED, NetError.ERR_ACCESS_DENIED, NetError.ERR_NOT_IMPLEMENTED, NetError.ERR_INSUFFICIENT_RESOURCES, NetError.ERR_OUT_OF_MEMORY, NetError.ERR_UPLOAD_FILE_CHANGED, NetError.ERR_SOCKET_NOT_CONNECTED, NetError.ERR_FILE_EXISTS, NetError.ERR_FILE_PATH_TOO_LONG, NetError.ERR_FILE_NO_SPACE, NetError.ERR_FILE_VIRUS_INFECTED, NetError.ERR_BLOCKED_BY_CLIENT, NetError.ERR_NETWORK_CHANGED, NetError.ERR_BLOCKED_BY_ADMINISTRATOR, NetError.ERR_SOCKET_IS_CONNECTED, NetError.ERR_BLOCKED_ENROLLMENT_CHECK_PENDING, NetError.ERR_UPLOAD_STREAM_REWIND_NOT_SUPPORTED, NetError.ERR_CONTEXT_SHUT_DOWN, NetError.ERR_BLOCKED_BY_RESPONSE, NetError.ERR_CLEARTEXT_NOT_PERMITTED, NetError.ERR_BLOCKED_BY_CSP, NetError.ERR_H2_OR_QUIC_REQUIRED, NetError.ERR_INSECURE_PRIVATE_NETWORK_REQUEST, NetError.ERR_CONNECTION_CLOSED, NetError.ERR_CONNECTION_RESET, NetError.ERR_CONNECTION_REFUSED, NetError.ERR_CONNECTION_ABORTED, NetError.ERR_CONNECTION_FAILED, NetError.ERR_NAME_NOT_RESOLVED, NetError.ERR_INTERNET_DISCONNECTED, NetError.ERR_SSL_PROTOCOL_ERROR, NetError.ERR_ADDRESS_INVALID, NetError.ERR_ADDRESS_UNREACHABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_NEEDED, NetError.ERR_TUNNEL_CONNECTION_FAILED, NetError.ERR_NO_SSL_VERSIONS_ENABLED, NetError.ERR_SSL_VERSION_OR_CIPHER_MISMATCH, NetError.ERR_SSL_RENEGOTIATION_REQUESTED, NetError.ERR_PROXY_AUTH_UNSUPPORTED, NetError.ERR_CERT_ERROR_IN_SSL_RENEGOTIATION, NetError.ERR_BAD_SSL_CLIENT_AUTH_CERT, NetError.ERR_CONNECTION_TIMED_OUT, NetError.ERR_HOST_RESOLVER_QUEUE_TOO_LARGE, NetError.ERR_SOCKS_CONNECTION_FAILED, NetError.ERR_SOCKS_CONNECTION_HOST_UNREACHABLE, NetError.ERR_ALPN_NEGOTIATION_FAILED, NetError.ERR_SSL_NO_RENEGOTIATION, NetError.ERR_WINSOCK_UNEXPECTED_WRITTEN_BYTES, NetError.ERR_SSL_DECOMPRESSION_FAILURE_ALERT, NetError.ERR_SSL_BAD_RECORD_MAC_ALERT, NetError.ERR_PROXY_AUTH_REQUESTED, NetError.ERR_PROXY_CONNECTION_FAILED, NetError.ERR_MANDATORY_PROXY_CONFIGURATION_FAILED, NetError.ERR_PRECONNECT_MAX_SOCKET_LIMIT, NetError.ERR_SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED, NetError.ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY, NetError.ERR_PROXY_CERTIFICATE_INVALID, NetError.ERR_NAME_RESOLUTION_FAILED, NetError.ERR_NETWORK_ACCESS_DENIED, NetError.ERR_TEMPORARILY_THROTTLED, NetError.ERR_HTTPS_PROXY_TUNNEL_RESPONSE_REDIRECT, NetError.ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED, NetError.ERR_MSG_TOO_BIG, NetError.ERR_WS_PROTOCOL_ERROR, NetError.ERR_ADDRESS_IN_USE, NetError.ERR_SSL_HANDSHAKE_NOT_COMPLETED, NetError.ERR_SSL_BAD_PEER_PUBLIC_KEY, NetError.ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN, NetError.ERR_CLIENT_AUTH_CERT_TYPE_UNSUPPORTED, NetError.ERR_SSL_DECRYPT_ERROR_ALERT, NetError.ERR_WS_THROTTLE_QUEUE_TOO_LARGE, NetError.ERR_SSL_SERVER_CERT_CHANGED, NetError.ERR_SSL_UNRECOGNIZED_NAME_ALERT, NetError.ERR_SOCKET_SET_RECEIVE_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_SET_SEND_BUFFER_SIZE_ERROR, NetError.ERR_SOCKET_RECEIVE_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SOCKET_SEND_BUFFER_SIZE_UNCHANGEABLE, NetError.ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT, NetError.ERR_ICANN_NAME_COLLISION, NetError.ERR_SSL_SERVER_CERT_BAD_FORMAT, NetError.ERR_CT_STH_PARSING_FAILED, NetError.ERR_CT_STH_INCOMPLETE, NetError.ERR_UNABLE_TO_REUSE_CONNECTION_FOR_PROXY_AUTH, NetError.ERR_CT_CONSISTENCY_PROOF_PARSING_FAILED, NetError.ERR_SSL_OBSOLETE_CIPHER, NetError.ERR_WS_UPGRADE, NetError.ERR_READ_IF_READY_NOT_IMPLEMENTED, NetError.ERR_NO_BUFFER_SPACE, NetError.ERR_SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS, NetError.ERR_EARLY_DATA_REJECTED, NetError.ERR_WRONG_VERSION_ON_EARLY_DATA, NetError.ERR_TLS13_DOWNGRADE_DETECTED, NetError.ERR_SSL_KEY_USAGE_INCOMPATIBLE, NetError.ERR_CERT_COMMON_NAME_INVALID, NetError.ERR_CERT_DATE_INVALID, NetError.ERR_CERT_AUTHORITY_INVALID, NetError.ERR_CERT_CONTAINS_ERRORS, NetError.ERR_CERT_NO_REVOCATION_MECHANISM, NetError.ERR_CERT_UNABLE_TO_CHECK_REVOCATION, NetError.ERR_CERT_REVOKED, NetError.ERR_CERT_INVALID, NetError.ERR_CERT_WEAK_SIGNATURE_ALGORITHM, NetError.ERR_CERT_NON_UNIQUE_NAME, NetError.ERR_CERT_WEAK_KEY, NetError.ERR_CERT_NAME_CONSTRAINT_VIOLATION, NetError.ERR_CERT_VALIDITY_TOO_LONG, NetError.ERR_CERTIFICATE_TRANSPARENCY_REQUIRED, NetError.ERR_CERT_SYMANTEC_LEGACY, NetError.ERR_CERT_KNOWN_INTERCEPTION_BLOCKED, NetError.ERR_SSL_OBSOLETE_VERSION, NetError.ERR_CERT_END, NetError.ERR_INVALID_URL, NetError.ERR_DISALLOWED_URL_SCHEME, NetError.ERR_UNKNOWN_URL_SCHEME, NetError.ERR_INVALID_REDIRECT, NetError.ERR_TOO_MANY_REDIRECTS, NetError.ERR_UNSAFE_REDIRECT, NetError.ERR_UNSAFE_PORT, NetError.ERR_INVALID_RESPONSE, NetError.ERR_INVALID_CHUNKED_ENCODING, NetError.ERR_METHOD_NOT_SUPPORTED, NetError.ERR_UNEXPECTED_PROXY_AUTH, NetError.ERR_EMPTY_RESPONSE, NetError.ERR_RESPONSE_HEADERS_TOO_BIG, NetError.ERR_PAC_SCRIPT_FAILED, NetError.ERR_REQUEST_RANGE_NOT_SATISFIABLE, NetError.ERR_MALFORMED_IDENTITY, NetError.ERR_CONTENT_DECODING_FAILED, NetError.ERR_NETWORK_IO_SUSPENDED, NetError.ERR_SYN_REPLY_NOT_RECEIVED, NetError.ERR_ENCODING_CONVERSION_FAILED, NetError.ERR_UNRECOGNIZED_FTP_DIRECTORY_LISTING_FORMAT, NetError.ERR_NO_SUPPORTED_PROXIES, NetError.ERR_HTTP2_PROTOCOL_ERROR, NetError.ERR_INVALID_AUTH_CREDENTIALS, NetError.ERR_UNSUPPORTED_AUTH_SCHEME, NetError.ERR_ENCODING_DETECTION_FAILED, NetError.ERR_MISSING_AUTH_CREDENTIALS, NetError.ERR_UNEXPECTED_SECURITY_LIBRARY_STATUS, NetError.ERR_MISCONFIGURED_AUTH_ENVIRONMENT, NetError.ERR_UNDOCUMENTED_SECURITY_LIBRARY_STATUS, NetError.ERR_RESPONSE_BODY_TOO_BIG_TO_DRAIN, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_LENGTH, NetError.ERR_INCOMPLETE_HTTP2_HEADERS, NetError.ERR_PAC_NOT_IN_DHCP, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION, NetError.ERR_RESPONSE_HEADERS_MULTIPLE_LOCATION, NetError.ERR_HTTP2_SERVER_REFUSED_STREAM, NetError.ERR_HTTP2_PING_FAILED, NetError.ERR_CONTENT_LENGTH_MISMATCH, NetError.ERR_INCOMPLETE_CHUNKED_ENCODING, NetError.ERR_QUIC_PROTOCOL_ERROR, NetError.ERR_RESPONSE_HEADERS_TRUNCATED, NetError.ERR_QUIC_HANDSHAKE_FAILED, NetError.ERR_HTTP2_INADEQUATE_TRANSPORT_SECURITY, NetError.ERR_HTTP2_FLOW_CONTROL_ERROR, NetError.ERR_HTTP2_FRAME_SIZE_ERROR, NetError.ERR_HTTP2_COMPRESSION_ERROR, NetError.ERR_PROXY_AUTH_REQUESTED_WITH_NO_CONNECTION, NetError.ERR_HTTP_1_1_REQUIRED, NetError.ERR_PROXY_HTTP_1_1_REQUIRED, NetError.ERR_PAC_SCRIPT_TERMINATED, NetError.ERR_INVALID_HTTP_RESPONSE, NetError.ERR_CONTENT_DECODING_INIT_FAILED, NetError.ERR_HTTP2_RST_STREAM_NO_ERROR_RECEIVED, NetError.ERR_HTTP2_PUSHED_STREAM_NOT_AVAILABLE, NetError.ERR_HTTP2_CLAIMED_PUSHED_STREAM_RESET_BY_SERVER, NetError.ERR_TOO_MANY_RETRIES, NetError.ERR_HTTP2_STREAM_CLOSED, NetError.ERR_HTTP2_CLIENT_REFUSED_STREAM, NetError.ERR_HTTP2_PUSHED_RESPONSE_DOES_NOT_MATCH, NetError.ERR_HTTP_RESPONSE_CODE_FAILURE, NetError.ERR_QUIC_CERT_ROOT_NOT_KNOWN, NetError.ERR_CACHE_MISS, NetError.ERR_CACHE_READ_FAILURE, NetError.ERR_CACHE_WRITE_FAILURE, NetError.ERR_CACHE_OPERATION_NOT_SUPPORTED, NetError.ERR_CACHE_OPEN_FAILURE, NetError.ERR_CACHE_CREATE_FAILURE, NetError.ERR_CACHE_RACE, NetError.ERR_CACHE_CHECKSUM_READ_FAILURE, NetError.ERR_CACHE_CHECKSUM_MISMATCH, NetError.ERR_CACHE_LOCK_TIMEOUT, NetError.ERR_CACHE_AUTH_FAILURE_AFTER_READ, NetError.ERR_CACHE_ENTRY_NOT_SUITABLE, NetError.ERR_CACHE_DOOM_FAILURE, NetError.ERR_CACHE_OPEN_OR_CREATE_FAILURE, NetError.ERR_INSECURE_RESPONSE, NetError.ERR_NO_PRIVATE_KEY_FOR_CERT, NetError.ERR_ADD_USER_CERT_FAILED, NetError.ERR_INVALID_SIGNED_EXCHANGE, NetError.ERR_INVALID_WEB_BUNDLE, NetError.ERR_TRUST_TOKEN_OPERATION_FAILED, NetError.ERR_TRUST_TOKEN_OPERATION_CACHE_HIT, NetError.ERR_FTP_FAILED, NetError.ERR_FTP_SERVICE_UNAVAILABLE, NetError.ERR_FTP_TRANSFER_ABORTED, NetError.ERR_FTP_FILE_BUSY, NetError.ERR_FTP_SYNTAX_ERROR, NetError.ERR_FTP_COMMAND_NOT_SUPPORTED, NetError.ERR_FTP_BAD_COMMAND_SEQUENCE, NetError.ERR_PKCS12_IMPORT_BAD_PASSWORD, NetError.ERR_PKCS12_IMPORT_FAILED, NetError.ERR_IMPORT_CA_CERT_NOT_CA, NetError.ERR_IMPORT_CERT_ALREADY_EXISTS, NetError.ERR_IMPORT_CA_CERT_FAILED, NetError.ERR_IMPORT_SERVER_CERT_FAILED, NetError.ERR_PKCS12_IMPORT_INVALID_MAC, NetError.ERR_PKCS12_IMPORT_INVALID_FILE, NetError.ERR_PKCS12_IMPORT_UNSUPPORTED, NetError.ERR_KEY_GENERATION_FAILED, NetError.ERR_PRIVATE_KEY_EXPORT_FAILED, NetError.ERR_SELF_SIGNED_CERT_GENERATION_FAILED, NetError.ERR_CERT_DATABASE_CHANGED, NetError.ERR_DNS_MALFORMED_RESPONSE, NetError.ERR_DNS_SERVER_REQUIRES_TCP, NetError.ERR_DNS_SERVER_FAILED, NetError.ERR_DNS_TIMED_OUT, NetError.ERR_DNS_CACHE_MISS, NetError.ERR_DNS_SEARCH_EMPTY, NetError.ERR_DNS_SORT_ERROR, NetError.ERR_DNS_SECURE_RESOLVER_HOSTNAME_RESOLUTION_FAILED, NetError.OK"
-        errorLine1="                if (navigation.errorCode() != 0 &amp;&amp; navigation.isInMainFrame()"
-        errorLine2="                                              ~">
-        <location
-            file="../../chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java"
-            line="491"
-            column="47"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: PermissionChanged.NULL_TO_TRUE, PermissionChanged.NULL_TO_TRUE, PermissionChanged.TRUE_TO_FALSE, PermissionChanged.FALSE_TO_TRUE"
-        errorLine1="            int change = PermissionChanged.NUM_ENTRIES;"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityUmaRecorder.java"
-            line="187"
-            column="26"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: PermissionChanged.NULL_TO_TRUE, PermissionChanged.NULL_TO_TRUE, PermissionChanged.TRUE_TO_FALSE, PermissionChanged.FALSE_TO_TRUE"
-        errorLine1="                    change = PermissionChanged.NULL_TO_TRUE;"
-        errorLine2="                    ~~~~~~">
-        <location
-            file="../../chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityUmaRecorder.java"
-            line="190"
-            column="21"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: UpdateRequestQueued.ONCE, UpdateRequestQueued.TWICE, UpdateRequestQueued.THREE_TIMES"
-        errorLine1="        WebApkUma.recordUpdateRequestQueued(1);"
-        errorLine2="                                            ~">
-        <location
-            file="../../chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java"
-            line="200"
-            column="45"/>
-    </issue>
-
-    <issue
         id="VisibleForTests"
         message="This method should only be accessed from tests or within private scope"
         errorLine1="            if (AccountUtils.GOOGLE_ACCOUNT_TYPE.equals(desc.type)) return true;"
@@ -283,7 +30,7 @@
         errorLine2="                                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/payments/AndroidPaymentAppFinder.java"
-            line="593"
+            line="591"
             column="55"/>
     </issue>
 
@@ -294,7 +41,7 @@
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java"
-            line="372"
+            line="377"
             column="22"/>
     </issue>
 
@@ -371,7 +118,7 @@
         errorLine2="                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java"
-            line="475"
+            line="489"
             column="30"/>
     </issue>
 
@@ -415,7 +162,7 @@
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../android_webview/java/src/org/chromium/android_webview/AwContents.java"
-            line="1768"
+            line="1781"
             column="46"/>
     </issue>
 
@@ -426,7 +173,7 @@
         errorLine2="                     ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../android_webview/java/src/org/chromium/android_webview/AwContents.java"
-            line="2761"
+            line="2774"
             column="22"/>
     </issue>
 
@@ -657,7 +404,7 @@
         errorLine2="                         ~~~~~~~~~~~">
         <location
             file="../../components/browser_ui/android/bottomsheet/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl.java"
-            line="462"
+            line="460"
             column="26"/>
     </issue>
 
@@ -668,7 +415,7 @@
         errorLine2="                     ~~~~~~~~~~~">
         <location
             file="../../components/browser_ui/android/bottomsheet/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetControllerImpl.java"
-            line="467"
+            line="465"
             column="22"/>
     </issue>
 
@@ -701,7 +448,7 @@
         errorLine2="                                                        ~~~~~~~~~~~~">
         <location
             file="../../weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java"
-            line="258"
+            line="262"
             column="57"/>
     </issue>
 
@@ -712,7 +459,7 @@
         errorLine2="                                                                            ~~~~~~~~~~~~">
         <location
             file="../../weblayer/browser/java/org/chromium/weblayer_private/BrowserImpl.java"
-            line="382"
+            line="386"
             column="77"/>
     </issue>
 
@@ -767,7 +514,7 @@
         errorLine2="                      ~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java"
-            line="723"
+            line="725"
             column="23"/>
     </issue>
 
@@ -983,28 +730,6 @@
     <issue
         id="VisibleForTests"
         message="This method should only be accessed from tests or within private scope"
-        errorLine1="                sController.mThrottler.queueNotification(notificationInfo);"
-        errorLine2="                            ~~~~~~~~~~">
-        <location
-            file="../../weblayer/browser/java/org/chromium/weblayer_private/MediaSessionManager.java"
-            line="79"
-            column="29"/>
-    </issue>
-
-    <issue
-        id="VisibleForTests"
-        message="This method should only be accessed from tests or within private scope"
-        errorLine1="                sController.mThrottler.queueNotification(notificationInfo);"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../weblayer/browser/java/org/chromium/weblayer_private/MediaSessionManager.java"
-            line="79"
-            column="40"/>
-    </issue>
-
-    <issue
-        id="VisibleForTests"
-        message="This method should only be accessed from tests or within private scope"
         errorLine1="                    ((ChromeTabbedActivity) activity).saveState();"
         errorLine2="                                                      ~~~~~~~~~">
         <location
@@ -1185,7 +910,7 @@
         errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/omaha/RequestGenerator.java"
-            line="54"
+            line="43"
             column="17"/>
     </issue>
 
@@ -1218,7 +943,7 @@
         errorLine2="                        ~~~~~~~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java"
-            line="64"
+            line="63"
             column="25"/>
     </issue>
 
@@ -1317,7 +1042,7 @@
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java"
-            line="235"
+            line="243"
             column="50"/>
     </issue>
 
@@ -1328,7 +1053,7 @@
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java"
-            line="243"
+            line="251"
             column="50"/>
     </issue>
 
@@ -1339,7 +1064,7 @@
         errorLine2="                                                         ~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java"
-            line="250"
+            line="258"
             column="58"/>
     </issue>
 
@@ -1350,7 +1075,7 @@
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java"
-            line="265"
+            line="273"
             column="50"/>
     </issue>
 
@@ -1361,7 +1086,7 @@
         errorLine2="                                                 ~~~~~~~~~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java"
-            line="270"
+            line="278"
             column="50"/>
     </issue>
 
@@ -1394,7 +1119,7 @@
         errorLine2="                              ~~~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java"
-            line="607"
+            line="605"
             column="31"/>
     </issue>
 
@@ -1542,17 +1267,6 @@
     </issue>
 
     <issue
-        id="Autofill"
-        message="Missing `autofillHints` attribute"
-        errorLine1="        &lt;EditText"
-        errorLine2="         ~~~~~~~~">
-        <location
-            file="../../chrome/browser/password_check/android/java/res/layout/password_check_edit_fragment.xml"
-            line="74"
-            column="10"/>
-    </issue>
-
-    <issue
         id="ClickableViewAccessibility"
         message="Custom view `AccessibilityTabModelListItem` overrides `onTouchEvent` but not `performClick`"
         errorLine1="    public boolean onTouchEvent(MotionEvent e) {"
@@ -1592,7 +1306,7 @@
         errorLine2="                                             ^">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkItemsAdapter.java"
-            line="213"
+            line="215"
             column="46"/>
     </issue>
 
@@ -1614,7 +1328,7 @@
         errorLine2="                   ~~~~~~~~~~~~">
         <location
             file="../../components/browser_ui/android/bottomsheet/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java"
-            line="251"
+            line="258"
             column="20"/>
     </issue>
 
@@ -1680,7 +1394,7 @@
         errorLine2="                   ~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java"
-            line="635"
+            line="638"
             column="20"/>
     </issue>
 
@@ -1702,7 +1416,7 @@
         errorLine2="                       ~~~~~~~~~~~~">
         <location
             file="../../chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/CustomTabToolbar.java"
-            line="125"
+            line="119"
             column="24"/>
     </issue>
 
@@ -1922,7 +1636,7 @@
         errorLine2="                                             ~~~~~~~~~~~~~~~~~~">
         <location
             file="../../components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableListLayout.java"
-            line="243"
+            line="241"
             column="46"/>
     </issue>
 
@@ -1972,17 +1686,6 @@
 
     <issue
         id="ClickableViewAccessibility"
-        message="Custom view ``ImageButton`` has `setOnTouchListener` called on it but does not override `performClick`"
-        errorLine1="                menuButton.setOnTouchListener(appMenuButtonHelper);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="../../chrome/android/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java"
-            line="134"
-            column="17"/>
-    </issue>
-
-    <issue
-        id="ClickableViewAccessibility"
         message="Custom view `ToolbarPhone` overrides `onTouchEvent` but not `performClick`"
         errorLine1="    public boolean onTouchEvent(MotionEvent ev) {"
         errorLine2="                   ~~~~~~~~~~~~">
diff --git a/chrome/android/features/start_surface/internal/BUILD.gn b/chrome/android/features/start_surface/internal/BUILD.gn
index 209343df..f7086c56 100644
--- a/chrome/android/features/start_surface/internal/BUILD.gn
+++ b/chrome/android/features/start_surface/internal/BUILD.gn
@@ -73,6 +73,7 @@
     "//chrome/browser/tab:java",
     "//chrome/browser/tabmodel:java",
     "//chrome/browser/ui/messages/android:java",
+    "//chrome/browser/util:java",
     "//components/browser_ui/android/bottomsheet:java",
     "//components/browser_ui/widget/android:java",
     "//components/prefs/android:java",
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 76135f0..4976e4e 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
@@ -37,6 +37,7 @@
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher;
 import org.chromium.chrome.browser.tasks.tab_management.TabUiFeatureUtilities;
+import org.chromium.chrome.browser.util.ChromeAccessibilityUtil;
 import org.chromium.components.browser_ui.widget.animation.Interpolators;
 import org.chromium.ui.resources.ResourceManager;
 
@@ -186,6 +187,14 @@
         if (skipSlowZooming) {
             showShrinkingAnimation &= quick;
         }
+        if (TabUiFeatureUtilities.isLaunchPolishEnabled()) {
+            // Intentionally disable the shrinking animation when accessibility is enabled. During
+            // the shrinking animation, since the ComponsitorViewHolder is not focusable, I think
+            // we are in a temporary no "valid" focus target state, so the focus shifts to the
+            // omnibox and triggers an accessibility announcement of the URL and a keyboard hiding
+            // event. Disable the animation to avoid this temporary state.
+            showShrinkingAnimation &= !ChromeAccessibilityUtil.get().isAccessibilityEnabled();
+        }
 
         // Keep the current tab in mLayoutTabs even if we are not going to show the shrinking
         // animation so that thumbnail taking is not blocked.
@@ -491,4 +500,16 @@
     public boolean onUpdateAnimation(long time, boolean jumpToEnd) {
         return mTabToSwitcherAnimation == null && !mIsAnimating;
     }
+
+    @Override
+    public boolean canHostBeFocusable() {
+        if (TabUiFeatureUtilities.isLaunchPolishEnabled()
+                && ChromeAccessibilityUtil.get().isAccessibilityEnabled()) {
+            // We don't allow this layout to gain focus when accessibility is enabled so that the
+            // CompositorViewHolder doesn't steal focus when entering tab switcher.
+            // (crbug.com/1125185).
+            return false;
+        }
+        return super.canHostBeFocusable();
+    }
 }
diff --git a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
index e53db51..079e9ca 100644
--- a/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
+++ b/chrome/android/features/start_surface/internal/javatests/src/org/chromium/chrome/features/start_surface/StartSurfaceLayoutTest.java
@@ -1450,6 +1450,58 @@
         verifyTabModelTabCount(cta, 0, 0);
     }
 
+    @Test
+    @MediumTest
+    // clang-format off
+    @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
+        ChromeFeatureList.TAB_GROUPS_CONTINUATION_ANDROID})
+    @CommandLineFlags.Add({BASE_PARAMS + "/enable_launch_polish/true"})
+    public void testCloseButtonDescription() {
+        String expectedDescription = "Close New tab tab";
+        // clang-format on
+        ChromeTabbedActivity cta = mActivityTestRule.getActivity();
+        enterTabSwitcher(cta);
+
+        // Test single tab.
+        onView(allOf(withParent(withId(R.id.content_view)), withId(R.id.action_button),
+                       withEffectiveVisibility(VISIBLE)))
+                .check(ViewContentDescription.havingDescription(expectedDescription));
+
+        // Create 2 tabs and merge them into one group.
+        createTabs(cta, false, 2);
+        enterTabSwitcher(cta);
+        TabModel normalTabModel = cta.getTabModelSelector().getModel(false);
+        List<Tab> tabGroup = new ArrayList<>(
+                Arrays.asList(normalTabModel.getTabAt(0), normalTabModel.getTabAt(1)));
+        createTabGroup(cta, false, tabGroup);
+        verifyTabSwitcherCardCount(cta, 1);
+
+        // Test group tab.
+        expectedDescription = "Close tab group with 2 tabs";
+        onView(allOf(withParent(withId(R.id.content_view)), withId(R.id.action_button),
+                       withEffectiveVisibility(VISIBLE)))
+                .check(ViewContentDescription.havingDescription(expectedDescription));
+    }
+
+    private static class ViewContentDescription implements ViewAssertion {
+        private String mExpectedDescription;
+
+        public static ViewContentDescription havingDescription(String description) {
+            return new ViewContentDescription(description);
+        }
+
+        public ViewContentDescription(String description) {
+            mExpectedDescription = description;
+        }
+
+        @Override
+        public void check(View view, NoMatchingViewException noMatchException) {
+            if (noMatchException != null) throw noMatchException;
+
+            assertEquals(mExpectedDescription, view.getContentDescription());
+        }
+    }
+
     private static class TabCountAssertion implements ViewAssertion {
         private int mExpectedCount;
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
index cc361f37..8dfaacd2 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
@@ -189,6 +189,7 @@
         } else if (CARD_ALPHA == propertyKey) {
             view.setAlpha(model.get(CARD_ALPHA));
         } else if (TabProperties.TITLE == propertyKey) {
+            if (TabUiFeatureUtilities.isLaunchPolishEnabled()) return;
             String title = model.get(TabProperties.TITLE);
             view.fastFindViewById(R.id.action_button)
                     .setContentDescription(view.getResources().getString(
@@ -232,6 +233,11 @@
             searchButton.setIcon(iconDrawableId, shouldTint);
         } else if (TabProperties.IS_SELECTED == propertyKey) {
             view.setSelected(model.get(TabProperties.IS_SELECTED));
+        } else if (TabUiFeatureUtilities.isLaunchPolishEnabled()
+                && TabProperties.CLOSE_BUTTON_DESCRIPTION_STRING == propertyKey) {
+            view.fastFindViewById(R.id.action_button)
+                    .setContentDescription(
+                            model.get(TabProperties.CLOSE_BUTTON_DESCRIPTION_STRING));
         }
     }
 
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
index e6c40f49..f44e595 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -8,6 +8,7 @@
 import static org.chromium.chrome.browser.tasks.tab_management.TabListModel.CardProperties.CARD_ALPHA;
 import static org.chromium.chrome.browser.tasks.tab_management.TabListModel.CardProperties.CARD_TYPE;
 import static org.chromium.chrome.browser.tasks.tab_management.TabListModel.CardProperties.ModelType.TAB;
+import static org.chromium.chrome.browser.tasks.tab_management.TabProperties.CLOSE_BUTTON_DESCRIPTION_STRING;
 
 import android.app.Activity;
 import android.content.ComponentCallbacks;
@@ -778,6 +779,10 @@
                     if (index == TabModel.INVALID_TAB_INDEX) return;
                     mModel.get(index).model.set(TabProperties.TITLE, title);
                     updateDescriptionString(PseudoTab.fromTab(tab), mModel.get(index).model);
+                    if (TabUiFeatureUtilities.isLaunchPolishEnabled()) {
+                        updateCloseButtonDescriptionString(
+                                PseudoTab.fromTab(tab), mModel.get(index).model);
+                    }
                 }
 
                 @Override
@@ -1018,6 +1023,9 @@
         mModel.get(index).model.set(TabProperties.IS_SELECTED, isSelected);
         mModel.get(index).model.set(TabProperties.TITLE, getLatestTitleForTab(pseudoTab));
         updateDescriptionString(pseudoTab, mModel.get(index).model);
+        if (TabUiFeatureUtilities.isLaunchPolishEnabled()) {
+            updateCloseButtonDescriptionString(pseudoTab, mModel.get(index).model);
+        }
         if (isRealTab) {
             mModel.get(index).model.set(
                     TabProperties.URL_DOMAIN, getDomainForTab(pseudoTab.getTab()));
@@ -1276,6 +1284,9 @@
             tabInfo.set(TabProperties.TAB_SELECTED_LISTENER, tabSelectedListener);
             tabInfo.set(TabProperties.TAB_CLOSED_LISTENER, isRealTab ? mTabClosedListener : null);
             updateDescriptionString(pseudoTab, tabInfo);
+            if (TabUiFeatureUtilities.isLaunchPolishEnabled()) {
+                updateCloseButtonDescriptionString(pseudoTab, tabInfo);
+            }
         }
 
         if (index >= mModel.size()) {
@@ -1350,6 +1361,33 @@
         }
     }
 
+    private void updateCloseButtonDescriptionString(PseudoTab pseudoTab, PropertyModel model) {
+        if (!TabUiFeatureUtilities.isLaunchPolishEnabled()) return;
+        if (mActionsOnAllRelatedTabs) {
+            int numOfRelatedTabs = getRelatedTabsForId(pseudoTab.getId()).size();
+            if (numOfRelatedTabs > 1) {
+                String title = getLatestTitleForTab(pseudoTab);
+                title = title.equals(pseudoTab.getTitle(mTitleProvider)) ? "" : title;
+
+                if (title.isEmpty()) {
+                    model.set(TabProperties.CLOSE_BUTTON_DESCRIPTION_STRING,
+                            mContext.getString(R.string.accessibility_close_tab_group_button,
+                                    String.valueOf(numOfRelatedTabs)));
+                } else {
+                    model.set(TabProperties.CLOSE_BUTTON_DESCRIPTION_STRING,
+                            mContext.getString(
+                                    R.string.accessibility_close_tab_group_button_with_group_name,
+                                    title, String.valueOf(numOfRelatedTabs)));
+                }
+                return;
+            }
+        }
+
+        model.set(CLOSE_BUTTON_DESCRIPTION_STRING,
+                mContext.getString(
+                        R.string.accessibility_tabstrip_btn_close_tab, pseudoTab.getTitle()));
+    }
+
     @VisibleForTesting
     protected static String getDomain(Tab tab) {
         // TODO(crbug.com/1116613) Investigate how uninitialized Tabs are appearing
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
index 448f62c8..25a887b 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
@@ -37,7 +37,8 @@
 @ModuleInterface(module = "tab_management",
         impl = "org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegateImpl")
 public interface TabManagementDelegate {
-    @IntDef({TabSwitcherType.GRID, TabSwitcherType.CAROUSEL, TabSwitcherType.SINGLE})
+    @IntDef({TabSwitcherType.GRID, TabSwitcherType.CAROUSEL, TabSwitcherType.SINGLE,
+            TabSwitcherType.NONE})
     @Retention(RetentionPolicy.SOURCE)
     public @interface TabSwitcherType {
         int GRID = 0;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
index 3f885f8..4d4af28 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabProperties.java
@@ -112,6 +112,9 @@
     public static final WritableObjectPropertyKey<String> CONTENT_DESCRIPTION_STRING =
             new WritableObjectPropertyKey<>();
 
+    public static final WritableObjectPropertyKey<String> CLOSE_BUTTON_DESCRIPTION_STRING =
+            new WritableObjectPropertyKey<>();
+
     public static final PropertyKey[] ALL_KEYS_TAB_GRID = new PropertyKey[] {TAB_ID,
             TAB_SELECTED_LISTENER, TAB_CLOSED_LISTENER, FAVICON, THUMBNAIL_FETCHER, IPH_PROVIDER,
             TITLE, IS_SELECTED, CHECKED_DRAWABLE_STATE_LIST, CREATE_GROUP_LISTENER, CARD_ALPHA,
@@ -120,7 +123,7 @@
             SELECTABLE_TAB_ACTION_BUTTON_BACKGROUND,
             SELECTABLE_TAB_ACTION_BUTTON_SELECTED_BACKGROUND, URL_DOMAIN, ACCESSIBILITY_DELEGATE,
             SEARCH_QUERY, SEARCH_LISTENER, SEARCH_CHIP_ICON_DRAWABLE_ID, CARD_TYPE,
-            CONTENT_DESCRIPTION_STRING};
+            CONTENT_DESCRIPTION_STRING, CLOSE_BUTTON_DESCRIPTION_STRING};
 
     public static final PropertyKey[] ALL_KEYS_TAB_STRIP =
             new PropertyKey[] {TAB_ID, TAB_SELECTED_LISTENER, TAB_CLOSED_LISTENER, FAVICON,
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
index e84b1f2..8e8a55e 100644
--- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
+++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
@@ -9,6 +9,7 @@
 import android.graphics.Rect;
 import android.view.View;
 import android.view.ViewGroup;
+import android.view.accessibility.AccessibilityEvent;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
@@ -171,6 +172,36 @@
         mContainerViewChangeProcessor = PropertyModelChangeProcessor.create(containerViewModel,
                 mTabListCoordinator.getContainerView(), TabListContainerViewBinder::bind);
 
+        if (TabUiFeatureUtilities.isLaunchPolishEnabled()
+                && TabUiFeatureUtilities.isTabGroupsAndroidContinuationEnabled()) {
+            mMediator.addOverviewModeObserver(new OverviewModeObserver() {
+                @Override
+                public void startedShowing() {}
+
+                @Override
+                public void finishedShowing() {
+                    int selectedIndex = mTabModelSelector.getTabModelFilterProvider()
+                                                .getCurrentTabModelFilter()
+                                                .index();
+                    ViewHolder selectedViewHolder =
+                            mTabListCoordinator.getContainerView().findViewHolderForAdapterPosition(
+                                    selectedIndex);
+
+                    if (selectedViewHolder == null) return;
+
+                    View focusView = selectedViewHolder.itemView;
+                    focusView.requestFocus();
+                    focusView.sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_FOCUSED);
+                }
+
+                @Override
+                public void startedHiding() {}
+
+                @Override
+                public void finishedHiding() {}
+            });
+        }
+
         mMessageCardProviderCoordinator =
                 new MessageCardProviderCoordinator(context, (identifier) -> {
                     mTabListCoordinator.removeSpecialListItem(
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
index 39d6f8a..fe82626 100644
--- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
+++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
@@ -221,7 +221,7 @@
         Close tab group with <ph name="NUMBER_OF_TABS">%1$s<ex>2</ex></ph> tabs
       </message>
       <message name="IDS_ACCESSIBILITY_CLOSE_TAB_GROUP_BUTTON_WITH_GROUP_NAME" desc="The accessibility text to read when the close button on a card representing a tab group is focused in grid tab switcher. When this close button is tapped, all tabs within the tab group will be closed. TITLE_OF_GROUP is the title of the group. NUMBER_OF_TABS is the number of tabs within this group. Note that there are always at least two tabs in a group so plural form should always be used.">
-        Close <ph name="TITLE_OF_GROUP">%1$s<ex>shopping</ex></ph> group with <ph name="NUMBER_OF_TABS">%1$s<ex>2</ex></ph> tabs
+        Close <ph name="TITLE_OF_GROUP">%1$s<ex>shopping</ex></ph> group with <ph name="NUMBER_OF_TABS">%2$s<ex>2</ex></ph> tabs
       </message>
 
       <!-- Tab Selection Editor strings -->
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
index 6bcdee9..b2b21b1 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
@@ -788,31 +788,40 @@
         openDialogFromTabSwitcherAndVerify(cta, 3, null);
         verifyDialogBackButtonContentDescription(cta, collapseTargetString);
         editDialogTitle(cta, CUSTOMIZED_TITLE1);
-        collapseTargetString =
-                String.format("Collapse %s tab group with 3 tabs.", CUSTOMIZED_TITLE1);
+        collapseTargetString = "Collapse " + CUSTOMIZED_TITLE1 + " tab group with 3 tabs.";
         verifyDialogBackButtonContentDescription(cta, collapseTargetString);
 
         // Group card content description should update with group title.
         clickScrimToExitDialog(cta);
         waitForDialogHidingAnimationInTabSwitcher(cta);
         verifyFirstCardTitle(CUSTOMIZED_TITLE1);
-        expandTargetString = String.format("Expand %s tab group with 3 tabs.", CUSTOMIZED_TITLE1);
+        expandTargetString = "Expand " + CUSTOMIZED_TITLE1 + " tab group with 3 tabs.";
         assertEquals(expandTargetString, firstItem.getContentDescription());
 
+        // Verify the TabSwitcher group card close button content description should update with
+        // group title.
+        View closeButton = firstItem.findViewById(R.id.action_button);
+        String closeButtonTargetString = "Close " + CUSTOMIZED_TITLE1 + " group with 3 tabs";
+        assertEquals(closeButtonTargetString, closeButton.getContentDescription());
+
         // Back button content description should update with group count change.
         openDialogFromTabSwitcherAndVerify(cta, 3, CUSTOMIZED_TITLE1);
         closeFirstTabInDialog();
         verifyShowingDialog(cta, 2, CUSTOMIZED_TITLE1);
-        collapseTargetString =
-                String.format("Collapse %s tab group with 2 tabs.", CUSTOMIZED_TITLE1);
+        collapseTargetString = "Collapse " + CUSTOMIZED_TITLE1 + " tab group with 2 tabs.";
         verifyDialogBackButtonContentDescription(cta, collapseTargetString);
 
         // Group card content description should update with group count change.
         clickScrimToExitDialog(cta);
         waitForDialogHidingAnimationInTabSwitcher(cta);
-        expandTargetString = String.format("Expand %s tab group with 2 tabs.", CUSTOMIZED_TITLE1);
+        expandTargetString = "Expand " + CUSTOMIZED_TITLE1 + " tab group with 2 tabs.";
         assertEquals(expandTargetString, firstItem.getContentDescription());
 
+        // TabSwitcher group card Close button content description should update with group count
+        // change.
+        closeButtonTargetString = "Close " + CUSTOMIZED_TITLE1 + " group with 2 tabs";
+        assertEquals(closeButtonTargetString, closeButton.getContentDescription());
+
         // Back button content description should restore when the group loses customized title.
         openDialogFromTabSwitcherAndVerify(cta, 2, CUSTOMIZED_TITLE1);
         editDialogTitle(cta, "");
@@ -830,6 +839,11 @@
         clickScrimToExitDialog(cta);
         waitForDialogHidingAnimationInTabSwitcher(cta);
         assertEquals(null, firstItem.getContentDescription());
+
+        // TabSwitcher Group card Close button content description should restore when the group
+        // becomes a single tab.
+        closeButtonTargetString = "Close New tab tab";
+        assertEquals(closeButtonTargetString, closeButton.getContentDescription());
     }
 
     @Test
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
index 2393546..0719963 100644
--- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
+++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -63,6 +63,7 @@
 import androidx.recyclerview.widget.RecyclerView;
 
 import org.junit.After;
+import org.junit.Assume;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -2240,6 +2241,70 @@
                 equalTo(targetString));
     }
 
+    @Test
+    @Features.EnableFeatures({TAB_GROUPS_CONTINUATION_ANDROID})
+    public void testCloseButtonDescriptionStringSetup_TabSwitcher() {
+        Assume.assumeTrue("The close button changes are gated by a Chrome fast path fieldtrials"
+                        + "flag. Remove this assumption after the fast path flag is removed.",
+                TabUiFeatureUtilities.isLaunchPolishEnabled());
+        setUpForTabGroupOperation(TabListMediatorType.TAB_SWITCHER);
+        setUpCloseButtonDescriptionString(false);
+        String targetString = "Close Tab1 tab";
+
+        List<Tab> tabs = new ArrayList<>();
+        for (int i = 0; i < mTabModel.getCount(); i++) {
+            tabs.add(mTabModel.getTabAt(i));
+        }
+
+        mMediator.resetWithListOfTabs(PseudoTab.getListOfPseudoTab(tabs), false, false);
+        assertThat(mModel.get(POSITION1).model.get(TabProperties.CLOSE_BUTTON_DESCRIPTION_STRING),
+                equalTo(targetString));
+
+        // Create tab group.
+        TabImpl tab3 = prepareTab(TAB3_ID, TAB3_TITLE, TAB3_URL);
+        List<Tab> group1 = new ArrayList<>(Arrays.asList(mTab1, tab3));
+        createTabGroup(group1, TAB1_ID);
+        setUpCloseButtonDescriptionString(true);
+        targetString = "Close tab group with 2 tabs.";
+
+        mMediator.resetWithListOfTabs(PseudoTab.getListOfPseudoTab(tabs), false, false);
+        assertThat(mModel.get(POSITION1).model.get(TabProperties.CLOSE_BUTTON_DESCRIPTION_STRING),
+                equalTo(targetString));
+
+        // Set group name.
+        targetString = String.format("Close %s group with 2 tabs.", CUSTOMIZED_DIALOG_TITLE1);
+        mMediator.getTabGroupTitleEditor().storeTabGroupTitle(TAB1_ID, CUSTOMIZED_DIALOG_TITLE1);
+        mMediator.getTabGroupTitleEditor().updateTabGroupTitle(mTab1, CUSTOMIZED_DIALOG_TITLE1);
+        assertThat(mModel.get(POSITION1).model.get(TabProperties.CLOSE_BUTTON_DESCRIPTION_STRING),
+                equalTo(targetString));
+    }
+
+    private void setUpCloseButtonDescriptionString(boolean isGroup) {
+        if (isGroup) {
+            doAnswer(invocation -> {
+                String title = invocation.getArgument(1);
+                String num = invocation.getArgument(2);
+                return String.format("Close %s group with %s tabs.", title, num);
+            })
+                    .when(mContext)
+                    .getString(anyInt(), anyString(), anyString());
+
+            doAnswer(invocation -> {
+                String num = invocation.getArgument(1);
+                return String.format("Close tab group with %s tabs.", num);
+            })
+                    .when(mContext)
+                    .getString(anyInt(), anyString());
+        } else {
+            doAnswer(invocation -> {
+                String title = invocation.getArgument(1);
+                return String.format("Close %s, tab.", title);
+            })
+                    .when(mContext)
+                    .getString(anyInt(), anyString());
+        }
+    }
+
     private void setUpTabGroupCardDescriptionString() {
         doAnswer(invocation -> {
             String title = invocation.getArgument(1);
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/ModelError.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/ModelError.java
index 674c512..d2be139 100644
--- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/ModelError.java
+++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/library/api/internal/modelprovider/ModelError.java
@@ -16,7 +16,8 @@
  */
 public final class ModelError {
     /** Defines errors are exposed through the ModelProvider to the Stream. */
-    @IntDef({ErrorType.UNKNOWN, ErrorType.NO_CARDS_ERROR, ErrorType.PAGINATION_ERROR})
+    @IntDef({ErrorType.UNKNOWN, ErrorType.NO_CARDS_ERROR, ErrorType.PAGINATION_ERROR,
+            ErrorType.SYNTHETIC_TOKEN_ERROR})
     public @interface ErrorType {
         // An unknown error, this is not expected to ever be used.
         int UNKNOWN = 0;
diff --git a/chrome/android/java/res/values/ids.xml b/chrome/android/java/res/values/ids.xml
index 4ebed05f..8374bf3 100644
--- a/chrome/android/java/res/values/ids.xml
+++ b/chrome/android/java/res/values/ids.xml
@@ -21,6 +21,7 @@
     <item type="id" name="close_tab" />
     <item type="id" name="ungroup_tab" />
     <item type="id" name="share_tab_group" />
+    <item type="id" name="edit_group_name" />
 
     <!-- InfoBar constants -->
     <item type="id" name="infobar_extra_check" />
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityUmaRecorder.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityUmaRecorder.java
index 1e1bb01..ca69d45 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityUmaRecorder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/TrustedWebActivityUmaRecorder.java
@@ -49,7 +49,7 @@
         int NUM_ENTRIES = 2;
     }
 
-    @IntDef({PermissionChanged.NULL_TO_TRUE, PermissionChanged.NULL_TO_TRUE,
+    @IntDef({PermissionChanged.NULL_TO_TRUE, PermissionChanged.NULL_TO_FALSE,
             PermissionChanged.TRUE_TO_FALSE, PermissionChanged.FALSE_TO_TRUE})
     @Retention(RetentionPolicy.SOURCE)
     public @interface PermissionChanged {
@@ -183,8 +183,9 @@
     public void recordPermissionChangedUma(
             @ContentSettingsType int type, Boolean last, boolean enabled) {
         if (type == ContentSettingsType.GEOLOCATION) {
+            @Nullable
             @PermissionChanged
-            int change = PermissionChanged.NUM_ENTRIES;
+            Integer change = null;
             if (last == null) {
                 if (enabled) {
                     change = PermissionChanged.NULL_TO_TRUE;
@@ -195,7 +196,7 @@
                 if (last && !enabled) change = PermissionChanged.TRUE_TO_FALSE;
                 if (!last && enabled) change = PermissionChanged.FALSE_TO_TRUE;
             }
-            if (change != PermissionChanged.NUM_ENTRIES) {
+            if (change != null) {
                 RecordHistogram.recordEnumeratedHistogram(
                         "TrustedWebActivity.LocationPermissionChanged", change,
                         PermissionChanged.NUM_ENTRIES);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
index 2784aa0..7c08688 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java
@@ -58,7 +58,8 @@
     // These are used for UMA logging, so append only. Please update the
     // GridTabSwitcherThumbnailFetchingResult enum in enums.xml if these change.
     @IntDef({ThumbnailFetchingResult.GOT_JPEG, ThumbnailFetchingResult.GOT_ETC1,
-            ThumbnailFetchingResult.GOT_NOTHING})
+            ThumbnailFetchingResult.GOT_NOTHING,
+            ThumbnailFetchingResult.GOT_DIFFERENT_ASPECT_RATIO_JPEG})
     @Retention(RetentionPolicy.SOURCE)
     public @interface ThumbnailFetchingResult {
         int GOT_JPEG = 0;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetContent.java b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetContent.java
index 5a66110d..779f085 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetContent.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/DevicePickerBottomSheetContent.java
@@ -20,8 +20,6 @@
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfMetrics.SendTabToSelfShareClickResult;
 import org.chromium.chrome.browser.settings.SettingsLauncher;
-import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
-import org.chromium.chrome.browser.sync.AndroidSyncSettings;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.ui.widget.ButtonCompat;
@@ -46,9 +44,12 @@
     private final String mUrl;
     private final String mTitle;
     private final long mNavigationTime;
+    private final SettingsLauncher mSettingsLauncher;
+    private final boolean mIsSyncEnabled;
 
     public DevicePickerBottomSheetContent(Context context, String url, String title,
-            long navigationTime, BottomSheetController controller) {
+            long navigationTime, BottomSheetController controller,
+            SettingsLauncher settingsLauncher, boolean isSyncEnabled) {
         mContext = context;
         mController = controller;
         mProfile = Profile.getLastUsedRegularProfile();
@@ -56,6 +57,8 @@
         mUrl = url;
         mTitle = title;
         mNavigationTime = navigationTime;
+        mSettingsLauncher = settingsLauncher;
+        mIsSyncEnabled = isSyncEnabled;
 
         createToolbarView();
         createContentView();
@@ -72,7 +75,7 @@
         List<TargetDeviceInfo> targetDeviceList = new ArrayList<TargetDeviceInfo>();
         SendTabToSelfAndroidBridgeJni.get().getAllTargetDeviceInfos(mProfile, targetDeviceList);
 
-        if (!AndroidSyncSettings.get().isChromeSyncEnabled()) {
+        if (!mIsSyncEnabled) {
             RecordUserAction.record("SharingHubAndroid.SendTabToSelf.NotSyncing");
             mContentView = (ViewGroup) LayoutInflater.from(mContext).inflate(
                     R.layout.send_tab_to_self_feature_unavailable_prompt, null);
@@ -96,12 +99,14 @@
     }
 
     private void enableSettingsButton() {
+        if (mSettingsLauncher == null) {
+            return;
+        }
         ButtonCompat chromeSettingsButton = mContentView.findViewById(R.id.chrome_settings);
         chromeSettingsButton.setVisibility(View.VISIBLE);
         chromeSettingsButton.setOnClickListener(view -> {
             RecordUserAction.record("SharingHubAndroid.SendTabToSelf.ChromeSettingsClicked");
-            SettingsLauncher settingsLauncher = new SettingsLauncherImpl();
-            settingsLauncher.launchSettingsActivity(ContextUtils.getApplicationContext());
+            mSettingsLauncher.launchSettingsActivity(ContextUtils.getApplicationContext());
         });
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfCoordinator.java
new file mode 100644
index 0000000..863e1a7
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfCoordinator.java
@@ -0,0 +1,64 @@
+// 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.send_tab_to_self;
+
+import android.content.Context;
+
+import androidx.annotation.VisibleForTesting;
+
+import org.chromium.chrome.browser.settings.SettingsLauncher;
+import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
+import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
+
+/**
+ * Coordinator for displaying the send tab to self feature.
+ */
+public class SendTabToSelfCoordinator {
+    private static BottomSheetContent sBottomSheetContentForTesting;
+    private final Context mContext;
+    private final String mUrl;
+    private final String mTitle;
+    private final BottomSheetController mController;
+    private final SettingsLauncher mSettingsLauncher;
+    private final boolean mIsSyncEnabled;
+    private final long mNavigationTime;
+
+    public SendTabToSelfCoordinator(Context context, String url, String title,
+            BottomSheetController controller, SettingsLauncher settingsLauncher,
+            boolean isSyncEnabled, long navigationTime) {
+        mContext = context;
+        mUrl = url;
+        mTitle = title;
+        mController = controller;
+        mSettingsLauncher = settingsLauncher;
+        mIsSyncEnabled = isSyncEnabled;
+        mNavigationTime = navigationTime;
+    }
+
+    public void show() {
+        mController.requestShowContent(
+                createBottomSheetContent(mContext, mUrl, mTitle, mNavigationTime, mController,
+                        mSettingsLauncher, mIsSyncEnabled),
+                true);
+        // TODO(crbug.com/968246): Remove the need to call this explicitly and instead have it
+        // automatically show since PeekStateEnabled is set to false.
+        mController.expandSheet();
+    }
+
+    static BottomSheetContent createBottomSheetContent(Context context, String url, String title,
+            long navigationTime, BottomSheetController controller,
+            SettingsLauncher settingsLauncher, boolean isSyncEnabled) {
+        if (sBottomSheetContentForTesting != null) {
+            return sBottomSheetContentForTesting;
+        }
+        return new DevicePickerBottomSheetContent(
+                context, url, title, navigationTime, controller, settingsLauncher, isSyncEnabled);
+    }
+
+    @VisibleForTesting
+    public static void setBottomSheetContentForTesting(BottomSheetContent bottomSheetContent) {
+        sBottomSheetContentForTesting = bottomSheetContent;
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java
index 42e18cd..0d84294 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java
@@ -4,14 +4,13 @@
 
 package org.chromium.chrome.browser.send_tab_to_self;
 
-import android.content.Context;
-
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.chrome.browser.ChromeAccessorActivity;
 import org.chromium.chrome.browser.app.ChromeActivity;
+import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
+import org.chromium.chrome.browser.sync.AndroidSyncSettings;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerProvider;
 import org.chromium.content_public.browser.NavigationEntry;
@@ -21,8 +20,8 @@
  * A simple activity that allows Chrome to expose send tab to self as an option in the share menu.
  */
 public class SendTabToSelfShareActivity extends ChromeAccessorActivity {
-    private static BottomSheetContent sBottomSheetContentForTesting;
     private static BottomSheetController sBottomSheetControllerForTesting;
+    private static AndroidSyncSettings sAndroidSyncSettings;
 
     @Override
     protected void handleAction(ChromeActivity triggeringActivity) {
@@ -30,31 +29,23 @@
         if (tab == null) return;
         NavigationEntry entry = tab.getWebContents().getNavigationController().getVisibleEntry();
         if (entry == null) return;
-        actionHandler(triggeringActivity, entry.getUrl(), entry.getTitle(), entry.getTimestamp(),
-                getBottomSheetController(triggeringActivity.getWindowAndroid()));
-    }
-
-    public static void actionHandler(Context context, String url, String title, long navigationTime,
-            BottomSheetController controller) {
+        BottomSheetController controller =
+                getBottomSheetController(triggeringActivity.getWindowAndroid());
         if (controller == null) {
             return;
         }
 
+        boolean isSyncEnabled = getAndroidSyncSettings().isSyncEnabled();
         controller.requestShowContent(
-                createBottomSheetContent(context, url, title, navigationTime, controller), true);
+                SendTabToSelfCoordinator.createBottomSheetContent(triggeringActivity,
+                        entry.getUrl(), entry.getTitle(), entry.getTimestamp(), controller,
+                        new SettingsLauncherImpl(), isSyncEnabled),
+                true);
         // TODO(crbug.com/968246): Remove the need to call this explicitly and instead have it
         // automatically show since PeekStateEnabled is set to false.
         controller.expandSheet();
     }
 
-    static BottomSheetContent createBottomSheetContent(Context context, String url, String title,
-            long navigationTime, BottomSheetController controller) {
-        if (sBottomSheetContentForTesting != null) {
-            return sBottomSheetContentForTesting;
-        }
-        return new DevicePickerBottomSheetContent(context, url, title, navigationTime, controller);
-    }
-
     public static boolean featureIsAvailable(Tab currentTab) {
         return SendTabToSelfAndroidBridge.isFeatureAvailable(currentTab.getWebContents());
     }
@@ -64,13 +55,18 @@
         return BottomSheetControllerProvider.from(window);
     }
 
+    private AndroidSyncSettings getAndroidSyncSettings() {
+        if (sAndroidSyncSettings != null) return sAndroidSyncSettings;
+        return AndroidSyncSettings.get();
+    }
+
     @VisibleForTesting
     public static void setBottomSheetControllerForTesting(BottomSheetController controller) {
         sBottomSheetControllerForTesting = controller;
     }
 
     @VisibleForTesting
-    public static void setBottomSheetContentForTesting(BottomSheetContent bottomSheetContent) {
-        sBottomSheetContentForTesting = bottomSheetContent;
+    public static void setAndroidSyncSettingsForTesting(AndroidSyncSettings syncSettings) {
+        sAndroidSyncSettings = syncSettings;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareDelegateImpl.java
index e1b637e..9667736 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareDelegateImpl.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareDelegateImpl.java
@@ -23,8 +23,10 @@
 import org.chromium.chrome.browser.printing.TabPrinter;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfShareActivity;
+import org.chromium.chrome.browser.settings.SettingsLauncherImpl;
 import org.chromium.chrome.browser.share.share_sheet.ShareSheetCoordinator;
 import org.chromium.chrome.browser.share.share_sheet.ShareSheetPropertyModelBuilder;
+import org.chromium.chrome.browser.sync.AndroidSyncSettings;
 import org.chromium.chrome.browser.tab.SadTab;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.ui.favicon.LargeIconBridge;
@@ -86,7 +88,8 @@
             mShareStartTime = System.currentTimeMillis();
         }
         mDelegate.share(params, chromeShareExtras, mBottomSheetController, mLifecycleDispatcher,
-                mTabProvider, this::printTab, mShareStartTime, isSharingHubV1Enabled());
+                mTabProvider, this::printTab, AndroidSyncSettings.get().isSyncEnabled(),
+                mShareStartTime, isSharingHubV1Enabled());
         mShareStartTime = 0;
     }
 
@@ -295,8 +298,8 @@
          */
         void share(ShareParams params, ChromeShareExtras chromeShareExtras,
                 BottomSheetController controller, ActivityLifecycleDispatcher lifecycleDispatcher,
-                Supplier<Tab> tabProvider, Callback<Tab> printCallback, long shareStartTime,
-                boolean sharingHubEnabled) {
+                Supplier<Tab> tabProvider, Callback<Tab> printCallback, boolean isSyncEnabled,
+                long shareStartTime, boolean sharingHubEnabled) {
             if (chromeShareExtras.shareDirectly()) {
                 ShareHelper.shareWithLastUsedComponent(params);
             } else if (sharingHubEnabled && !chromeShareExtras.sharingTabGroup()) {
@@ -306,7 +309,8 @@
                         lifecycleDispatcher, tabProvider,
                         new ShareSheetPropertyModelBuilder(controller,
                                 ContextUtils.getApplicationContext().getPackageManager()),
-                        printCallback, new LargeIconBridge(Profile.getLastUsedRegularProfile()));
+                        printCallback, new LargeIconBridge(Profile.getLastUsedRegularProfile()),
+                        new SettingsLauncherImpl(), isSyncEnabled);
                 // TODO(crbug/1009124): open custom share sheet.
                 coordinator.showShareSheet(params, chromeShareExtras, shareStartTime);
             } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java
index e7cead4..dd54225f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabThemeColorHelper.java
@@ -17,6 +17,7 @@
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.content_public.browser.RenderWidgetHostView;
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.net.NetError;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.ui.util.ColorUtils;
 
@@ -240,7 +241,7 @@
 
     @Override
     public void onDidFinishNavigation(Tab tab, NavigationHandle navigation) {
-        if (navigation.errorCode() != 0) updateIfNeeded(true);
+        if (navigation.errorCode() != NetError.OK) updateIfNeeded(true);
     }
 
     @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
index 094730e4..2b20a39 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabUma.java
@@ -98,14 +98,12 @@
 
     /**
      * Records the tab restore result into several UMA histograms.
-     * @param succeeded Whether or not the tab restore succeeded.
      * @param time The time taken to perform the tab restore.
      * @param perceivedTime The perceived time taken to perform the tab restore.
-     * @param errorCode The error code, on failure (as denoted by the |succeeded| parameter).
+     * @param errorCode The error code, NetError.OK on success.
      */
-    private void recordTabRestoreResult(
-            boolean succeeded, long time, long perceivedTime, @NetError int errorCode) {
-        if (succeeded) {
+    private void recordTabRestoreResult(long time, long perceivedTime, @NetError int errorCode) {
+        if (errorCode == NetError.OK) {
             RecordHistogram.recordEnumeratedHistogram(
                     "Tab.RestoreResult", TAB_RESTORE_RESULT_SUCCESS, TAB_RESTORE_RESULT_COUNT);
             RecordHistogram.recordCountHistogram("Tab.RestoreTime", (int) time);
@@ -270,17 +268,18 @@
             long now = SystemClock.elapsedRealtime();
             long restoreTime = now - mRestoreStartedAtMillis;
             long perceivedRestoreTime = now - mLastShownTimestamp;
-            recordTabRestoreResult(true, restoreTime, perceivedRestoreTime, -1);
+            recordTabRestoreResult(restoreTime, perceivedRestoreTime, NetError.OK);
         }
         mRestoreStartedAtMillis = -1;
     }
 
     /** Called when the corresponding tab fails a page load. */
     @Override
-    public void onPageLoadFailed(Tab tab, int errorCode) {
+    public void onPageLoadFailed(Tab tab, @NetError int errorCode) {
         if (mRestoreStartedAtMillis != -1 && mLastShownTimestamp >= mRestoreStartedAtMillis) {
             // Load time is ignored for failed loads.
-            recordTabRestoreResult(false, -1, -1, errorCode);
+            assert errorCode != NetError.OK;
+            recordTabRestoreResult(-1, -1, errorCode);
         }
         mRestoreStartedAtMillis = -1;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
index c3c59f5..9b30a04 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
@@ -28,6 +28,7 @@
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.WebContentsAccessibility;
 import org.chromium.content_public.browser.WebContentsObserver;
+import org.chromium.net.NetError;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
@@ -289,7 +290,7 @@
                 observers.next().onDidFinishNavigation(mTab, navigation);
             }
 
-            if (navigation.errorCode() != 0) {
+            if (navigation.errorCode() != NetError.OK) {
                 if (navigation.isInMainFrame()) mTab.didFailPageLoad(navigation.errorCode());
 
                 recordErrorInPolicyAuditor(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
index a942119..c31f64c0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -99,6 +99,7 @@
 import org.chromium.content_public.browser.NavigationEntry;
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.content_public.browser.WebContents;
+import org.chromium.net.NetError;
 import org.chromium.ui.util.TokenHolder;
 
 import java.util.List;
@@ -475,7 +476,7 @@
 
                 // If the load failed due to a different navigation, there is no need to reset the
                 // location bar animations.
-                if (navigation.errorCode() != 0 && navigation.isInMainFrame()
+                if (navigation.errorCode() != NetError.OK && navigation.isInMainFrame()
                         && !hasPendingNonNtpNavigation(tab)) {
                     NewTabPage ntp = mLocationBarModel.getNewTabPageForCurrentTab();
                     if (ntp == null) return;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
index 81dc9c5..61bbfdf 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
@@ -25,6 +25,7 @@
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.Destroyable;
 import org.chromium.chrome.browser.metrics.WebApkUma;
+import org.chromium.chrome.browser.metrics.WebApkUma.UpdateRequestQueued;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.components.background_task_scheduler.BackgroundTaskSchedulerFactory;
 import org.chromium.components.background_task_scheduler.TaskIds;
@@ -197,7 +198,7 @@
 
     /** Schedules update for when WebAPK is not running. */
     private void scheduleUpdate() {
-        WebApkUma.recordUpdateRequestQueued(1);
+        WebApkUma.recordUpdateRequestQueued(UpdateRequestQueued.TWICE);
         TaskInfo updateTask;
         if (mStorage.shouldForceUpdate()) {
             // Start an update task ASAP for forced updates.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ChromeTabModalPresenterTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ChromeTabModalPresenterTest.java
index d5c53d5..89934868 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ChromeTabModalPresenterTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/modaldialog/ChromeTabModalPresenterTest.java
@@ -542,6 +542,23 @@
         Assert.assertEquals(BrowserControlsState.BOTH, getBrowserControlsConstraints());
     }
 
+    @Test
+    @SmallTest
+    @Feature({"ModalDialog"})
+    // Ensures an exception isn't thrown when a dialog is dismissed and the View is no longer
+    // attached to a Window. See https://crbug.com/1127254 for the specifics.
+    public void testDismissAfterRemovingView() throws Throwable {
+        PropertyModel dialog1 = createDialog(mActivity, mManager, "1", null);
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mManager.showDialog(dialog1, ModalDialogType.TAB);
+            ViewGroup containerParent = (ViewGroup) mTabModalPresenter.getContainerParentForTest();
+            // This is a bit hacky and intended to correspond to a case where the hosting
+            // ViewGroup is no longer attached to a Window.
+            containerParent.removeAllViews();
+            mManager.dismissAllDialogs(DialogDismissalCause.UNKNOWN);
+        });
+    }
+
     @BrowserControlsState
     private int getBrowserControlsConstraints() {
         return TestThreadUtils.runOnUiThreadBlockingNoException(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfCoordinatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfCoordinatorTest.java
new file mode 100644
index 0000000..94e112ee
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfCoordinatorTest.java
@@ -0,0 +1,58 @@
+// 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.
+
+package org.chromium.chrome.browser.send_tab_to_self;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.verify;
+
+import android.app.Activity;
+import android.support.test.filters.SmallTest;
+import android.support.test.rule.ActivityTestRule;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
+import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
+import org.chromium.ui.test.util.DummyUiActivity;
+
+/** Tests for SendTabToSelfCoordinator */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+public class SendTabToSelfCoordinatorTest {
+    @Rule
+    public ActivityTestRule<DummyUiActivity> mActivityTestRule =
+            new ActivityTestRule<>(DummyUiActivity.class);
+
+    @Mock
+    private BottomSheetController mBottomSheetController;
+    @Mock
+    private BottomSheetContent mBottomSheetContent;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    @SmallTest
+    public void testShow() {
+        SendTabToSelfCoordinator.setBottomSheetContentForTesting(mBottomSheetContent);
+        Activity activity = mActivityTestRule.getActivity();
+        SendTabToSelfCoordinator coordinator = new SendTabToSelfCoordinator(activity, "test",
+                "test", mBottomSheetController, /*settingsLauncher=*/null,
+                /*isSyncEnabled=*/true, /*navigationTime=*/0);
+        coordinator.show();
+        verify(mBottomSheetController).requestShowContent(any(BottomSheetContent.class), eq(true));
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareDelegateImplIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareDelegateImplIntegrationTest.java
index 1e6f2bf..b4afb16 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareDelegateImplIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/share/ShareDelegateImplIntegrationTest.java
@@ -121,7 +121,7 @@
                 void share(ShareParams params, ChromeShareExtras chromeShareParams,
                         BottomSheetController controller,
                         ActivityLifecycleDispatcher lifecycleDispatcher, Supplier<Tab> tabProvider,
-                        Callback<Tab> printCallback, long shareStartTime,
+                        Callback<Tab> printCallback, boolean syncState, long shareStartTime,
                         boolean sharingHubEnabled) {
                     paramsRef.set(params);
                     helper.notifyCalled();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetRenderTest.java
index 12c94976..e2619ee 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetRenderTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/AccountPickerBottomSheetRenderTest.java
@@ -142,7 +142,7 @@
         mAccountManagerTestRule.addAccount(PROFILE_DATA1);
         mAccountManagerTestRule.addAccount(PROFILE_DATA2);
         buildAndShowCollapsedBottomSheet();
-        onView(withText(PROFILE_DATA1.getFullName())).perform(click());
+        expandBottomSheet();
         mRenderTestRule.render(mCoordinator.getBottomSheetViewForTesting(), "expanded_sheet");
     }
 
@@ -155,7 +155,7 @@
         mAccountManagerTestRule.addAccount(PROFILE_DATA1);
         mAccountManagerTestRule.addAccount(PROFILE_DATA2);
         buildAndShowCollapsedBottomSheet();
-        onView(withText(PROFILE_DATA1.getFullName())).perform(click());
+        expandBottomSheet();
         onView(withText(R.string.signin_incognito_mode_primary)).perform(click());
         onView(isRoot()).perform(pressBack());
         mRenderTestRule.render(mCoordinator.getBottomSheetViewForTesting(), "expanded_sheet");
@@ -271,6 +271,13 @@
                 mCoordinator.getBottomSheetViewForTesting(), "signin_in_progress_sheet");
     }
 
+    private void expandBottomSheet() {
+        View view = mCoordinator.getBottomSheetViewForTesting();
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> { view.findViewById(R.id.account_picker_selected_account).performClick(); });
+        CriteriaHelper.pollUiThread(view.findViewById(R.id.account_picker_account_list)::isShown);
+    }
+
     private void buildAndShowCollapsedBottomSheet() {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             mCoordinator = new AccountPickerBottomSheetCoordinator(mActivityTestRule.getActivity(),
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java
index 28ee3cf3..090e29c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivityTest.java
@@ -26,6 +26,7 @@
 import org.chromium.chrome.browser.app.ChromeActivity;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.profiles.ProfileJni;
+import org.chromium.chrome.browser.sync.AndroidSyncSettings;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
@@ -61,6 +62,9 @@
     @Mock
     private BottomSheetController mBottomSheetController;
 
+    @Mock
+    private AndroidSyncSettings mSyncSettings;
+
     private Profile mProfile;
 
     @Before
@@ -94,9 +98,13 @@
         when(mWebContents.getNavigationController()).thenReturn(mNavigationController);
         when(mNavigationController.getVisibleEntry()).thenReturn(mNavigationEntry);
 
+        // Setup the mocked object for sync settings.
+        when(mSyncSettings.isSyncEnabled()).thenReturn(true);
+        SendTabToSelfShareActivity.setAndroidSyncSettingsForTesting(mSyncSettings);
+
         // Setup the mocked object chain to get the bottom controller.
         SendTabToSelfShareActivity shareActivity = new SendTabToSelfShareActivity();
-        SendTabToSelfShareActivity.setBottomSheetContentForTesting(mBottomSheetContent);
+        SendTabToSelfCoordinator.setBottomSheetContentForTesting(mBottomSheetContent);
         SendTabToSelfShareActivity.setBottomSheetControllerForTesting(mBottomSheetController);
         shareActivity.handleAction(mChromeActivity);
         verify(mBottomSheetController).requestShowContent(any(BottomSheetContent.class), eq(true));
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index b30dfa9..5fc83de 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -5723,10 +5723,7 @@
      flag_descriptions::kImpulseScrollAnimationsName,
      flag_descriptions::kImpulseScrollAnimationsDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kImpulseScrollAnimations)},
-    {"texture-layer-skip-wait-for-activation",
-     flag_descriptions::kTextureLayerSkipWaitForActivationName,
-     flag_descriptions::kTextureLayerSkipWaitForActivationDescription, kOsAll,
-     FEATURE_VALUE_TYPE(features::kTextureLayerSkipWaitForActivation)},
+
     {"percent-based-scrolling", flag_descriptions::kPercentBasedScrollingName,
      flag_descriptions::kPercentBasedScrollingDescription, kOsAll,
      FEATURE_VALUE_TYPE(features::kPercentBasedScrolling)},
@@ -6080,6 +6077,9 @@
      FEATURE_VALUE_TYPE(media::kUseMediaHistoryStore)},
 
 #if !defined(OS_ANDROID)
+    {"copy-link-to-text", flag_descriptions::kCopyLinkToTextName,
+     flag_descriptions::kCopyLinkToTextDescription, kOsDesktop,
+     FEATURE_VALUE_TYPE(features::kCopyLinkToText)},
     {"nearby-sharing", flag_descriptions::kNearbySharingName,
      flag_descriptions::kNearbySharingDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(features::kNearbySharing)},
diff --git a/chrome/browser/browser_features.cc b/chrome/browser/browser_features.cc
index e041b3d3..aaaab849 100644
--- a/chrome/browser/browser_features.cc
+++ b/chrome/browser/browser_features.cc
@@ -30,6 +30,10 @@
 #endif
 
 #if !defined(OS_ANDROID)
+// Adds an item to the context menu that copies a link to the page with the
+// selected text highlighted.
+const base::Feature kCopyLinkToText{"CopyLinkToText",
+                                    base::FEATURE_DISABLED_BY_DEFAULT};
 // Enables Nearby Sharing functionality. Android already has a native
 // implementation.
 const base::Feature kNearbySharing{"NearbySharing",
diff --git a/chrome/browser/browser_features.h b/chrome/browser/browser_features.h
index 5323d16..5b07a345 100644
--- a/chrome/browser/browser_features.h
+++ b/chrome/browser/browser_features.h
@@ -26,6 +26,7 @@
 #endif
 
 #if !defined(OS_ANDROID)
+extern const base::Feature kCopyLinkToText;
 extern const base::Feature kNearbySharing;
 #endif
 
diff --git a/chrome/browser/chromeos/arc/file_system_watcher/arc_file_system_watcher_service.cc b/chrome/browser/chromeos/arc/file_system_watcher/arc_file_system_watcher_service.cc
index 641bbc52..8cd8a277 100644
--- a/chrome/browser/chromeos/arc/file_system_watcher/arc_file_system_watcher_service.cc
+++ b/chrome/browser/chromeos/arc/file_system_watcher/arc_file_system_watcher_service.cc
@@ -7,12 +7,10 @@
 #include <string.h>
 
 #include <algorithm>
-#include <map>
 #include <memory>
 #include <utility>
 
 #include "base/bind.h"
-#include "base/callback.h"
 #include "base/files/file_enumerator.h"
 #include "base/files/file_path.h"
 #include "base/files/file_path_watcher.h"
@@ -122,8 +120,25 @@
     // Skip non-media files for efficiency.
     if (!HasAndroidSupportedMediaExtension(cros_path))
       continue;
-    base::FilePath android_path =
-        GetAndroidPath(cros_path, cros_dir, android_dir);
+
+    // TODO(b/163951541): Temporary hack, this will be changed when we change
+    // the path to UUID. The cros_dir for removable media is now changed to
+    // /media/removable/volume_name instead of just /media/removable.
+    // Meanwhile, the GetAndroidPath function accept the second parameter
+    // cros_dir as a way to identify if it is a removable media directory.
+    // Since the second parameter is only used for identification,
+    // and the identification happens through equality check with
+    // kCrosRemovableMediaDir string, it is safe to just pass
+    // kCrosRemovableMediaDir string directly when we know it is a removable
+    // media. In other word, the cros_removable_media_dir below is used as
+    // the ChromeOS analogue for the Android /storage directory.
+    base::FilePath cros_removable_media_dir =
+        base::FilePath(kCrosRemovableMediaDir);
+    base::FilePath android_path = GetAndroidPath(
+        cros_path,
+        cros_removable_media_dir.IsParent(cros_dir) ? cros_removable_media_dir
+                                                    : cros_dir,
+        android_dir);
     const base::FileEnumerator::FileInfo& info = enumerator.GetInfo();
     timestamp_map[android_path] = info.GetLastModifiedTime();
   }
@@ -151,13 +166,19 @@
   // Factory name used by ArcBrowserContextKeyedServiceFactoryBase.
   static constexpr const char* kName = "ArcFileSystemWatcherServiceFactory";
 
+  ArcFileSystemWatcherServiceFactory()
+      : ArcBrowserContextKeyedServiceFactoryBase<
+            ArcFileSystemWatcherService,
+            ArcFileSystemWatcherServiceFactory>() {
+    DependsOn(ArcVolumeMounterBridge::GetFactory());
+  }
+
   static ArcFileSystemWatcherServiceFactory* GetInstance() {
     return base::Singleton<ArcFileSystemWatcherServiceFactory>::get();
   }
 
  private:
   friend base::DefaultSingletonTraits<ArcFileSystemWatcherServiceFactory>;
-  ArcFileSystemWatcherServiceFactory() = default;
   ~ArcFileSystemWatcherServiceFactory() override = default;
 };
 
@@ -169,8 +190,7 @@
  public:
   using Callback = base::Callback<void(const std::vector<std::string>& paths)>;
 
-  FileSystemWatcher(content::BrowserContext* context,
-                    const Callback& callback,
+  FileSystemWatcher(const Callback& callback,
                     const base::FilePath& cros_dir,
                     const base::FilePath& android_dir);
   ~FileSystemWatcher();
@@ -213,7 +233,6 @@
 };
 
 ArcFileSystemWatcherService::FileSystemWatcher::FileSystemWatcher(
-    content::BrowserContext* context,
     const Callback& callback,
     const base::FilePath& cros_dir,
     const base::FilePath& android_dir)
@@ -312,15 +331,16 @@
           base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()})) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   arc_bridge_service_->file_system()->AddObserver(this);
+  ArcVolumeMounterBridge::GetForBrowserContext(context_)->Initialize(this);
 }
 
 ArcFileSystemWatcherService::~ArcFileSystemWatcherService() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  StopWatchingFileSystem();
+  StopWatchingFileSystem(base::DoNothing());
+  DCHECK(removable_media_watchers_.empty());
   DCHECK(!downloads_watcher_);
   DCHECK(!myfiles_watcher_);
-  DCHECK(!removable_media_watcher_);
 
   arc_bridge_service_->file_system()->RemoveObserver(this);
 }
@@ -332,12 +352,25 @@
 
 void ArcFileSystemWatcherService::OnConnectionClosed() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  StopWatchingFileSystem();
+  StopWatchingFileSystem(base::DoNothing());
 }
 
 void ArcFileSystemWatcherService::StartWatchingFileSystem() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  StopWatchingFileSystem();
+
+  // Triggered SendAllMountEvents as reply to make sure that callback is
+  // triggered after StopWatchingFileSystem() is triggered in the
+  // file_task_runner. Without this synchronization, the
+  // StopWatchingFileSystem() might race with
+  // ArcVolumeMounter::RequestAllMountPoints. If RequestAllMountPoints is
+  // triggered before StopWatchingFileSystem, then the watcher for existing
+  // removable media will be accidentally removed, even though the removable
+  // media is still attached. This can happen if there is an attached removable
+  // media during startup.
+  StopWatchingFileSystem(
+      base::BindOnce(&ArcFileSystemWatcherService::TriggerSendAllMountEvents,
+                     weak_ptr_factory_.GetWeakPtr()));
+
   Profile* profile = Profile::FromBrowserContext(context_);
 
   DCHECK(!downloads_watcher_);
@@ -345,42 +378,47 @@
       DownloadPrefs(profile)
           .GetDefaultDownloadDirectoryForProfile()
           .StripTrailingSeparators(),
-      base::FilePath(kAndroidDownloadDir));
+      base::FilePath(kAndroidDownloadDir), base::DoNothing());
 
   DCHECK(!myfiles_watcher_);
   myfiles_watcher_ = CreateAndStartFileSystemWatcher(
       file_manager::util::GetMyFilesFolderForProfile(profile),
-      base::FilePath(kAndroidMyFilesDir));
-
-  DCHECK(!removable_media_watcher_);
-  removable_media_watcher_ = CreateAndStartFileSystemWatcher(
-      base::FilePath(kCrosRemovableMediaDir),
-      base::FilePath(kAndroidRemovableMediaDir));
+      base::FilePath(kAndroidMyFilesDir), base::DoNothing());
 }
 
-void ArcFileSystemWatcherService::StopWatchingFileSystem() {
+void ArcFileSystemWatcherService::StopWatchingFileSystem(
+    base::OnceClosure callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  for (auto& watcher : removable_media_watchers_) {
+    file_task_runner_->DeleteSoon(FROM_HERE, watcher.second.release());
+  }
+  removable_media_watchers_.clear();
   if (downloads_watcher_)
     file_task_runner_->DeleteSoon(FROM_HERE, downloads_watcher_.release());
-  if (myfiles_watcher_)
-    file_task_runner_->DeleteSoon(FROM_HERE, myfiles_watcher_.release());
-  if (removable_media_watcher_)
-    file_task_runner_->DeleteSoon(FROM_HERE,
-                                  removable_media_watcher_.release());
+  // Trigger the callback at the end of the StopWatchingFileSystem. This is
+  // equivalent with DeleteSoon with a callback.
+  file_task_runner_->PostTaskAndReply(
+      FROM_HERE,
+      base::BindOnce([](std::unique_ptr<FileSystemWatcher> watcher) {},
+                     base::Passed(&myfiles_watcher_)),
+      std::move(callback));
 }
 
 std::unique_ptr<ArcFileSystemWatcherService::FileSystemWatcher>
 ArcFileSystemWatcherService::CreateAndStartFileSystemWatcher(
     const base::FilePath& cros_path,
-    const base::FilePath& android_path) {
+    const base::FilePath& android_path,
+    base::OnceClosure callback) {
   auto watcher = std::make_unique<FileSystemWatcher>(
-      context_,
       base::BindRepeating(&ArcFileSystemWatcherService::OnFileSystemChanged,
                           weak_ptr_factory_.GetWeakPtr()),
       cros_path, android_path);
-  file_task_runner_->PostTask(FROM_HERE,
-                              base::BindOnce(&FileSystemWatcher::Start,
-                                             base::Unretained(watcher.get())));
+
+  file_task_runner_->PostTaskAndReply(
+      FROM_HERE,
+      base::BindOnce(&FileSystemWatcher::Start,
+                     base::Unretained(watcher.get())),
+      std::move(callback));
   return watcher;
 }
 
@@ -397,7 +435,7 @@
   for (const std::string& path : paths) {
     if (base::StartsWith(path, kAndroidMyFilesDownloadsDir,
                          base::CompareCase::SENSITIVE)) {
-      // Exclude files under /storage/MyFiles/Downloads/ because they are also
+      // Exclude files under .../MyFiles/Downloads/ because they are also
       // indexed as files under /storage/emulated/0/Download/
       continue;
     }
@@ -407,4 +445,38 @@
   instance->RequestMediaScan(filtered_paths);
 }
 
+void ArcFileSystemWatcherService::StartWatchingRemovableMedia(
+    const std::string& fs_uuid,
+    const std::string& mount_path,
+    base::OnceClosure callback) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  // Make sure the callback is triggered after the file system is attached in
+  // file_task_runner.
+  // TODO(b/163951541): Temporary hack, this will be changed when we change the
+  // path to UUID. The kAndroidRemovableMediaDir is hardcoded here because
+  // CreateAndStartFileSystemWatcher accepts the removable media's volume's
+  // directory's parent in Android as second argument (i.e., /storage).
+  removable_media_watchers_[fs_uuid] = CreateAndStartFileSystemWatcher(
+      base::FilePath(mount_path), base::FilePath(kAndroidRemovableMediaDir),
+      std::move(callback));
+}
+
+void ArcFileSystemWatcherService::StopWatchingRemovableMedia(
+    const std::string& fs_uuid) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  if (!removable_media_watchers_.count(fs_uuid)) {
+    LOG(ERROR) << "Unmounting non-existing volume with UUID: " << fs_uuid;
+    return;
+  }
+  file_task_runner_->DeleteSoon(FROM_HERE,
+                                removable_media_watchers_[fs_uuid].release());
+  removable_media_watchers_.erase(fs_uuid);
+}
+
+void ArcFileSystemWatcherService::TriggerSendAllMountEvents() const {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  ArcVolumeMounterBridge::GetForBrowserContext(context_)->SendAllMountEvents();
+}
+
 }  // namespace arc
diff --git a/chrome/browser/chromeos/arc/file_system_watcher/arc_file_system_watcher_service.h b/chrome/browser/chromeos/arc/file_system_watcher/arc_file_system_watcher_service.h
index e59c925..a557a730 100644
--- a/chrome/browser/chromeos/arc/file_system_watcher/arc_file_system_watcher_service.h
+++ b/chrome/browser/chromeos/arc/file_system_watcher/arc_file_system_watcher_service.h
@@ -5,15 +5,18 @@
 #ifndef CHROME_BROWSER_CHROMEOS_ARC_FILE_SYSTEM_WATCHER_ARC_FILE_SYSTEM_WATCHER_SERVICE_H_
 #define CHROME_BROWSER_CHROMEOS_ARC_FILE_SYSTEM_WATCHER_ARC_FILE_SYSTEM_WATCHER_SERVICE_H_
 
+#include <map>
 #include <memory>
 #include <string>
 #include <vector>
 
+#include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
 #include "components/arc/mojom/file_system.mojom-forward.h"
 #include "components/arc/session/connection_observer.h"
+#include "components/arc/volume_mounter/arc_volume_mounter_bridge.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 namespace base {
@@ -33,7 +36,8 @@
 // Android MediaProvider.
 class ArcFileSystemWatcherService
     : public KeyedService,
-      public ConnectionObserver<mojom::FileSystemInstance> {
+      public ConnectionObserver<mojom::FileSystemInstance>,
+      public ArcVolumeMounterBridge::Delegate {
  public:
   // Returns singleton instance for the given BrowserContext,
   // or nullptr if the browser |context| is not allowed to use ARC.
@@ -49,15 +53,25 @@
   void OnConnectionReady() override;
   void OnConnectionClosed() override;
 
+  // ArcVolumeMounterBridge::Delegate overrides.
+  void StartWatchingRemovableMedia(const std::string& fs_uuid,
+                                   const std::string& mount_path,
+                                   base::OnceClosure callback) override;
+
+  void StopWatchingRemovableMedia(const std::string& fs_uuid) override;
+
  private:
   class FileSystemWatcher;
 
   void StartWatchingFileSystem();
-  void StopWatchingFileSystem();
+  void StopWatchingFileSystem(base::OnceClosure);
+
+  void TriggerSendAllMountEvents() const;
 
   std::unique_ptr<FileSystemWatcher> CreateAndStartFileSystemWatcher(
       const base::FilePath& cros_path,
-      const base::FilePath& android_path);
+      const base::FilePath& android_path,
+      base::OnceClosure callback);
   void OnFileSystemChanged(const std::vector<std::string>& paths);
 
   content::BrowserContext* const context_;
@@ -65,7 +79,9 @@
 
   std::unique_ptr<FileSystemWatcher> downloads_watcher_;
   std::unique_ptr<FileSystemWatcher> myfiles_watcher_;
-  std::unique_ptr<FileSystemWatcher> removable_media_watcher_;
+  // A map from UUID to watcher.
+  std::map<std::string, std::unique_ptr<FileSystemWatcher>>
+      removable_media_watchers_;
 
   scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
 
diff --git a/chrome/browser/chromeos/platform_keys/mock_platform_keys_service.h b/chrome/browser/chromeos/platform_keys/mock_platform_keys_service.h
index bb635f7..9a6300c 100644
--- a/chrome/browser/chromeos/platform_keys/mock_platform_keys_service.h
+++ b/chrome/browser/chromeos/platform_keys/mock_platform_keys_service.h
@@ -112,7 +112,7 @@
                RemoveKeyCallback callback),
               (override));
 
-  MOCK_METHOD(void, GetTokens, (const GetTokensCallback& callback), (override));
+  MOCK_METHOD(void, GetTokens, (GetTokensCallback callback), (override));
 
   MOCK_METHOD(void,
               GetKeyLocations,
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys_service.h b/chrome/browser/chromeos/platform_keys/platform_keys_service.h
index 29b572f..a390427 100644
--- a/chrome/browser/chromeos/platform_keys/platform_keys_service.h
+++ b/chrome/browser/chromeos/platform_keys/platform_keys_service.h
@@ -67,8 +67,8 @@
 // If the list of available tokens could be successfully retrieved, |token_ids|
 // will contain the token ids. If an error occurs, |token_ids| will be nullptr.
 using GetTokensCallback =
-    base::Callback<void(std::unique_ptr<std::vector<TokenId>> token_ids,
-                        Status status)>;
+    base::OnceCallback<void(std::unique_ptr<std::vector<TokenId>> token_ids,
+                            Status status)>;
 
 // If token ids have been successfully retrieved, two cases are possible then:
 // If |token_ids| is not empty, |token_ids| has been filled with the identifiers
@@ -222,7 +222,7 @@
   // Gets the list of available tokens. |callback| will be invoked when the list
   // of available tokens is determined, possibly with an error status.
   // Calls |callback| on the UI thread.
-  virtual void GetTokens(const GetTokensCallback& callback) = 0;
+  virtual void GetTokens(GetTokensCallback callback) = 0;
 
   // Determines the token(s) on which the private key corresponding to
   // |public_key_spki_der| is stored. |callback| will be invoked when the token
@@ -347,7 +347,7 @@
   void RemoveKey(TokenId token_id,
                  const std::string& public_key_spki_der,
                  RemoveKeyCallback callback) override;
-  void GetTokens(const GetTokensCallback& callback) override;
+  void GetTokens(GetTokensCallback callback) override;
   void GetKeyLocations(const std::string& public_key_spki_der,
                        const GetKeyLocationsCallback& callback) override;
   void SetAttributeForKey(TokenId token_id,
diff --git a/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc b/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc
index 69efabd4..280ff42 100644
--- a/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc
+++ b/chrome/browser/chromeos/platform_keys/platform_keys_service_nss.cc
@@ -469,8 +469,7 @@
 
 class GetTokensState : public NSSOperationState {
  public:
-  explicit GetTokensState(ServiceWeakPtr weak_ptr,
-                          const GetTokensCallback& callback);
+  explicit GetTokensState(ServiceWeakPtr weak_ptr, GetTokensCallback callback);
   ~GetTokensState() override = default;
 
   void OnError(const base::Location& from, Status status) override {
@@ -488,7 +487,7 @@
                 std::unique_ptr<std::vector<TokenId>> token_ids,
                 Status status) {
     auto bound_callback =
-        base::BindOnce(callback_, std::move(token_ids), status);
+        base::BindOnce(std::move(callback_), std::move(token_ids), status);
     origin_task_runner_->PostTask(
         from, base::BindOnce(&NSSOperationState::RunCallback,
                              std::move(bound_callback), service_weak_ptr_));
@@ -675,8 +674,8 @@
       callback_(std::move(callback)) {}
 
 GetTokensState::GetTokensState(ServiceWeakPtr weak_ptr,
-                               const GetTokensCallback& callback)
-    : NSSOperationState(weak_ptr), callback_(callback) {}
+                               GetTokensCallback callback)
+    : NSSOperationState(weak_ptr), callback_(std::move(callback)) {}
 
 GetKeyLocationsState::GetKeyLocationsState(
     ServiceWeakPtr weak_ptr,
@@ -1772,10 +1771,10 @@
                   delegate_.get(), state_ptr);
 }
 
-void PlatformKeysServiceImpl::GetTokens(const GetTokensCallback& callback) {
+void PlatformKeysServiceImpl::GetTokens(GetTokensCallback callback) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  auto state =
-      std::make_unique<GetTokensState>(weak_factory_.GetWeakPtr(), callback);
+  auto state = std::make_unique<GetTokensState>(weak_factory_.GetWeakPtr(),
+                                                std::move(callback));
   if (delegate_->IsShutDown()) {
     state->OnError(FROM_HERE, Status::kErrorShutDown);
     return;
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLaterDialogChoice.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLaterDialogChoice.java
index 05e5ac427..5160c74b 100644
--- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLaterDialogChoice.java
+++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLaterDialogChoice.java
@@ -11,7 +11,7 @@
  *  Keep in sync with DownloadLaterDialogChoice in enums.xml.
  */
 @IntDef({DownloadLaterDialogChoice.DOWNLOAD_NOW, DownloadLaterDialogChoice.ON_WIFI,
-        DownloadLaterDialogChoice.DOWNLOAD_LATER})
+        DownloadLaterDialogChoice.DOWNLOAD_LATER, DownloadLaterDialogChoice.CANCELLED})
 public @interface DownloadLaterDialogChoice {
     /**
      * Download will be started right away.
@@ -25,6 +25,10 @@
      * Download will be started in the future..
      */
     int DOWNLOAD_LATER = 2;
+    /**
+     * Download dialog was cancelled.
+     */
+    int CANCELLED = 3;
 
-    int COUNT = 3;
+    int COUNT = 4;
 }
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLaterDialogHelper.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLaterDialogHelper.java
index e966bfe..e28fd98 100644
--- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLaterDialogHelper.java
+++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLaterDialogHelper.java
@@ -120,7 +120,7 @@
     public void onDownloadLaterDialogCanceled() {
         if (mCallback == null) return;
 
-        recordDialogMetrics(false /*complete*/, -1);
+        recordDialogMetrics(false /*complete*/, DownloadLaterDialogChoice.CANCELLED);
         mCallback.onResult(null);
         mCallback = null;
     }
diff --git a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.cc b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.cc
index 42e7751..1c62485 100644
--- a/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.cc
+++ b/chrome/browser/extensions/api/enterprise_platform_keys/enterprise_platform_keys_api_ash.cc
@@ -255,7 +255,7 @@
           browser_context());
   CHECK(platform_keys_service);
 
-  platform_keys_service->GetTokens(base::Bind(
+  platform_keys_service->GetTokens(base::BindOnce(
       &EnterprisePlatformKeysInternalGetTokensFunction::OnGotTokens, this));
   return RespondLater();
 }
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 638ff49..a22459e 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -642,6 +642,11 @@
     "expiry_milestone": 88
   },
   {
+    "name": "copy-link-to-text",
+    "owners": [ "johntlee" ],
+    "expiry_milestone": 90
+  },
+  {
     "name": "cors-for-content-scripts",
     "owners": [ "lukasza", "creis", "rdcronin" ],
     "expiry_milestone": 89
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 7fedaba3..ff5c05c 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -1454,10 +1454,6 @@
     "Enables New OS Settings search with fuzzy matching, and disables the old "
     "OS settings search using exact string matching.";
 
-const char kTextureLayerSkipWaitForActivationName[] = "Parallelize layers";
-const char kTextureLayerSkipWaitForActivationDescription[] =
-    "Don't wait for layer activation before beginning new frame.";
-
 const char kNotificationIndicatorName[] = "Notification Indicators";
 const char kNotificationIndicatorDescription[] =
     "Enable notification indicators, which appear on shelf app icons and "
@@ -3257,6 +3253,11 @@
     "Enables the native Cast Media Route Provider implementation to be used "
     "instead of the implementation in the Media Router component extension.";
 
+const char kCopyLinkToTextName[] = "Copy Link To Text";
+const char kCopyLinkToTextDescription[] =
+    "Adds an item to the context menu to allow a user to copy a link to the "
+    "page with the selected text highlighted.";
+
 const char kGlobalMediaControlsCastStartStopName[] =
     "Global media controls control Cast start/stop";
 const char kGlobalMediaControlsCastStartStopDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index 63fa9b98..7624291 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -855,9 +855,6 @@
 extern const char kNewTabstripAnimationName[];
 extern const char kNewTabstripAnimationDescription[];
 
-extern const char kTextureLayerSkipWaitForActivationName[];
-extern const char kTextureLayerSkipWaitForActivationDescription[];
-
 extern const char kNotificationIndicatorName[];
 extern const char kNotificationIndicatorDescription[];
 
@@ -1864,6 +1861,9 @@
 extern const char kCastMediaRouteProviderName[];
 extern const char kCastMediaRouteProviderDescription[];
 
+extern const char kCopyLinkToTextName[];
+extern const char kCopyLinkToTextDescription[];
+
 extern const char kGlobalMediaControlsCastStartStopName[];
 extern const char kGlobalMediaControlsCastStartStopDescription[];
 
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.cc b/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.cc
index 19c11f6..3f21153e 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.cc
@@ -15,7 +15,7 @@
 #include "content/public/browser/web_contents.h"
 
 NavigationPredictorKeyedService::Prediction::Prediction(
-    const content::WebContents* web_contents,
+    content::WebContents* web_contents,
     const base::Optional<GURL>& source_document_url,
     const base::Optional<std::vector<std::string>>& external_app_packages_name,
     PredictionSource prediction_source,
@@ -112,7 +112,7 @@
   return sorted_predicted_urls_;
 }
 
-const content::WebContents*
+content::WebContents*
 NavigationPredictorKeyedService::Prediction::web_contents() const {
   DCHECK_EQ(PredictionSource::kAnchorElementsParsedFromWebPage,
             prediction_source_);
@@ -141,7 +141,7 @@
 }
 
 void NavigationPredictorKeyedService::OnPredictionUpdated(
-    const content::WebContents* web_contents,
+    content::WebContents* web_contents,
     const GURL& document_url,
     PredictionSource prediction_source,
     const std::vector<GURL>& sorted_predicted_urls) {
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h b/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h
index afe7866..b4e15b4 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h
+++ b/chrome/browser/navigation_predictor/navigation_predictor_keyed_service.h
@@ -40,7 +40,7 @@
   // Stores the next set of URLs that the user is expected to navigate to.
   class Prediction {
    public:
-    Prediction(const content::WebContents* web_contents,
+    Prediction(content::WebContents* web_contents,
                const base::Optional<GURL>& source_document_url,
                const base::Optional<std::vector<std::string>>&
                    external_app_packages_name,
@@ -56,13 +56,13 @@
     const std::vector<GURL>& sorted_predicted_urls() const;
 
     // Null if the prediction source is kExternalAndroidApp.
-    const content::WebContents* web_contents() const;
+    content::WebContents* web_contents() const;
 
    private:
     // The WebContents from where the navigation may happen. Do not use this
     // pointer outside the observer's call stack unless its destruction is also
     // observed.
-    const content::WebContents* web_contents_;
+    content::WebContents* web_contents_;
 
     // Current URL of the document from where the navigtion may happen.
     base::Optional<GURL> source_document_url_;
@@ -113,7 +113,7 @@
   SearchEnginePreconnector* search_engine_preconnector();
 
   // |document_url| may be invalid. Called by navigation predictor.
-  void OnPredictionUpdated(const content::WebContents* web_contents,
+  void OnPredictionUpdated(content::WebContents* web_contents,
                            const GURL& document_url,
                            PredictionSource prediction_source,
                            const std::vector<GURL>& sorted_predicted_urls);
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client.cc b/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client.cc
index 03e09cc3..b5261d3 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client.cc
@@ -18,7 +18,13 @@
 #include "components/search_engines/template_url_service.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
+#include "content/public/browser/web_contents.h"
+#include "services/metrics/public/cpp/metrics_utils.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
+#include "services/metrics/public/cpp/ukm_source.h"
 #include "url/gurl.h"
 #include "url/origin.h"
 
@@ -27,6 +33,11 @@
     "NavigationPredictorRendererWarmup", base::FEATURE_DISABLED_BY_DEFAULT};
 }
 
+NavigationPredictorRendererWarmupClient::PredictionMetrics::
+    PredictionMetrics() = default;
+NavigationPredictorRendererWarmupClient::PredictionMetrics::
+    ~PredictionMetrics() = default;
+
 NavigationPredictorRendererWarmupClient::
     ~NavigationPredictorRendererWarmupClient() = default;
 NavigationPredictorRendererWarmupClient::
@@ -78,6 +89,8 @@
 void NavigationPredictorRendererWarmupClient::OnPredictionUpdated(
     const base::Optional<NavigationPredictorKeyedService::Prediction>
         prediction) {
+  DCHECK(!metrics_);
+
   if (!prediction) {
     return;
   }
@@ -88,6 +101,10 @@
     return;
   }
 
+  if (!prediction->web_contents()) {
+    return;
+  }
+
   if (!prediction->source_document_url()) {
     return;
   }
@@ -96,14 +113,19 @@
     return;
   }
 
-  if (!IsEligibleForWarmupOnCommonCriteria()) {
+  if (!base::FeatureList::IsEnabled(kNavigationPredictorRendererWarmup)) {
     return;
   }
 
-  if (IsEligibleForCrossNavigationWarmup(*prediction) ||
-      IsEligibleForDSEWarmup(*prediction)) {
-    RecordMetricsAndMaybeDoWarmup();
-  }
+  metrics_ = std::make_unique<PredictionMetrics>();
+
+  // Each of these methods will set some state in |metrics_| which is used in
+  // |RecordMetricsAndMaybeDoWarmup|.
+  CheckIsEligibleForWarmupOnCommonCriteria();
+  CheckIsEligibleForCrossNavigationWarmup(*prediction);
+  CheckIsEligibleForDSEWarmup(*prediction);
+
+  RecordMetricsAndMaybeDoWarmup(prediction->web_contents());
 }
 
 void NavigationPredictorRendererWarmupClient::DoRendererWarmpup() {
@@ -121,36 +143,26 @@
   return false;
 }
 
-bool NavigationPredictorRendererWarmupClient::
-    IsEligibleForWarmupOnCommonCriteria() const {
-  if (!base::FeatureList::IsEnabled(kNavigationPredictorRendererWarmup)) {
-    return false;
-  }
-
+void NavigationPredictorRendererWarmupClient::
+    CheckIsEligibleForWarmupOnCommonCriteria() {
   base::TimeDelta duration_since_last_warmup =
       tick_clock_->NowTicks() - last_warmup_time_;
   if (cooldown_duration_ >= duration_since_last_warmup) {
-    return false;
-  }
-
-  if (mem_threshold_mb_ >= base::SysInfo::AmountOfPhysicalMemoryMB()) {
-    return false;
+    metrics_->page_independent_status |= 1 << 0;
   }
 
   if (BrowserHasSpareRenderer()) {
-    return false;
+    metrics_->page_independent_status |= 1 << 1;
   }
 
-  return true;
+  if (mem_threshold_mb_ >= base::SysInfo::AmountOfPhysicalMemoryMB()) {
+    metrics_->page_independent_status |= 1 << 2;
+  }
 }
 
-bool NavigationPredictorRendererWarmupClient::
-    IsEligibleForCrossNavigationWarmup(
-        const NavigationPredictorKeyedService::Prediction& prediction) const {
-  if (!use_navigation_predictions_) {
-    return false;
-  }
-
+void NavigationPredictorRendererWarmupClient::
+    CheckIsEligibleForCrossNavigationWarmup(
+        const NavigationPredictorKeyedService::Prediction& prediction) {
   url::Origin src_origin =
       url::Origin::Create(prediction.source_document_url().value());
 
@@ -159,7 +171,7 @@
   size_t examine_n_urls =
       std::min(urls.size(), static_cast<size_t>(examine_top_n_predictions_));
   if (examine_n_urls == 0) {
-    return false;
+    return;
   }
 
   int cross_origin_count = 0;
@@ -180,26 +192,54 @@
     }
   }
 
-  // Just in case there's very few links on a page, check against the threshold
-  // as a ratio. This may be helpful on redirector sites, like Cloudflare's DDoS
-  // checker.
-  double cross_origin_ratio = static_cast<double>(cross_origin_count) /
-                              static_cast<double>(examine_n_urls);
-  return cross_origin_ratio >= prediction_crosss_origin_threshold_;
+  // Just in case there's very few links on a page, use a ratio. This may be
+  // helpful on redirector sites, like Cloudflare's DDoS checker.
+  metrics_->cross_origin_links_ratio = static_cast<double>(cross_origin_count) /
+                                       static_cast<double>(examine_n_urls);
 }
 
-bool NavigationPredictorRendererWarmupClient::IsEligibleForDSEWarmup(
-    const NavigationPredictorKeyedService::Prediction& prediction) const {
-  if (!warmup_on_dse_) {
-    return false;
+void NavigationPredictorRendererWarmupClient::CheckIsEligibleForDSEWarmup(
+    const NavigationPredictorKeyedService::Prediction& prediction) {
+  metrics_->was_dse_srp = TemplateURLServiceFactory::GetForProfile(profile_)
+                              ->IsSearchResultsPageFromDefaultSearchProvider(
+                                  prediction.source_document_url().value());
+}
+
+void NavigationPredictorRendererWarmupClient::RecordMetricsAndMaybeDoWarmup(
+    content::WebContents* web_contents) {
+  bool eligible_on_common_criteria = metrics_->page_independent_status == 0;
+
+  bool eligible_for_cross_origin_warmup =
+      use_navigation_predictions_ &&
+      metrics_->cross_origin_links_ratio.has_value() &&
+      metrics_->cross_origin_links_ratio.value() >=
+          prediction_crosss_origin_threshold_;
+
+  bool eligible_for_dse_warmup = warmup_on_dse_ && metrics_->was_dse_srp;
+
+  bool do_warmup =
+      eligible_on_common_criteria &&
+      (eligible_for_cross_origin_warmup || eligible_for_dse_warmup);
+  metrics_->did_warmup = do_warmup;
+
+  // Record metrics in UKM.
+  ukm::builders::NavigationPredictorRendererWarmup builder(
+      web_contents->GetMainFrame()->GetPageUkmSourceId());
+  if (metrics_->cross_origin_links_ratio) {
+    builder.SetCrossOriginLinksRatio(
+        static_cast<int>(100.0 * metrics_->cross_origin_links_ratio.value()));
+  }
+  builder.SetDidWarmup(metrics_->did_warmup);
+  builder.SetPageIndependentStatusBitMask(metrics_->page_independent_status);
+  builder.SetWasDSESRP(metrics_->was_dse_srp);
+  builder.Record(ukm::UkmRecorder::Get());
+
+  metrics_.reset();
+
+  if (!do_warmup) {
+    return;
   }
 
-  return TemplateURLServiceFactory::GetForProfile(profile_)
-      ->IsSearchResultsPageFromDefaultSearchProvider(
-          prediction.source_document_url().value());
-}
-
-void NavigationPredictorRendererWarmupClient::RecordMetricsAndMaybeDoWarmup() {
   last_warmup_time_ = tick_clock_->NowTicks();
 
   if (counterfactual_) {
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client.h b/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client.h
index e33900f..88526879 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client.h
+++ b/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_NAVIGATION_PREDICTOR_NAVIGATION_PREDICTOR_RENDERER_WARMUP_CLIENT_H_
 #define CHROME_BROWSER_NAVIGATION_PREDICTOR_NAVIGATION_PREDICTOR_RENDERER_WARMUP_CLIENT_H_
 
+#include <memory>
+
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "base/optional.h"
@@ -14,6 +16,10 @@
 
 class Profile;
 
+namespace content {
+class WebContents;
+}
+
 // A client of Navigation Predictor that uses predictions to initiate a renderer
 // warmup (in the form of starting a spare renderer process) when it is likely
 // the user will soon do a cross-origin navigation.
@@ -40,23 +46,49 @@
   virtual bool BrowserHasSpareRenderer() const;
 
  private:
+  // Metrics per-prediction about how this class acts, for recording in UKM.
+  struct PredictionMetrics {
+    PredictionMetrics();
+    ~PredictionMetrics();
+
+    // A bitmask that records common criteria.
+    //   1 << 0 = Set if the feature is in a cooldown period following the last
+    //            renderer warmup.
+    //   1 << 1 = Set if the browser already had a spare renderer.
+    //   1 << 2 = Set if the device memory is below the experiment threshold.
+    size_t page_independent_status = 0;
+
+    // Represents the ratio of the links on a page that are cross-origin to the
+    // source document. Set when there are 1 or more links on a page.
+    base::Optional<double> cross_origin_links_ratio;
+
+    // Whether the source document was a search result page for the default
+    // search engine.
+    bool was_dse_srp = false;
+
+    // Set when all eligibility criteria are met, regardless of
+    // |counterfactual_|.
+    bool did_warmup = false;
+  };
+  std::unique_ptr<PredictionMetrics> metrics_;
+
   // Checks if there is already a spare renderer or we requested a spare
   // renderer too recently.
-  bool IsEligibleForWarmupOnCommonCriteria() const;
+  void CheckIsEligibleForWarmupOnCommonCriteria();
 
   // Checks if the |prediction| is eligible to trigger a renderer warmup based
   // on the number of predicted origins.
-  bool IsEligibleForCrossNavigationWarmup(
-      const NavigationPredictorKeyedService::Prediction& prediction) const;
+  void CheckIsEligibleForCrossNavigationWarmup(
+      const NavigationPredictorKeyedService::Prediction& prediction);
 
   // Checks if the |prediction| is eligible to trigger a renderer warmup based
   // on the current page being search results for the default search engine.
-  bool IsEligibleForDSEWarmup(
-      const NavigationPredictorKeyedService::Prediction& prediction) const;
+  void CheckIsEligibleForDSEWarmup(
+      const NavigationPredictorKeyedService::Prediction& prediction);
 
   // Records class state and metrics before checking |counterfactual_| and then
   // calling |DoRendererWarmpup| if |counterfactual_| is false.
-  void RecordMetricsAndMaybeDoWarmup();
+  void RecordMetricsAndMaybeDoWarmup(content::WebContents* web_contents);
 
   Profile* profile_;
 
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client_browsertest.cc b/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client_browsertest.cc
index c19d2a9c..5241b482 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client_browsertest.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client_browsertest.cc
@@ -12,11 +12,16 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/ukm/test_ukm_recorder.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_base.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/test_utils.h"
+#include "services/metrics/public/cpp/metrics_utils.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
+#include "services/metrics/public/cpp/ukm_source.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
@@ -44,6 +49,11 @@
     InProcessBrowserTest::SetUp();
   }
 
+  void SetUpOnMainThread() override {
+    InProcessBrowserTest::SetUpOnMainThread();
+    ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>();
+  }
+
   size_t SpareRendererCount() const {
     size_t count = 0;
     for (content::RenderProcessHost::iterator iter(
@@ -74,8 +84,18 @@
             {});
   }
 
+  void VerifyHasUKMEntry(const GURL& url) {
+    auto entries = ukm_recorder_->GetEntriesByName(
+        ukm::builders::NavigationPredictorRendererWarmup::kEntryName);
+    ASSERT_EQ(1U, entries.size());
+
+    const auto* entry = entries.front();
+    ukm_recorder_->ExpectEntrySourceHasUrl(entry, url);
+  }
+
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
+  std::unique_ptr<ukm::TestAutoSetUkmRecorder> ukm_recorder_;
 };
 
 IN_PROC_BROWSER_TEST_F(NavigationPredictorRendererWarmupClientBrowserTest,
@@ -83,13 +103,15 @@
   // Navigate to a site so that the default renderer is used.
   embedded_test_server()->ServeFilesFromSourceDirectory("chrome/test/data");
   ASSERT_TRUE(embedded_test_server()->Start());
-  ui_test_utils::NavigateToURL(browser(),
-                               embedded_test_server()->GetURL("/simple.html"));
 
+  GURL url = embedded_test_server()->GetURL("/simple.html");
+
+  ui_test_utils::NavigateToURL(browser(), url);
   MakeEligibleNavigationPrediction();
   base::RunLoop().RunUntilIdle();
 
   EXPECT_EQ(SpareRendererCount(), 1U);
+  VerifyHasUKMEntry(url);
 }
 
 IN_PROC_BROWSER_TEST_F(NavigationPredictorRendererWarmupClientBrowserTest,
@@ -97,8 +119,10 @@
   // Navigate to a site so that the default renderer is used.
   embedded_test_server()->ServeFilesFromSourceDirectory("chrome/test/data");
   ASSERT_TRUE(embedded_test_server()->Start());
-  ui_test_utils::NavigateToURL(browser(),
-                               embedded_test_server()->GetURL("/simple.html"));
+
+  GURL url = embedded_test_server()->GetURL("/simple.html");
+
+  ui_test_utils::NavigateToURL(browser(), url);
 
   MakeSpareRenderer();
   base::RunLoop().RunUntilIdle();
@@ -108,4 +132,5 @@
   base::RunLoop().RunUntilIdle();
 
   EXPECT_EQ(SpareRendererCount(), 1U);
+  VerifyHasUKMEntry(url);
 }
diff --git a/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client_unittest.cc b/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client_unittest.cc
index 1ec588f..b5cebd3 100644
--- a/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client_unittest.cc
+++ b/chrome/browser/navigation_predictor/navigation_predictor_renderer_warmup_client_unittest.cc
@@ -12,6 +12,11 @@
 #include "base/test/simple_test_tick_clock.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "components/ukm/test_ukm_recorder.h"
+#include "services/metrics/public/cpp/metrics_utils.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
+#include "services/metrics/public/cpp/ukm_source.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
@@ -25,10 +30,11 @@
     "NavigationPredictorRendererWarmup", base::FEATURE_DISABLED_BY_DEFAULT};
 
 NavigationPredictorKeyedService::Prediction CreateValidPrediction(
+    content::WebContents* web_contents,
     const GURL& src_url,
     const std::vector<GURL>& predicted_urls) {
   return NavigationPredictorKeyedService::Prediction(
-      nullptr, src_url, base::nullopt,
+      web_contents, src_url, base::nullopt,
       NavigationPredictorKeyedService::PredictionSource::
           kAnchorElementsParsedFromWebPage,
       predicted_urls);
@@ -77,6 +83,34 @@
     clock_.SetNowTicks(base::TimeTicks::Now());
   }
 
+  void VerifyNoUKM() {
+    auto entries = ukm_recorder_.GetEntriesByName(
+        ukm::builders::NavigationPredictorRendererWarmup::kEntryName);
+    EXPECT_TRUE(entries.empty());
+  }
+
+  void VerifyUKMEntry(const std::string& metric_name,
+                      base::Optional<int64_t> expected_value,
+                      size_t entry_index = 0) {
+    std::string format = "metric_name=%s, index=%zu";
+    SCOPED_TRACE(
+        base::StringPrintf(format.c_str(), metric_name.c_str(), entry_index));
+
+    auto entries = ukm_recorder_.GetEntriesByName(
+        ukm::builders::NavigationPredictorRendererWarmup::kEntryName);
+    ASSERT_EQ(entry_index + 1, entries.size());
+
+    const auto* entry = entries[entry_index];
+    const int64_t* value =
+        ukm::TestUkmRecorder::GetEntryMetric(entry, metric_name);
+    EXPECT_EQ(value != nullptr, expected_value.has_value());
+
+    if (!expected_value.has_value())
+      return;
+
+    EXPECT_EQ(*value, expected_value.value());
+  }
+
   TestNavigationPredictorRendererWarmupClient* client() {
     if (!client_) {
       client_ = std::make_unique<TestNavigationPredictorRendererWarmupClient>(
@@ -90,6 +124,7 @@
  private:
   base::SimpleTestTickClock clock_;
   std::unique_ptr<TestNavigationPredictorRendererWarmupClient> client_;
+  ukm::TestAutoSetUkmRecorder ukm_recorder_;
 };
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, SuccessCase_Search) {
@@ -107,8 +142,14 @@
       });
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kGoogleSearchURL), {}));
+      CreateValidPrediction(web_contents(), GURL(kGoogleSearchURL), {}));
   EXPECT_TRUE(client()->DidDoRendererWarmup());
+
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, base::nullopt);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 1);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 1);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, SuccessCase_CrossOrigin) {
@@ -126,8 +167,14 @@
       });
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kOriginA), {GURL(kOriginB)}));
+      CreateValidPrediction(web_contents(), GURL(kOriginA), {GURL(kOriginB)}));
   EXPECT_TRUE(client()->DidDoRendererWarmup());
+
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, 100);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 1);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 0);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, SuccessCase_AfterCooldown) {
@@ -145,16 +192,33 @@
       });
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kGoogleSearchURL), {}));
+      CreateValidPrediction(web_contents(), GURL(kGoogleSearchURL), {}));
   EXPECT_TRUE(client()->DidDoRendererWarmup());
 
+  // Verify first UKM entry.
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, base::nullopt,
+                 /*entry_index=*/0);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 1, /*entry_index=*/0);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0,
+                 /*entry_index=*/0);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 1, /*entry_index=*/0);
+
   client()->Reset();
 
   clock()->Advance(base::TimeDelta::FromMilliseconds(101));
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kGoogleSearchURL), {}));
+      CreateValidPrediction(web_contents(), GURL(kGoogleSearchURL), {}));
   EXPECT_TRUE(client()->DidDoRendererWarmup());
+
+  // Verify second UKM entry.
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, base::nullopt,
+                 /*entry_index=*/1);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 1, /*entry_index=*/1);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0,
+                 /*entry_index=*/1);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 1, /*entry_index=*/1);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, NullPrediction) {
@@ -173,6 +237,29 @@
 
   client()->OnPredictionUpdated(base::nullopt);
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  VerifyNoUKM();
+}
+
+TEST_F(NavigationPredictorRendererWarmupClientTest, NoWebContents) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      kNavigationPredictorRendererWarmup,
+      {
+          {"counterfactual", "false"},
+          {"mem_threshold_mb", "0"},
+          {"warmup_on_dse", "true"},
+          {"use_navigation_predictions", "true"},
+          {"examine_top_n_predictions", "10"},
+          {"prediction_crosss_origin_threshold", "0.5"},
+          {"cooldown_duration_ms", "60000"},
+      });
+
+  client()->OnPredictionUpdated(
+      CreateValidPrediction(nullptr, GURL(kOriginA), {GURL(kOriginB)}));
+  EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  VerifyNoUKM();
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, BadPredictionSrc) {
@@ -194,6 +281,8 @@
       NavigationPredictorKeyedService::PredictionSource::kExternalAndroidApp,
       {}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  VerifyNoUKM();
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, CoolDown) {
@@ -211,14 +300,28 @@
       });
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kGoogleSearchURL), {}));
+      CreateValidPrediction(web_contents(), GURL(kGoogleSearchURL), {}));
   EXPECT_TRUE(client()->DidDoRendererWarmup());
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, base::nullopt,
+                 /*entry_index=*/0);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 1, /*entry_index=*/0);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0,
+                 /*entry_index=*/0);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 1, /*entry_index=*/0);
 
   client()->Reset();
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kGoogleSearchURL), {}));
+      CreateValidPrediction(web_contents(), GURL(kGoogleSearchURL), {}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, base::nullopt,
+                 /*entry_index=*/1);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 0, /*entry_index=*/1);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0b0001,
+                 /*entry_index=*/1);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 1, /*entry_index=*/1);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, HasSpareRenderer) {
@@ -237,8 +340,14 @@
 
   client()->SetBrowserHasSpareRenderer(true);
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kGoogleSearchURL), {}));
+      CreateValidPrediction(web_contents(), GURL(kGoogleSearchURL), {}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, base::nullopt);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 0);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0b0010);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 1);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, FeatureOff) {
@@ -246,8 +355,10 @@
   scoped_feature_list.InitAndDisableFeature(kNavigationPredictorRendererWarmup);
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kGoogleSearchURL), {}));
+      CreateValidPrediction(web_contents(), GURL(kGoogleSearchURL), {}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  VerifyNoUKM();
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, DSEWarmupNotEnabled) {
@@ -265,8 +376,14 @@
       });
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kGoogleSearchURL), {}));
+      CreateValidPrediction(web_contents(), GURL(kGoogleSearchURL), {}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, base::nullopt);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 0);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 1);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, NotSearchURL) {
@@ -284,8 +401,14 @@
       });
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL("http://test.com/"), {}));
+      CreateValidPrediction(web_contents(), GURL("http://test.com/"), {}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, base::nullopt);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 0);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 0);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, InvalidCrossOrigins) {
@@ -303,8 +426,14 @@
       });
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kOriginA), {GURL()}));
+      CreateValidPrediction(web_contents(), GURL(kOriginA), {GURL()}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, 0);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 0);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 0);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, NonHTTPCrossOrigins) {
@@ -321,9 +450,15 @@
           {"cooldown_duration_ms", "60000"},
       });
 
-  client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kOriginA), {GURL("ftp://test.com")}));
+  client()->OnPredictionUpdated(CreateValidPrediction(
+      web_contents(), GURL(kOriginA), {GURL("ftp://test.com")}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, 0);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 0);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 0);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest,
@@ -341,9 +476,16 @@
           {"cooldown_duration_ms", "60000"},
       });
 
-  client()->OnPredictionUpdated(CreateValidPrediction(
-      GURL(kOriginA), {GURL(kOriginA), GURL(kOriginA), GURL(kOriginB)}));
+  client()->OnPredictionUpdated(
+      CreateValidPrediction(web_contents(), GURL(kOriginA),
+                            {GURL(kOriginA), GURL(kOriginA), GURL(kOriginB)}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, 33);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 0);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 0);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, CrossOriginNotEnabled) {
@@ -361,8 +503,14 @@
       });
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kOriginA), {GURL(kOriginB)}));
+      CreateValidPrediction(web_contents(), GURL(kOriginA), {GURL(kOriginB)}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, 100);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 0);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 0);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, Counterfactual) {
@@ -380,8 +528,14 @@
       });
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kGoogleSearchURL), {}));
+      CreateValidPrediction(web_contents(), GURL(kGoogleSearchURL), {}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, base::nullopt);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 1);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 1);
 }
 
 TEST_F(NavigationPredictorRendererWarmupClientTest, MemThreshold) {
@@ -390,7 +544,7 @@
       kNavigationPredictorRendererWarmup,
       {
           {"counterfactual", "true"},
-          {"mem_threshold_mb", "99999999999"},
+          {"mem_threshold_mb", "999999999"},
           {"warmup_on_dse", "true"},
           {"use_navigation_predictions", "true"},
           {"examine_top_n_predictions", "10"},
@@ -399,8 +553,14 @@
       });
 
   client()->OnPredictionUpdated(
-      CreateValidPrediction(GURL(kGoogleSearchURL), {}));
+      CreateValidPrediction(web_contents(), GURL(kGoogleSearchURL), {}));
   EXPECT_FALSE(client()->DidDoRendererWarmup());
+
+  using UkmEntry = ukm::builders::NavigationPredictorRendererWarmup;
+  VerifyUKMEntry(UkmEntry::kCrossOriginLinksRatioName, base::nullopt);
+  VerifyUKMEntry(UkmEntry::kDidWarmupName, 0);
+  VerifyUKMEntry(UkmEntry::kPageIndependentStatusBitMaskName, 0b0100);
+  VerifyUKMEntry(UkmEntry::kWasDSESRPName, 1);
 }
 
 }  // namespace
diff --git a/chrome/browser/password_check/android/password_check_manager.cc b/chrome/browser/password_check/android/password_check_manager.cc
index 90dc5e93..0c6e47d4 100644
--- a/chrome/browser/password_check/android/password_check_manager.cc
+++ b/chrome/browser/password_check/android/password_check_manager.cc
@@ -306,7 +306,6 @@
     FulfillPrecondition(kScriptsCachePrewarmed);
     return;
   }
-
   ResetPrecondition(kScriptsCachePrewarmed);
   password_script_fetcher_->RefreshScriptsIfNecessary(base::BindOnce(
       &PasswordCheckManager::OnScriptsFetched, base::Unretained(this)));
@@ -318,13 +317,11 @@
     // Inform the UI about compromised credentials another time because it was
     // not allowed to generate UI before the availability of password scripts is
     // known.
+    FulfillPrecondition(kKnownCredentialsFetched);
     observer_->OnCompromisedCredentialsChanged(
         credentials_count_to_notify_.value());
     credentials_count_to_notify_.reset();
   }
-
-  if (was_start_requested_)
-    StartCheck();
 }
 
 bool PasswordCheckManager::ShouldOfferAutomaticPasswordChange() const {
@@ -353,5 +350,5 @@
 }
 
 void PasswordCheckManager::ResetPrecondition(CheckPreconditions condition) {
-  fulfilled_preconditions_ &= !condition;
+  fulfilled_preconditions_ &= ~condition;
 }
diff --git a/chrome/browser/password_check/android/password_check_manager_unittest.cc b/chrome/browser/password_check/android/password_check_manager_unittest.cc
index b616d550..7c32d27aa2 100644
--- a/chrome/browser/password_check/android/password_check_manager_unittest.cc
+++ b/chrome/browser/password_check/android/password_check_manager_unittest.cc
@@ -299,6 +299,39 @@
   EXPECT_NE(0.0, manager().GetLastCheckTimestamp().ToDoubleT());
 }
 
+TEST_F(PasswordCheckManagerTest,
+       RunCheckAfterLastInitializationAutomaticChangeOn) {
+  // Enable password sync
+  sync_service().SetActiveDataTypes(syncer::ModelTypeSet(syncer::PASSWORDS));
+  feature_list().InitAndEnableFeature(
+      password_manager::features::kPasswordChangeInSettings);
+  EXPECT_CALL(mock_observer(), OnPasswordCheckStatusChanged).Times(AtLeast(1));
+  EXPECT_CALL(mock_observer(), OnSavedPasswordsFetched(1));
+  store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1));
+  InitializeManager();
+
+  // Initialization is incomplete, so check shouldn't run.
+  manager().StartCheck();  // Try to start a check — has no immediate effect.
+  service()->set_state_and_notify(State::kIdle);
+  // Since check hasn't started, the last completion time should remain 0.
+  EXPECT_EQ(0.0, manager().GetLastCheckTimestamp().ToDoubleT());
+
+  // Fetch scripts availability.
+  EXPECT_CALL(fetcher(), RefreshScriptsIfNecessary)
+      .WillOnce(Invoke(
+          [](base::OnceClosure callback) { std::move(callback).Run(); }));
+
+  manager().RefreshScripts();
+
+  // Complete pending initialization. The check should run now.
+  EXPECT_CALL(mock_observer(), OnCompromisedCredentialsChanged(0))
+      .Times(AtLeast(1));
+  RunUntilIdle();
+  service()->set_state_and_notify(State::kIdle);  // Complete check, if any.
+  // Check should have started and the last completion time be non-zero.
+  EXPECT_NE(0.0, manager().GetLastCheckTimestamp().ToDoubleT());
+}
+
 TEST_F(PasswordCheckManagerTest, CorrectlyCreatesUIStructForSiteCredential) {
   InitializeManager();
   store().AddLogin(MakeSavedPassword(kExampleCom, kUsername1));
diff --git a/chrome/browser/platform_util_win.cc b/chrome/browser/platform_util_win.cc
index 0f72f94..522a4ac 100644
--- a/chrome/browser/platform_util_win.cc
+++ b/chrome/browser/platform_util_win.cc
@@ -13,10 +13,12 @@
 #include <stddef.h>
 #include <wrl/client.h>
 
+#include "base/base_paths.h"
 #include "base/bind.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/logging.h"
+#include "base/path_service.h"
 #include "base/stl_util.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -107,8 +109,15 @@
   if (escaped_url.length() > kMaxUrlLength)
     return;
 
+  // Specify the user's %TMP% directory as the CWD so that any new proc spawned
+  // does not inherit this proc's CWD. Without this, uninstalls may be broken by
+  // a long-lived child proc that holds a handle to the browser's version
+  // directory.
+  base::FilePath temp_dir;
+  base::PathService::Get(base::DIR_TEMP, &temp_dir);
   if (reinterpret_cast<ULONG_PTR>(ShellExecuteA(NULL, "open",
-                                                escaped_url.c_str(), NULL, NULL,
+                                                escaped_url.c_str(), NULL,
+                                                temp_dir.AsUTF8Unsafe().c_str(),
                                                 SW_SHOWNORMAL)) <= 32) {
     // On failure, it may be good to display a message to the user.
     // https://crbug.com/727913
diff --git a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc
index 72e87b4..7f5f3e28 100644
--- a/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc
+++ b/chrome/browser/prerender/isolated/isolated_prerender_tab_helper_unittest.cc
@@ -149,7 +149,7 @@
         SetDataSaverEnabledForTesting(profile()->GetPrefs(), enabled);
   }
 
-  void MakeNavigationPrediction(const content::WebContents* web_contents,
+  void MakeNavigationPrediction(content::WebContents* web_contents,
                                 const GURL& doc_url,
                                 const std::vector<GURL>& predicted_urls) {
     NavigationPredictorKeyedServiceFactory::GetForProfile(profile())
diff --git a/chrome/browser/resources/optimize_webui_test.py b/chrome/browser/resources/optimize_webui_test.py
index ed92727a..600a1bc 100755
--- a/chrome/browser/resources/optimize_webui_test.py
+++ b/chrome/browser/resources/optimize_webui_test.py
@@ -83,19 +83,20 @@
 
   def _write_v3_files_with_resources_to_src_dir(self):
     resources_path = os.path.join(
-        _HERE_DIR.replace('\\', '/'), 'gen', 'ui', 'webui', 'resources', 'js',
-        'fake_resource.m.js')
+        _HERE_DIR.replace('\\', '/'), 'gen', 'ui', 'webui', 'resources',
+        'preprocessed', 'js', 'fake_resource.js')
     os.makedirs(os.path.dirname(resources_path))
+
     self._tmp_dirs.append('gen')
     with open(resources_path, 'w') as tmp_file:
       tmp_file.write("alert('hello from shared resource');")
 
     self._write_file_to_src_dir('element.js', '''
-import 'chrome://resources/js/action_link.js';
+import 'chrome://resources/js/fake_resource.js';
 alert('yay');
 ''')
     self._write_file_to_src_dir('element_in_dir/element_in_dir.js', '''
-import {foo} from 'chrome://resources/js/fake_resource.m.js';
+import {foo} from 'chrome://resources/js/fake_resource.js';
 import '../strings.m.js';
 alert('hello from element_in_dir');
 ''')
@@ -174,10 +175,8 @@
     self.assertIn(os.path.normpath('element_in_dir/element_in_dir.js'),
                   depfile_d)
     self.assertIn(
-        os.path.normpath('../../../../ui/webui/resources/js/action_link.js'),
-        depfile_d)
-    self.assertIn(
-        os.path.normpath('../gen/ui/webui/resources/js/fake_resource.m.js'),
+        os.path.normpath(
+            '../gen/ui/webui/resources/preprocessed/js/fake_resource.js'),
         depfile_d)
 
   def testV3MultiBundleOptimize(self):
diff --git a/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckProperties.java b/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckProperties.java
index 69561b92..fe15cde 100644
--- a/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckProperties.java
+++ b/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckProperties.java
@@ -73,7 +73,7 @@
                 assert false : "Unknown PasswordCheckUIStatus value.";
         }
         // Never reached.
-        return 0;
+        return PasswordsState.UNCHECKED;
     }
 
     static @PasswordsStatus int passwordsStateToNative(@PasswordsState int state) {
@@ -135,12 +135,12 @@
                 return SafeBrowsingState.DISABLED_BY_ADMIN;
             case SafeBrowsingStatus.DISABLED_BY_EXTENSION:
                 assert false : "Safe Browsing cannot be disabled by extension on Android.";
-                return 0;
+                return SafeBrowsingState.UNCHECKED;
             default:
                 assert false : "Unknown SafeBrowsingStatus value.";
         }
         // Never reached.
-        return 0;
+        return SafeBrowsingState.UNCHECKED;
     }
 
     @IntDef({UpdatesState.UNCHECKED, UpdatesState.CHECKING, UpdatesState.UPDATED,
diff --git a/chrome/browser/share/DEPS b/chrome/browser/share/DEPS
index 03b773f..c99df3bfc 100644
--- a/chrome/browser/share/DEPS
+++ b/chrome/browser/share/DEPS
@@ -23,5 +23,5 @@
   "+content/public/android/java/src/org/chromium/content_public/browser/WebContents.java",
 
   # TODO(crbug/1090917): Remove this dependency once the STTS java code is moved.
-  "+chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfShareActivity.java",
+  "+chrome/android/java/src/org/chromium/chrome/browser/send_tab_to_self/SendTabToSelfCoordinator.java",
 ]
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProvider.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProvider.java
index 67c87bc..c2da26f 100644
--- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProvider.java
+++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProvider.java
@@ -21,7 +21,8 @@
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.preferences.Pref;
 import org.chromium.chrome.browser.profiles.Profile;
-import org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfShareActivity;
+import org.chromium.chrome.browser.send_tab_to_self.SendTabToSelfCoordinator;
+import org.chromium.chrome.browser.settings.SettingsLauncher;
 import org.chromium.chrome.browser.share.ChromeShareExtras;
 import org.chromium.chrome.browser.share.link_to_text.LinkToTextCoordinator;
 import org.chromium.chrome.browser.share.qrcode.QrCodeCoordinator;
@@ -55,6 +56,8 @@
     private final ShareSheetBottomSheetContent mBottomSheetContent;
     private final ShareParams mShareParams;
     private final Callback<Tab> mPrintTabCallback;
+    private final SettingsLauncher mSettingsLauncher;
+    private final boolean mIsSyncEnabled;
     private final long mShareStartTime;
     private final List<FirstPartyOption> mOrderedFirstPartyOptions;
     private final ChromeOptionShareCallback mChromeOptionShareCallback;
@@ -79,7 +82,8 @@
     ChromeProvidedSharingOptionsProvider(Activity activity, Supplier<Tab> tabProvider,
             BottomSheetController bottomSheetController,
             ShareSheetBottomSheetContent bottomSheetContent, ShareParams shareParams,
-            ChromeShareExtras chromeShareExtras, Callback<Tab> printTab, long shareStartTime,
+            ChromeShareExtras chromeShareExtras, Callback<Tab> printTab,
+            SettingsLauncher settingsLauncher, boolean isSyncEnabled, long shareStartTime,
             ChromeOptionShareCallback chromeOptionShareCallback) {
         mActivity = activity;
         mTabProvider = tabProvider;
@@ -87,6 +91,8 @@
         mBottomSheetContent = bottomSheetContent;
         mShareParams = shareParams;
         mPrintTabCallback = printTab;
+        mSettingsLauncher = settingsLauncher;
+        mIsSyncEnabled = isSyncEnabled;
         mShareStartTime = shareStartTime;
         mOrderedFirstPartyOptions = new ArrayList<>();
         initializeFirstPartyOptionsInOrder();
@@ -296,14 +302,15 @@
                 .setIcon(R.drawable.send_tab, R.string.send_tab_to_self_share_activity_title)
                 .setFeatureNameForMetrics("SharingHubAndroid.SendTabToSelfSelected")
                 .setOnClickCallback((view) -> {
-                    SendTabToSelfShareActivity.actionHandler(mActivity, mUrl,
-                            mShareParams.getTitle(),
-                            mTabProvider.get()
-                                    .getWebContents()
-                                    .getNavigationController()
-                                    .getVisibleEntry()
-                                    .getTimestamp(),
-                            mBottomSheetController);
+                    SendTabToSelfCoordinator sttsCoordinator =
+                            new SendTabToSelfCoordinator(mActivity, mUrl, mShareParams.getTitle(),
+                                    mBottomSheetController, mSettingsLauncher, mIsSyncEnabled,
+                                    mTabProvider.get()
+                                            .getWebContents()
+                                            .getNavigationController()
+                                            .getVisibleEntry()
+                                            .getTimestamp());
+                    sttsCoordinator.show();
                 })
                 .build();
     }
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
index 108d018c..99292e5 100644
--- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
+++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
@@ -23,6 +23,7 @@
 import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
 import org.chromium.chrome.browser.lifecycle.ConfigurationChangedObserver;
 import org.chromium.chrome.browser.multiwindow.MultiWindowUtils;
+import org.chromium.chrome.browser.settings.SettingsLauncher;
 import org.chromium.chrome.browser.share.ChromeShareExtras;
 import org.chromium.chrome.browser.share.ShareHelper;
 import org.chromium.chrome.browser.tab.Tab;
@@ -54,6 +55,8 @@
     private final Supplier<Tab> mTabProvider;
     private final ShareSheetPropertyModelBuilder mPropertyModelBuilder;
     private final Callback<Tab> mPrintTabCallback;
+    private final SettingsLauncher mSettingsLauncher;
+    private final boolean mIsSyncEnabled;
     private long mShareStartTime;
     private boolean mExcludeFirstParty;
     private boolean mIsMultiWindow;
@@ -81,13 +84,15 @@
     public ShareSheetCoordinator(BottomSheetController controller,
             ActivityLifecycleDispatcher lifecycleDispatcher, Supplier<Tab> tabProvider,
             ShareSheetPropertyModelBuilder modelBuilder, Callback<Tab> printTab,
-            LargeIconBridge iconBridge) {
+            LargeIconBridge iconBridge, SettingsLauncher settingsLauncher, boolean isSyncEnabled) {
         mBottomSheetController = controller;
         mLifecycleDispatcher = lifecycleDispatcher;
         mLifecycleDispatcher.register(this);
         mTabProvider = tabProvider;
         mPropertyModelBuilder = modelBuilder;
         mPrintTabCallback = printTab;
+        mSettingsLauncher = settingsLauncher;
+        mIsSyncEnabled = isSyncEnabled;
         mBottomSheetObserver = new EmptyBottomSheetObserver() {
             @Override
             public void onSheetContentChanged(BottomSheetContent bottomSheet) {
@@ -178,7 +183,7 @@
         }
         mChromeProvidedSharingOptionsProvider = new ChromeProvidedSharingOptionsProvider(activity,
                 mTabProvider, mBottomSheetController, mBottomSheet, shareParams, chromeShareExtras,
-                mPrintTabCallback, mShareStartTime, this);
+                mPrintTabCallback, mSettingsLauncher, mIsSyncEnabled, mShareStartTime, this);
         mIsMultiWindow = MultiWindowUtils.getInstance().isInMultiWindowMode(activity);
 
         return mChromeProvidedSharingOptionsProvider.getPropertyModels(
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java
index e15e9f7..71ed137d 100644
--- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java
+++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ChromeProvidedSharingOptionsProviderTest.java
@@ -314,6 +314,8 @@
                 new ShareParams.Builder(null, "", "").build(),
                 new ChromeShareExtras.Builder().build(),
                 /*TabPrinterDelegate=*/null,
+                /*settingsLauncher=*/null,
+                /*syncState=*/false,
                 /*shareStartTime=*/0, mShareSheetCoordinator);
     }
 
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java
index cb39e8a..8ea6f4b 100644
--- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java
+++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinatorTest.java
@@ -99,7 +99,7 @@
                 .thenReturn(thirdPartyPropertyModels);
 
         mShareSheetCoordinator = new ShareSheetCoordinator(mController, mLifecycleDispatcher, null,
-                mPropertyModelBuilder, null, new MockLargeIconBridge());
+                mPropertyModelBuilder, null, new MockLargeIconBridge(), null, false);
     }
 
     @Test
diff --git a/chrome/browser/sync/test/integration/wallet_helper.cc b/chrome/browser/sync/test/integration/wallet_helper.cc
index 2d9f9e1..b16aac6 100644
--- a/chrome/browser/sync/test/integration/wallet_helper.cc
+++ b/chrome/browser/sync/test/integration/wallet_helper.cc
@@ -39,6 +39,7 @@
 // Constants for the credit card.
 const int kDefaultCardExpMonth = 8;
 const int kDefaultCardExpYear = 2087;
+const int kDefaultInstrumentId = 123;
 const char kDefaultCardLastFour[] = "1234";
 const char kDefaultCardName[] = "Patrick Valenzuela";
 const sync_pb::WalletMaskedCreditCard_WalletCardType kDefaultCardType =
@@ -368,6 +369,7 @@
   credit_card->set_name_on_card(kDefaultCardName);
   credit_card->set_status(sync_pb::WalletMaskedCreditCard::VALID);
   credit_card->set_type(kDefaultCardType);
+  credit_card->set_instrument_id(kDefaultInstrumentId);
   if (!billing_address_id.empty()) {
     credit_card->set_billing_address_id(billing_address_id);
   }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java
index 89f4b92..a3d356f 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CriticalPersistedTabData.java
@@ -244,7 +244,7 @@
         return "Critical";
     }
 
-    private static @TabLaunchType int getLaunchType(
+    private static @Nullable @TabLaunchType Integer getLaunchType(
             CriticalPersistedTabDataProto.LaunchTypeAtCreation protoLaunchType) {
         switch (protoLaunchType) {
             case FROM_LINK:
@@ -279,7 +279,7 @@
                 assert false : "Unexpected deserialization of LaunchAtCreationType: "
                                + protoLaunchType;
                 // shouldn't happen
-                return -1;
+                return null;
         }
     }
 
diff --git a/chrome/browser/test_dummy/internal/android/java/src/org/chromium/chrome/browser/test_dummy/TestDummyImpl.java b/chrome/browser/test_dummy/internal/android/java/src/org/chromium/chrome/browser/test_dummy/TestDummyImpl.java
index 5ac0dfc..0e70a7a9 100644
--- a/chrome/browser/test_dummy/internal/android/java/src/org/chromium/chrome/browser/test_dummy/TestDummyImpl.java
+++ b/chrome/browser/test_dummy/internal/android/java/src/org/chromium/chrome/browser/test_dummy/TestDummyImpl.java
@@ -23,7 +23,8 @@
 public class TestDummyImpl implements TestDummy {
     private static final String TAG = "TestDummyImpl";
 
-    @IntDef({TestCase.EXECUTE_JAVA, TestCase.EXECUTE_NATIVE})
+    @IntDef({TestCase.EXECUTE_JAVA, TestCase.EXECUTE_NATIVE, TestCase.LOAD_JAVA_RESOURCE,
+            TestCase.LOAD_NATIVE_RESOURCE})
     @Retention(RetentionPolicy.SOURCE)
     private @interface TestCase {
         int EXECUTE_JAVA = 0;
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc
index f304cdd..7bb45864 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.cc
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -196,14 +196,14 @@
   return helper->GetSecurityLevel();
 }
 
-std::string ChromeAutofillClient::GetPageLanguage() const {
+const translate::LanguageState* ChromeAutofillClient::GetLanguageState() {
   // TODO(crbug.com/912597): iOS vs other platforms extracts language from
   // the top level frame vs whatever frame directly holds the form.
   auto* translate_manager =
       ChromeTranslateClient::GetManagerFromWebContents(web_contents());
   if (translate_manager)
-    return translate_manager->GetLanguageState().original_language();
-  return std::string();
+    return &translate_manager->GetLanguageState();
+  return nullptr;
 }
 
 std::string ChromeAutofillClient::GetVariationConfigCountryCode() const {
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.h b/chrome/browser/ui/autofill/chrome_autofill_client.h
index bd04c2ff..144f8ae 100644
--- a/chrome/browser/ui/autofill/chrome_autofill_client.h
+++ b/chrome/browser/ui/autofill/chrome_autofill_client.h
@@ -65,7 +65,7 @@
   AddressNormalizer* GetAddressNormalizer() override;
   const GURL& GetLastCommittedURL() override;
   security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
-  std::string GetPageLanguage() const override;
+  const translate::LanguageState* GetLanguageState() override;
   std::string GetVariationConfigCountryCode() const override;
   std::unique_ptr<InternalAuthenticator> CreateCreditCardInternalAuthenticator(
       content::RenderFrameHost* rfh) override;
diff --git a/chrome/browser/ui/passwords/well_known_change_password_navigation_throttle.cc b/chrome/browser/ui/passwords/well_known_change_password_navigation_throttle.cc
index 9fbd70c..8d8bec5 100644
--- a/chrome/browser/ui/passwords/well_known_change_password_navigation_throttle.cc
+++ b/chrome/browser/ui/passwords/well_known_change_password_navigation_throttle.cc
@@ -71,7 +71,7 @@
   // password url first. We should only check the feature flag when the feature
   // would be used. Otherwise the we would not see a difference between control
   // and experiment groups on the dashboards.
-  if (IsWellKnownChangePasswordUrl(url) &&
+  if (handle->IsInMainFrame() && IsWellKnownChangePasswordUrl(url) &&
       base::FeatureList::IsEnabled(
           password_manager::features::kWellKnownChangePassword)) {
     return base::WrapUnique(
diff --git a/chrome/browser/ui/passwords/well_known_change_password_navigation_throttle_unittest.cc b/chrome/browser/ui/passwords/well_known_change_password_navigation_throttle_unittest.cc
index b8e7710..25a5c8b 100644
--- a/chrome/browser/ui/passwords/well_known_change_password_navigation_throttle_unittest.cc
+++ b/chrome/browser/ui/passwords/well_known_change_password_navigation_throttle_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright 2018 The Chromium Authors. All rights reserved.
+// Copyright 2020 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 #include "chrome/browser/ui/passwords/well_known_change_password_navigation_throttle.h"
@@ -7,7 +7,10 @@
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "components/password_manager/core/common/password_manager_features.h"
 #include "content/public/browser/navigation_throttle.h"
+#include "content/public/browser/render_frame_host.h"
 #include "content/public/test/mock_navigation_handle.h"
+#include "content/public/test/navigation_simulator.h"
+#include "content/public/test/test_renderer_host.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
@@ -22,6 +25,14 @@
         password_manager::features::kWellKnownChangePassword, flag_enabled);
   }
 
+  void SetUp() override {
+    ChromeRenderViewHostTestHarness::SetUp();
+    content::RenderFrameHostTester::For(main_rfh())
+        ->InitializeRenderFrameIfNeeded();
+    subframe_ = content::RenderFrameHostTester::For(main_rfh())
+                    ->AppendChild("subframe");
+  }
+
   ~WellKnownChangePasswordNavigationThrottleTest() override = default;
 
   std::unique_ptr<WellKnownChangePasswordNavigationThrottle>
@@ -31,8 +42,16 @@
         &handle);
   }
 
+  std::unique_ptr<WellKnownChangePasswordNavigationThrottle>
+  CreateNavigationThrottleForUrlAndSubframe(const GURL& url) {
+    content::MockNavigationHandle handle(url, subframe_);
+    return WellKnownChangePasswordNavigationThrottle::MaybeCreateThrottleFor(
+        &handle);
+  }
+
  private:
   base::test::ScopedFeatureList scoped_features_;
+  content::RenderFrameHost* subframe_ = nullptr;
 };
 
 TEST_P(WellKnownChangePasswordNavigationThrottleTest,
@@ -48,7 +67,7 @@
 }
 
 TEST_P(WellKnownChangePasswordNavigationThrottleTest,
-       NeverCreateNavigationThrottle) {
+       NeverCreateNavigationThrottle_DifferentUrl) {
   GURL url("https://google.com/.well-known/time");
   EXPECT_FALSE(CreateNavigationThrottleForUrl(url));
 
@@ -62,6 +81,19 @@
   EXPECT_FALSE(CreateNavigationThrottleForUrl(url));
 }
 
+// A WellKnownChangePasswordNavigationThrottle should never be created for a
+// navigation initiated by a subframe.
+TEST_P(WellKnownChangePasswordNavigationThrottleTest,
+       NeverCreateNavigationThrottle_Subframe) {
+  // change-password url without trailing slash
+  GURL url("https://google.com/.well-known/change-password");
+  EXPECT_EQ(CreateNavigationThrottleForUrlAndSubframe(url), nullptr);
+
+  // change-password url with trailing slash
+  url = GURL("https://google.com/.well-known/change-password/");
+  EXPECT_EQ(CreateNavigationThrottleForUrlAndSubframe(url), nullptr);
+}
+
 INSTANTIATE_TEST_SUITE_P(All,
                          WellKnownChangePasswordNavigationThrottleTest,
                          testing::Bool());
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index c108cfd..45c4d4c 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-master-1600084447-654ce493c2d2b8d13e6243ff3cb852a603e3ef72.profdata
+chrome-linux-master-1600106373-71253587ca194e48d78c58c419f94bf1bf8da7c5.profdata
diff --git a/chrome/installer/mini_installer/mini_installer.cc b/chrome/installer/mini_installer/mini_installer.cc
index 1c94fd3..d01bb78c 100644
--- a/chrome/installer/mini_installer/mini_installer.cc
+++ b/chrome/installer/mini_installer/mini_installer.cc
@@ -757,6 +757,11 @@
   HANDLE find = ::FindFirstFile(path->get(), &find_data);
   if (find != INVALID_HANDLE_VALUE) {
     do {
+      // Chrome never creates files/directories with reparse points (i.e.,
+      // mounted folders, links, etc), so never try to delete them.
+      if (find_data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
+        continue;
+
       // Use the short name if available to make the most of our buffer.
       const wchar_t* name = find_data.cAlternateFileName[0]
                                 ? find_data.cAlternateFileName
@@ -768,12 +773,10 @@
       if (!path->append(name))
         continue;  // Continue in spite of too long names.
 
-      if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
-          !(find_data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) {
+      if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
         RecursivelyDeleteDirectory(path);
-      } else {
+      else
         ::DeleteFile(path->get());
-      }
     } while (::FindNextFile(find, &find_data));
     ::FindClose(find);
   }
@@ -803,11 +806,12 @@
 
   PathString path;
   do {
-    // Skip over directories that have reparse points, since these represent
-    // such things as mounted folders, links, etc, and were therefore not
-    // created by a previous run of this installer.
-    if ((find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
-        !(find_data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)) {
+    // Chrome never creates files/directories with reparse points (i.e., mounted
+    // folders, links, etc), so never try to delete them.
+    if (find_data.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
+      continue;
+
+    if (find_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
       // Use the short name if available to make the most of our buffer.
       const wchar_t* name = find_data.cAlternateFileName[0]
                                 ? find_data.cAlternateFileName
diff --git a/chromeos/components/telemetry_extension_ui/diagnostics_service.cc b/chromeos/components/telemetry_extension_ui/diagnostics_service.cc
index a020ee7..ab01c60 100644
--- a/chromeos/components/telemetry_extension_ui/diagnostics_service.cc
+++ b/chromeos/components/telemetry_extension_ui/diagnostics_service.cc
@@ -176,4 +176,18 @@
           std::move(callback)));
 }
 
+void DiagnosticsService::RunNvmeSelfTestRoutine(
+    health::mojom::NvmeSelfTestTypeEnum nvme_self_test_type,
+    RunNvmeSelfTestRoutineCallback callback) {
+  GetService()->RunNvmeSelfTestRoutine(
+      converters::Convert(nvme_self_test_type),
+      base::BindOnce(
+          [](health::mojom::DiagnosticsService::RunNvmeSelfTestRoutineCallback
+                 callback,
+             cros_healthd::mojom::RunRoutineResponsePtr ptr) {
+            std::move(callback).Run(converters::ConvertPtr(std::move(ptr)));
+          },
+          std::move(callback)));
+}
+
 }  // namespace chromeos
diff --git a/chromeos/components/telemetry_extension_ui/diagnostics_service.h b/chromeos/components/telemetry_extension_ui/diagnostics_service.h
index 643596f..a3759b3 100644
--- a/chromeos/components/telemetry_extension_ui/diagnostics_service.h
+++ b/chromeos/components/telemetry_extension_ui/diagnostics_service.h
@@ -54,6 +54,9 @@
   void RunNvmeWearLevelRoutine(
       uint32_t wear_level_threshold,
       RunNvmeWearLevelRoutineCallback callback) override;
+  void RunNvmeSelfTestRoutine(
+      health::mojom::NvmeSelfTestTypeEnum nvme_self_test_type,
+      RunNvmeSelfTestRoutineCallback callback) override;
 
   // Ensures that |service_| created and connected to the
   // CrosHealthdProbeService.
diff --git a/chromeos/components/telemetry_extension_ui/diagnostics_service_converters.cc b/chromeos/components/telemetry_extension_ui/diagnostics_service_converters.cc
index 79f8de7..bed425c3 100644
--- a/chromeos/components/telemetry_extension_ui/diagnostics_service_converters.cc
+++ b/chromeos/components/telemetry_extension_ui/diagnostics_service_converters.cc
@@ -188,5 +188,19 @@
       static_cast<int>(cros_healthd::mojom::AcPowerStatusEnum::kMaxValue) + 1);
 }
 
+cros_healthd::mojom::NvmeSelfTestTypeEnum Convert(
+    health::mojom::NvmeSelfTestTypeEnum input) {
+  switch (input) {
+    case health::mojom::NvmeSelfTestTypeEnum::kShortSelfTest:
+      return cros_healthd::mojom::NvmeSelfTestTypeEnum::kShortSelfTest;
+    case health::mojom::NvmeSelfTestTypeEnum::kLongSelfTest:
+      return cros_healthd::mojom::NvmeSelfTestTypeEnum::kLongSelfTest;
+  }
+  NOTREACHED();
+  return static_cast<cros_healthd::mojom::NvmeSelfTestTypeEnum>(
+      static_cast<int>(cros_healthd::mojom::NvmeSelfTestTypeEnum::kMaxValue) +
+      1);
+}
+
 }  // namespace converters
 }  // namespace chromeos
diff --git a/chromeos/components/telemetry_extension_ui/diagnostics_service_converters.h b/chromeos/components/telemetry_extension_ui/diagnostics_service_converters.h
index 8937f07b..18aa2ac6 100644
--- a/chromeos/components/telemetry_extension_ui/diagnostics_service_converters.h
+++ b/chromeos/components/telemetry_extension_ui/diagnostics_service_converters.h
@@ -59,6 +59,9 @@
 cros_healthd::mojom::AcPowerStatusEnum Convert(
     health::mojom::AcPowerStatusEnum input);
 
+cros_healthd::mojom::NvmeSelfTestTypeEnum Convert(
+    health::mojom::NvmeSelfTestTypeEnum input);
+
 }  // namespace converters
 }  // namespace chromeos
 
diff --git a/chromeos/components/telemetry_extension_ui/diagnostics_service_converters_unittest.cc b/chromeos/components/telemetry_extension_ui/diagnostics_service_converters_unittest.cc
index b21b8a0..0150e5a 100644
--- a/chromeos/components/telemetry_extension_ui/diagnostics_service_converters_unittest.cc
+++ b/chromeos/components/telemetry_extension_ui/diagnostics_service_converters_unittest.cc
@@ -76,5 +76,15 @@
             cros_healthd::AcPowerStatusEnum::kDisconnected);
 }
 
+TEST(DiagnosticsServiceConvertersTest, ConvertNvmeSelfTestTypeEnum) {
+  namespace cros_healthd = ::chromeos::cros_healthd::mojom;
+  namespace health = ::chromeos::health::mojom;
+
+  EXPECT_EQ(Convert(health::NvmeSelfTestTypeEnum::kShortSelfTest),
+            cros_healthd::NvmeSelfTestTypeEnum::kShortSelfTest);
+  EXPECT_EQ(Convert(health::NvmeSelfTestTypeEnum::kLongSelfTest),
+            cros_healthd::NvmeSelfTestTypeEnum::kLongSelfTest);
+}
+
 }  // namespace converters
 }  // namespace chromeos
diff --git a/chromeos/components/telemetry_extension_ui/mojom/diagnostics_service.mojom b/chromeos/components/telemetry_extension_ui/mojom/diagnostics_service.mojom
index 5f3f229d..728545a4 100644
--- a/chromeos/components/telemetry_extension_ui/mojom/diagnostics_service.mojom
+++ b/chromeos/components/telemetry_extension_ui/mojom/diagnostics_service.mojom
@@ -168,6 +168,21 @@
   //                routine.
   RunNvmeWearLevelRoutine(uint32 wear_level_threshold)
       => (RunRoutineResponse response);
+
+  // Requests that the NvmeSelfTest routine is created and started on the
+  // platform. This routine launches the NVMe self-test, a tool to perform
+  // necessary tests to observe the performance and the parameters. This routine
+  // is only available if GetAvailableRoutines returned kNvmeSelfTest.
+  //
+  // The request:
+  // * |nvme_self_test_type| - specifies the type of test for short period or
+  //                           extended version.
+  //
+  // The response:
+  // * |response| - contains a unique identifier and status for the created
+  //                routine.
+  RunNvmeSelfTestRoutine(NvmeSelfTestTypeEnum nvme_self_test_type)
+      => (RunRoutineResponse response);
 };
 
 // Enumeration of each of the diagnostics routines the platform may support.
@@ -281,3 +296,10 @@
   kConnected = 0,     // Power supply is connected.
   kDisconnected = 1,  // Power supply is disconnected.
 };
+
+// Enumeration of the self-test type in nvme_self_test routine
+[Extensible]
+enum NvmeSelfTestTypeEnum {
+  kShortSelfTest = 0, // Short time self-test.
+  kLongSelfTest = 1,  // Long time self-test.
+};
diff --git a/chromeos/components/telemetry_extension_ui/resources/message_types.js b/chromeos/components/telemetry_extension_ui/resources/message_types.js
index 0fd1f4c..3653af22 100644
--- a/chromeos/components/telemetry_extension_ui/resources/message_types.js
+++ b/chromeos/components/telemetry_extension_ui/resources/message_types.js
@@ -33,6 +33,8 @@
       'DiagnosticsService.RunFloatingPointAccuraryRoutine',
   DIAGNOSTICS_RUN_NVME_WEAR_LEVEL_ROUTINE:
       'DiagnosticsService.RunNvmeWearLevelRoutine',
+  DIAGNOSTICS_RUN_NVME_SELF_TEST_ROUTINE:
+      'DiagnosticsService.RunNvmeSelfTestRoutine',
   PROBE_TELEMETRY_INFO: 'ProbeService.ProbeTelemetryInfo',
 };
 
@@ -130,6 +132,13 @@
 dpsl_internal.DiagnosticsRunNvmeWearLevelRoutineRequest;
 
 /**
+ * Request message sent by the unprivileged context to the privileged
+ * context to run NVMe self test routine.
+ * @typedef {{ nvmeSelfTestType: !string }}
+ */
+dpsl_internal.DiagnosticsRunNvmeSelfTestRoutineRequest;
+
+/**
  * Response message sent by the privileged context containing routine
  * information.
  * @typedef { !Object | !Error }
diff --git a/chromeos/components/telemetry_extension_ui/resources/trusted.js b/chromeos/components/telemetry_extension_ui/resources/trusted.js
index e595b19..85e996f 100644
--- a/chromeos/components/telemetry_extension_ui/resources/trusted.js
+++ b/chromeos/components/telemetry_extension_ui/resources/trusted.js
@@ -146,6 +146,23 @@
       throw RangeError(
           'acPowerStatusToEnum_ does not contain all items from enum!');
     }
+
+    const nvmeSelfTestTypeEnum = chromeos.health.mojom.NvmeSelfTestTypeEnum;
+
+    /**
+     * @type { !Map<!string, !chromeos.health.mojom.NvmeSelfTestTypeEnum> }
+     * @const
+     */
+    this.nvmeSelfTestTypeToEnum_ = new Map([
+      ['short-self-test', nvmeSelfTestTypeEnum.kShortSelfTest],
+      ['long-self-test', nvmeSelfTestTypeEnum.kLongSelfTest],
+    ]);
+
+    if (this.nvmeSelfTestTypeToEnum_.size !==
+        nvmeSelfTestTypeEnum.MAX_VALUE + 1) {
+      throw RangeError(
+          'nvmeSelfTestTypeToEnum_ does not contain all items from enum!');
+    }
   }
 
   /**
@@ -433,6 +450,33 @@
     return await getOrCreateDiagnosticsService().runNvmeWearLevelRoutine(
         request.wearLevelThreshold);
   };
+
+  /**
+   * Converts NVMe self test type string to NvmeSelfTestTypeEnum.
+   * @param { !string } nvmeSelfTestType
+   * @return { !chromeos.health.mojom.NvmeSelfTestTypeEnum }
+   */
+  convertNvmeSelfTestTypeToEnum(nvmeSelfTestType) {
+    if (!this.nvmeSelfTestTypeToEnum_.has(nvmeSelfTestType)) {
+      throw TypeError(
+          `Diagnostic NVMe self test type '${nvmeSelfTestType}' is unknown.`);
+    }
+
+    return this.nvmeSelfTestTypeToEnum_.get(nvmeSelfTestType);
+  }
+
+  /**
+   * Runs NVMe self test routine.
+   * @param { !Object } message
+   * @return { !RunRoutineResponsePromise }
+   */
+  async handleRunNvmeSelfTestRoutine(message) {
+    const request =
+        /** @type {!dpsl_internal.DiagnosticsRunNvmeSelfTestRoutineRequest} */
+        (message);
+    return await getOrCreateDiagnosticsService().runNvmeSelfTestRoutine(
+        this.convertNvmeSelfTestTypeToEnum(request.nvmeSelfTestType));
+  };
 };
 
 const diagnosticsProxy = new DiagnosticsProxy();
@@ -762,5 +806,11 @@
         message));
 
 untrustedMessagePipe.registerHandler(
+    dpsl_internal.Message.DIAGNOSTICS_RUN_NVME_SELF_TEST_ROUTINE,
+    (message) => diagnosticsProxy.genericRunRoutineHandler(
+        (message) => diagnosticsProxy.handleRunNvmeSelfTestRoutine(message),
+        message));
+
+untrustedMessagePipe.registerHandler(
     dpsl_internal.Message.PROBE_TELEMETRY_INFO,
     (message) => telemetryProxy.handleProbeTelemetryInfo(message));
diff --git a/chromeos/components/telemetry_extension_ui/resources/untrusted.js b/chromeos/components/telemetry_extension_ui/resources/untrusted.js
index c8de4de..5631616 100644
--- a/chromeos/components/telemetry_extension_ui/resources/untrusted.js
+++ b/chromeos/components/telemetry_extension_ui/resources/untrusted.js
@@ -244,6 +244,28 @@
       }
       return response;
     }
+
+    /**
+     * Requests NVMe self test routine to be run.
+     * @param { !string } nvmeSelfTestType
+     * @return { !Promise<!Object> }
+     * @public
+     */
+    async runNvmeSelfTestRoutine(nvmeSelfTestType) {
+      const message =
+          /**
+             @type {!dpsl_internal.DiagnosticsRunNvmeSelfTestRoutineRequest}
+           */
+          ({nvmeSelfTestType: nvmeSelfTestType});
+      const response =
+          /** @type {!Object} */ (await messagePipe.sendMessage(
+              dpsl_internal.Message.DIAGNOSTICS_RUN_NVME_SELF_TEST_ROUTINE,
+              message));
+      if (response instanceof Error) {
+        throw response;
+      }
+      return response;
+    }
   };
 
   /**
diff --git a/chromeos/components/telemetry_extension_ui/test/telemetry_extension_ui_browsertest.js b/chromeos/components/telemetry_extension_ui/test/telemetry_extension_ui_browsertest.js
index 8626b08..6b80bd21 100644
--- a/chromeos/components/telemetry_extension_ui/test/telemetry_extension_ui_browsertest.js
+++ b/chromeos/components/telemetry_extension_ui/test/telemetry_extension_ui_browsertest.js
@@ -124,6 +124,15 @@
       diagnosticsProxy.convertPowerStatusToEnum('disconnected'),
       acPowerStatusEnum.kDisconnected);
 
+  // Unit tests for convertNvmeSelfTestTypeToEnum
+  const nvmeSelfTestTypeEnum = chromeos.health.mojom.NvmeSelfTestTypeEnum;
+  assertEquals(
+      diagnosticsProxy.convertNvmeSelfTestTypeToEnum('short-self-test'),
+      nvmeSelfTestTypeEnum.kShortSelfTest);
+  assertEquals(
+      diagnosticsProxy.convertNvmeSelfTestTypeToEnum('long-self-test'),
+      nvmeSelfTestTypeEnum.kLongSelfTest);
+
   testDone();
 });
 
@@ -449,6 +458,23 @@
 
 TEST_F(
     'TelemetryExtensionUIBrowserTest',
+    'UntrustedDiagnosticsRequestRunNvmeSelfTestRoutineInvalidInput',
+    async () => {
+      await runTestInUntrusted(
+          'UntrustedDiagnosticsRequestRunNvmeSelfTestRoutineInvalidInput');
+      testDone();
+    });
+
+TEST_F(
+    'TelemetryExtensionUIBrowserTest',
+    'UntrustedDiagnosticsRequestRunNvmeSelfTestRoutine', async () => {
+      await runTestInUntrusted(
+          'UntrustedDiagnosticsRequestRunNvmeSelfTestRoutine');
+      testDone();
+    });
+
+TEST_F(
+    'TelemetryExtensionUIBrowserTest',
     'UntrustedRequestTelemetryInfoUnknownCategory', async () => {
       await runTestInUntrusted('UntrustedRequestTelemetryInfoUnknownCategory');
       testDone();
diff --git a/chromeos/components/telemetry_extension_ui/test/untrusted_browsertest.js b/chromeos/components/telemetry_extension_ui/test/untrusted_browsertest.js
index e46ce53..54ea1b4 100644
--- a/chromeos/components/telemetry_extension_ui/test/untrusted_browsertest.js
+++ b/chromeos/components/telemetry_extension_ui/test/untrusted_browsertest.js
@@ -265,6 +265,37 @@
       assertDeepEquals(response, {id: 123456789, status: 'ready'});
     });
 
+// Tests that runNvmeSelfTestRoutine throws the correct error when invalid enum
+// is passed as input.
+UNTRUSTED_TEST(
+    'UntrustedDiagnosticsRequestRunNvmeSelfTestRoutineInvalidInput',
+    async () => {
+      let caughtError;
+      try {
+        await chromeos.diagnostics.runNvmeSelfTestRoutine(
+            'this-does-not-exist');
+      } catch (error) {
+        caughtError = error;
+      }
+
+      assertEquals(caughtError.name, 'TypeError');
+      assertEquals(
+          caughtError.message,
+          `Diagnostic NVMe self test type \'this-does-not-exist\' is unknown.`);
+    });
+
+// Tests that runNvmeSelfTestRoutine returns the correct Object.
+UNTRUSTED_TEST(
+    'UntrustedDiagnosticsRequestRunNvmeSelfTestRoutine', async () => {
+      const response1 =
+          await chromeos.diagnostics.runNvmeSelfTestRoutine('short-self-test');
+      assertDeepEquals(response1, {id: 123456789, status: 'ready'});
+
+      const response2 =
+          await chromeos.diagnostics.runNvmeSelfTestRoutine('long-self-test');
+      assertDeepEquals(response2, {id: 123456789, status: 'ready'});
+    });
+
 // Tests that TelemetryInfo can be successfully requested from
 // from chrome-untrusted://.
 UNTRUSTED_TEST('UntrustedRequestTelemetryInfo', async () => {
diff --git a/components/arc/BUILD.gn b/components/arc/BUILD.gn
index 16952d16..a515602 100644
--- a/components/arc/BUILD.gn
+++ b/components/arc/BUILD.gn
@@ -118,6 +118,7 @@
     "//components/exo",
     "//components/google/core/common",
     "//components/guest_os",
+    "//components/keyed_service/core",
     "//components/onc",
     "//components/prefs",
 
diff --git a/components/arc/volume_mounter/arc_volume_mounter_bridge.cc b/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
index 0470fac..26e0c5c 100644
--- a/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
+++ b/components/arc/volume_mounter/arc_volume_mounter_bridge.cc
@@ -70,9 +70,15 @@
   return ArcVolumeMounterBridgeFactory::GetForBrowserContextForTesting(context);
 }
 
+// static
+KeyedServiceBaseFactory* ArcVolumeMounterBridge::GetFactory() {
+  return ArcVolumeMounterBridgeFactory::GetInstance();
+}
+
 ArcVolumeMounterBridge::ArcVolumeMounterBridge(content::BrowserContext* context,
                                                ArcBridgeService* bridge_service)
-    : arc_bridge_service_(bridge_service),
+    : delegate_(nullptr),
+      arc_bridge_service_(bridge_service),
       pref_service_(user_prefs::UserPrefs::Get(context)) {
   DCHECK(pref_service_);
   arc_bridge_service_->volume_mounter()->AddObserver(this);
@@ -95,6 +101,11 @@
   arc_bridge_service_->volume_mounter()->RemoveObserver(this);
 }
 
+void ArcVolumeMounterBridge::Initialize(Delegate* delegate) {
+  delegate_ = delegate;
+  DCHECK(delegate_);
+}
+
 // Sends MountEvents of all existing MountPoints in cros-disks.
 void ArcVolumeMounterBridge::SendAllMountEvents() {
   SendMountEventForMyFiles();
@@ -150,19 +161,12 @@
   }
 }
 
-void ArcVolumeMounterBridge::OnConnectionReady() {
-  // Deferring the SendAllMountEvents as a task to current thread to not
-  // block the mojo request since SendAllMountEvents might take non trivial
-  // amount of time.
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, base::BindOnce(&ArcVolumeMounterBridge::SendAllMountEvents,
-                                weak_ptr_factory_.GetWeakPtr()));
-}
-
 void ArcVolumeMounterBridge::OnMountEvent(
     DiskMountManager::MountEvent event,
     chromeos::MountError error_code,
     const DiskMountManager::MountPointInfo& mount_info) {
+  DCHECK(delegate_);
+
   // ArcVolumeMounter is limited for local storage, as Android's StorageManager
   // volume concept relies on assumption that it is local filesystem. Hence,
   // special volumes like DriveFS should not come through this path.
@@ -199,17 +203,35 @@
              << " is null during MountEvent " << event;
   }
 
-  mojom::VolumeMounterInstance* volume_mounter_instance =
-      ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->volume_mounter(),
-                                  OnMountEvent);
-
-  if (!volume_mounter_instance)
-    return;
-
   const bool visible = IsVisibleToAndroidApps(fs_uuid);
-  volume_mounter_instance->OnMountEvent(mojom::MountPointInfo::New(
-      event, mount_info.source_path, mount_info.mount_path, fs_uuid,
-      device_label, device_type, visible));
+  switch (event) {
+    case DiskMountManager::MountEvent::MOUNTING:
+      // Attach watcher to the directories. This is the best place to add the
+      // watcher, because if the watcher is attached after Android mounts (and
+      // performs full scan) the removable media, there might be a small time
+      // interval that has undetectable changes.
+      delegate_->StartWatchingRemovableMedia(
+          fs_uuid, mount_info.mount_path,
+          base::BindOnce(
+              &ArcVolumeMounterBridge::SendMountEventForRemovableMedia,
+              weak_ptr_factory_.GetWeakPtr(), event, mount_info.source_path,
+              mount_info.mount_path, fs_uuid, device_label, device_type,
+              visible));
+      break;
+    case DiskMountManager::MountEvent::UNMOUNTING:
+
+      // The actual ordering for the unmount event is not very important because
+      // during unmount, we don't care about accidentally ignoring changes.
+      // Hence, no synchronization is needed as we only care about cleaning up
+      // memory usage for watchers which is ok to be done at any time as long as
+      // it is done.
+      SendMountEventForRemovableMedia(event, mount_info.source_path,
+                                      mount_info.mount_path, fs_uuid,
+                                      device_label, device_type, visible);
+      delegate_->StopWatchingRemovableMedia(fs_uuid);
+      break;
+  }
+
   if (event == DiskMountManager::MountEvent::MOUNTING &&
       (device_type == chromeos::DeviceType::DEVICE_TYPE_USB ||
        device_type == chromeos::DeviceType::DEVICE_TYPE_SD)) {
@@ -220,6 +242,25 @@
   }
 }
 
+void ArcVolumeMounterBridge::SendMountEventForRemovableMedia(
+    DiskMountManager::MountEvent event,
+    const std::string& source_path,
+    const std::string& mount_path,
+    const std::string& fs_uuid,
+    const std::string& device_label,
+    chromeos::DeviceType device_type,
+    bool visible) {
+  mojom::VolumeMounterInstance* volume_mounter_instance =
+      ARC_GET_INSTANCE_FOR_METHOD(arc_bridge_service_->volume_mounter(),
+                                  OnMountEvent);
+
+  if (!volume_mounter_instance)
+    return;
+  volume_mounter_instance->OnMountEvent(
+      mojom::MountPointInfo::New(event, source_path, mount_path, fs_uuid,
+                                 device_label, device_type, visible));
+}
+
 void ArcVolumeMounterBridge::RequestAllMountPoints() {
   // Deferring the SendAllMountEvents as a task to current thread to not
   // block the mojo request since SendAllMountEvents might take non trivial
diff --git a/components/arc/volume_mounter/arc_volume_mounter_bridge.h b/components/arc/volume_mounter/arc_volume_mounter_bridge.h
index 3caaa3d..bf1e090 100644
--- a/components/arc/volume_mounter/arc_volume_mounter_bridge.h
+++ b/components/arc/volume_mounter/arc_volume_mounter_bridge.h
@@ -7,12 +7,14 @@
 
 #include <string>
 
+#include "base/callback_forward.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "chromeos/disks/disk_mount_manager.h"
 #include "components/arc/mojom/volume_mounter.mojom.h"
 #include "components/arc/session/connection_observer.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "components/keyed_service/core/keyed_service_base_factory.h"
 #include "components/prefs/pref_change_registrar.h"
 
 namespace content {
@@ -31,6 +33,21 @@
       public ConnectionObserver<mojom::VolumeMounterInstance>,
       public mojom::VolumeMounterHost {
  public:
+  class Delegate {
+   public:
+    // To be called by ArcVolumeMounter when a removable media is mounted. This
+    // create a watcher for the removable media.
+    virtual void StartWatchingRemovableMedia(const std::string& fs_uuid,
+                                             const std::string& mount_path,
+                                             base::OnceClosure callback) = 0;
+
+    // To be called by ArcVolumeMounter when a removable media is unmounted.
+    // This removees the watcher for the removable media..
+    virtual void StopWatchingRemovableMedia(const std::string& fs_uuid) = 0;
+
+   protected:
+    ~Delegate() = default;
+  };
   // Returns singleton instance for the given BrowserContext,
   // or nullptr if the browser |context| is not allowed to use ARC.
   static ArcVolumeMounterBridge* GetForBrowserContext(
@@ -38,13 +55,13 @@
   static ArcVolumeMounterBridge* GetForBrowserContextForTesting(
       content::BrowserContext* context);
 
+  // Returns Factory instance for ArcVolumeMounterBridge.
+  static KeyedServiceBaseFactory* GetFactory();
+
   ArcVolumeMounterBridge(content::BrowserContext* context,
                          ArcBridgeService* bridge_service);
   ~ArcVolumeMounterBridge() override;
 
-  // ConnectionObserver<mojom::VolumeMounterInstance> overrides:
-  void OnConnectionReady() override;
-
   // chromeos::disks::DiskMountManager::Observer overrides:
   void OnMountEvent(chromeos::disks::DiskMountManager::MountEvent event,
                     chromeos::MountError error_code,
@@ -54,14 +71,28 @@
   // mojom::VolumeMounterHost overrides:
   void RequestAllMountPoints() override;
 
- private:
+  // Initialize ArcVolumeMounterBridge with delegate.
+  void Initialize(Delegate* delegate);
+
+  // Send all existing mount events. Usually is called around service startup.
   void SendAllMountEvents();
 
+ private:
   void SendMountEventForMyFiles();
+  void SendMountEventForRemovableMedia(
+      chromeos::disks::DiskMountManager::MountEvent event,
+      const std::string& source_path,
+      const std::string& mount_path,
+      const std::string& fs_uuid,
+      const std::string& device_label,
+      chromeos::DeviceType device_type,
+      bool visible);
 
   bool IsVisibleToAndroidApps(const std::string& uuid) const;
   void OnVisibleStoragesChanged();
 
+  Delegate* delegate_;
+
   ArcBridgeService* const arc_bridge_service_;  // Owned by ArcServiceManager.
 
   PrefService* const pref_service_;
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 4bd2c728..b5e1414 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -369,6 +369,7 @@
     "//components/history/core/browser",
     "//components/infobars/core",
     "//components/keyed_service/core",
+    "//components/language_usage_metrics",
     "//components/leveldb_proto",
     "//components/os_crypt",
     "//components/policy/core/browser",
@@ -379,6 +380,7 @@
     "//components/signin/public/identity_manager",
     "//components/strings",
     "//components/sync",
+    "//components/translate/core/browser",
     "//components/variations/net",
     "//components/variations/service:service",
     "//components/version_info",
@@ -508,6 +510,8 @@
     "//components/prefs:test_support",
     "//components/signin/public/identity_manager:test_support",
     "//components/sync:test_support",
+    "//components/translate/core/browser",
+    "//components/translate/core/browser:test_support",
     "//components/ukm",
     "//components/ukm:test_support",
     "//google_apis:test_support",
@@ -708,6 +712,7 @@
     "//components/sync",
     "//components/sync:test_support_model",
     "//components/sync/driver:test_support",
+    "//components/translate/core/browser",
     "//components/ukm",
     "//components/ukm:test_support",
     "//components/unified_consent",
diff --git a/components/autofill/core/browser/DEPS b/components/autofill/core/browser/DEPS
index b642b6d..99a308e 100644
--- a/components/autofill/core/browser/DEPS
+++ b/components/autofill/core/browser/DEPS
@@ -4,6 +4,7 @@
   "+components/history/core/browser",
   "+components/infobars/core",
   "+components/keyed_service/core",
+  "+components/language_usage_metrics",
   "+components/leveldb_proto",
   "+components/metrics",
   "+components/policy",
@@ -11,6 +12,7 @@
   "+components/security_interstitials/core/pref_names.h",
   "+components/signin/public",
   "+components/sync",
+  "+components/translate/core/browser",
   "+components/variations",
   "+components/version_info",
   "+components/webdata/common",
diff --git a/components/autofill/core/browser/autofill_client.cc b/components/autofill/core/browser/autofill_client.cc
index ac6e1ea..656176f7 100644
--- a/components/autofill/core/browser/autofill_client.cc
+++ b/components/autofill/core/browser/autofill_client.cc
@@ -35,10 +35,6 @@
   return version_info::Channel::UNKNOWN;
 }
 
-std::string AutofillClient::GetPageLanguage() const {
-  return std::string();
-}
-
 std::string AutofillClient::GetVariationConfigCountryCode() const {
   return std::string();
 }
diff --git a/components/autofill/core/browser/autofill_client.h b/components/autofill/core/browser/autofill_client.h
index a5e1648..3f866f9 100644
--- a/components/autofill/core/browser/autofill_client.h
+++ b/components/autofill/core/browser/autofill_client.h
@@ -23,6 +23,7 @@
 #include "components/autofill/core/browser/ui/popup_item_ids.h"
 #include "components/autofill/core/browser/ui/popup_types.h"
 #include "components/security_state/core/security_state.h"
+#include "components/translate/core/browser/language_state.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
 #include "ui/base/window_open_disposition.h"
 #include "ui/gfx/geometry/rect_f.h"
@@ -282,8 +283,8 @@
   // context if possible, SECURITY_LEVEL_COUNT otherwise.
   virtual security_state::SecurityLevel GetSecurityLevelForUmaHistograms() = 0;
 
-  // Returns the current best guess as to the page's display language.
-  virtual std::string GetPageLanguage() const;
+  // Returns the language state, if available.
+  virtual const translate::LanguageState* GetLanguageState() = 0;
 
   // Retrieves the country code of the user from Chrome variation service.
   // If the variation service is not available, return an empty string.
diff --git a/components/autofill/core/browser/autofill_handler.cc b/components/autofill/core/browser/autofill_handler.cc
index 397ccaa5..c7474a2 100644
--- a/components/autofill/core/browser/autofill_handler.cc
+++ b/components/autofill/core/browser/autofill_handler.cc
@@ -292,9 +292,7 @@
       value_from_dynamic_change_form_ = true;
   }
 
-  base::Optional<std::string> page_language = GetPageLanguage();
-  if (page_language)
-    form_structure->set_page_language(page_language.value());
+  form_structure->set_page_language(GetPageLanguage());
 
   form_structure->DetermineHeuristicTypes(log_manager_);
 
@@ -313,8 +311,8 @@
   return parsed_form_structure;
 }
 
-base::Optional<std::string> AutofillHandler::GetPageLanguage() const {
-  return base::nullopt;
+std::string AutofillHandler::GetPageLanguage() const {
+  return std::string();
 }
 
 void AutofillHandler::Reset() {
diff --git a/components/autofill/core/browser/autofill_handler.h b/components/autofill/core/browser/autofill_handler.h
index 9a3b97032..d476cd02 100644
--- a/components/autofill/core/browser/autofill_handler.h
+++ b/components/autofill/core/browser/autofill_handler.h
@@ -212,7 +212,7 @@
                            const FormStructure* cached_form);
 
   // Returns the page language, if available.
-  virtual base::Optional<std::string> GetPageLanguage() const;
+  virtual std::string GetPageLanguage() const;
 
   bool value_from_dynamic_change_form_ = false;
 
diff --git a/components/autofill/core/browser/autofill_manager.cc b/components/autofill/core/browser/autofill_manager.cc
index 1ffde0d..ed1246f 100644
--- a/components/autofill/core/browser/autofill_manager.cc
+++ b/components/autofill/core/browser/autofill_manager.cc
@@ -222,6 +222,15 @@
   }
 }
 
+void LogLanguageMetrics(const translate::LanguageState* language_state) {
+  if (language_state) {
+    AutofillMetrics::LogFieldParsingTranslatedFormLanguageMetric(
+        language_state->current_language());
+    AutofillMetrics::LogFieldParsingPageTranslationStatusMetric(
+        language_state->IsPageTranslated());
+  }
+}
+
 bool IsAddressForm(FieldTypeGroup field_type_group) {
   switch (field_type_group) {
     case NAME:
@@ -677,6 +686,9 @@
     return;
   }
 
+  // Always upload page language metrics.
+  LogLanguageMetrics(client_->GetLanguageState());
+
   // Always let the value patterns metric upload data.
   LogValuePatternsMetric(form);
 
@@ -782,7 +794,9 @@
     copied_credit_cards.push_back(*card);
 
   // Annotate the form with the source language of the page.
-  form_structure->set_page_language(client_->GetPageLanguage());
+  base::Optional<std::string> page_language = GetPageLanguage();
+  if (page_language)
+    form_structure->set_page_language(page_language.value());
 
   // Attach the Randomized Encoder.
   form_structure->set_randomized_encoder(
@@ -2759,9 +2773,12 @@
   return nullptr;
 }
 
-base::Optional<std::string> AutofillManager::GetPageLanguage() const {
+std::string AutofillManager::GetPageLanguage() const {
   DCHECK(client_);
-  return base::make_optional(client_->GetPageLanguage());
+  const translate::LanguageState* language_state = client_->GetLanguageState();
+  if (language_state)
+    return language_state->original_language();
+  return std::string();
 }
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_manager.h b/components/autofill/core/browser/autofill_manager.h
index 7cd030c1..387029bb 100644
--- a/components/autofill/core/browser/autofill_manager.h
+++ b/components/autofill/core/browser/autofill_manager.h
@@ -607,7 +607,7 @@
                                SuggestionsContext* context);
 
   // Retrieves the page language from |client_|
-  base::Optional<std::string> GetPageLanguage() const override;
+  std::string GetPageLanguage() const override;
 
 #if !defined(OS_ANDROID) && !defined(OS_IOS)
   // Whether to show the option to use virtual card in the autofill popup.
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc
index ada4ee8..6a29dfd 100644
--- a/components/autofill/core/browser/autofill_manager_unittest.cc
+++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -8688,7 +8688,8 @@
   FormData form;
   test::CreateTestAddressFormData(&form);
 
-  autofill_client_.set_page_language("test_lang");
+  // Set up language state mock.
+  autofill_client_.GetLanguageState()->SetOriginalLanguage("test_lang");
 
   FormStructure* parsed_form = autofill_manager_->ParseFormForTest(form);
 
diff --git a/components/autofill/core/browser/autofill_metrics.cc b/components/autofill/core/browser/autofill_metrics.cc
index 67bedb21..22db09e 100644
--- a/components/autofill/core/browser/autofill_metrics.cc
+++ b/components/autofill/core/browser/autofill_metrics.cc
@@ -25,6 +25,7 @@
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/autofill/core/common/autofill_tick_clock.h"
 #include "components/autofill/core/common/form_data.h"
+#include "components/language_usage_metrics/language_usage_metrics.h"
 #include "services/metrics/public/cpp/metrics_utils.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 
@@ -2449,13 +2450,26 @@
 }
 
 // static
+void AutofillMetrics::LogFieldParsingPageTranslationStatusMetric(bool metric) {
+  base::UmaHistogramBoolean("Autofill.ParsedFieldTypesWasPageTranslated",
+                            metric);
+}
+
+// static
+void AutofillMetrics::LogFieldParsingTranslatedFormLanguageMetric(
+    base::StringPiece locale) {
+  base::UmaHistogramSparse(
+      "Autofill.ParsedFieldTypesUsingTranslatedPageLanguage",
+      language_usage_metrics::LanguageUsageMetrics::ToLanguageCode(locale));
+}
+
+// static
 void AutofillMetrics::LogWebOTPPhoneCollectionMetricStateUkm(
     ukm::UkmRecorder* recorder,
     ukm::SourceId source_id,
     uint32_t phone_collection_metric_state) {
-  // UKM recording is not supported for WebViews.
-  if (!recorder || source_id == ukm::kInvalidSourceId)
-    return;
+  DCHECK(recorder);
+  DCHECK_NE(source_id, ukm::kInvalidSourceId);
 
   ukm::builders::WebOTPImpact builder(source_id);
   builder.SetPhoneCollection(phone_collection_metric_state);
diff --git a/components/autofill/core/browser/autofill_metrics.h b/components/autofill/core/browser/autofill_metrics.h
index c684b069..53a5d945 100644
--- a/components/autofill/core/browser/autofill_metrics.h
+++ b/components/autofill/core/browser/autofill_metrics.h
@@ -1601,6 +1601,12 @@
   static void LogAddressFormImportStatustMetric(
       AddressProfileImportStatusMetric metric);
 
+  // Records if the page was translated upon form submission.
+  static void LogFieldParsingPageTranslationStatusMetric(bool metric);
+
+  // Records the visible page language upon form submission.
+  static void LogFieldParsingTranslatedFormLanguageMetric(base::StringPiece);
+
   static const char* GetMetricsSyncStateSuffix(
       AutofillSyncSigninState sync_state);
 
diff --git a/components/autofill/core/browser/autofill_metrics_unittest.cc b/components/autofill/core/browser/autofill_metrics_unittest.cc
index b714650..74bcf1e 100644
--- a/components/autofill/core/browser/autofill_metrics_unittest.cc
+++ b/components/autofill/core/browser/autofill_metrics_unittest.cc
@@ -11387,4 +11387,47 @@
   EXPECT_EQ(expected_result, actual_result);
 }
 
+// Validate that correct page language values are taken from
+// |AutofillClient| and logged upon form submission.
+TEST_F(AutofillMetricsTest, PageLanguageMetricsExpectedCase) {
+  FormData form;
+  CreateSimpleForm(autofill_client_.form_origin(), form);
+
+  // Set up language state.
+  autofill_client_.GetLanguageState()->SetOriginalLanguage("ub");
+  autofill_client_.GetLanguageState()->SetCurrentLanguage("ub");
+  int language_code = 'u' * 256 + 'b';
+
+  // Simulate form submission.
+  base::HistogramTester histogram_tester;
+  autofill_manager_->OnFormSubmitted(form, false,
+                                     SubmissionSource::FORM_SUBMISSION);
+
+  histogram_tester.ExpectUniqueSample(
+      "Autofill.ParsedFieldTypesUsingTranslatedPageLanguage", language_code, 1);
+  histogram_tester.ExpectUniqueSample(
+      "Autofill.ParsedFieldTypesWasPageTranslated", false, 1);
+}
+
+// Validate that invalid language codes (with disallowed symbols in this case)
+// get logged as invalid.
+TEST_F(AutofillMetricsTest, PageLanguageMetricsInvalidLanguage) {
+  FormData form;
+  CreateSimpleForm(autofill_client_.form_origin(), form);
+
+  // Set up language state.
+  autofill_client_.GetLanguageState()->SetOriginalLanguage("!ab");
+  autofill_client_.GetLanguageState()->SetCurrentLanguage("other");
+
+  // Simulate form submission.
+  base::HistogramTester histogram_tester;
+  autofill_manager_->OnFormSubmitted(form, false,
+                                     SubmissionSource::FORM_SUBMISSION);
+
+  histogram_tester.ExpectUniqueSample(
+      "Autofill.ParsedFieldTypesUsingTranslatedPageLanguage", 0, 1);
+  histogram_tester.ExpectUniqueSample(
+      "Autofill.ParsedFieldTypesWasPageTranslated", true, 1);
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/autofill_test_utils.cc b/components/autofill/core/browser/autofill_test_utils.cc
index 67cdd64..59461e39 100644
--- a/components/autofill/core/browser/autofill_test_utils.cc
+++ b/components/autofill/core/browser/autofill_test_utils.cc
@@ -487,6 +487,7 @@
                           "2109" /* Mastercard */, NextMonth().c_str(),
                           NextYear().c_str(), "1");
   credit_card.SetNetworkForMaskedCard(kMasterCard);
+  credit_card.set_instrument_id(1);
   return credit_card;
 }
 
@@ -707,6 +708,7 @@
     card.set_record_type(CreditCard::MASKED_SERVER_CARD);
     card.SetNumber(card.LastFourDigits());
     card.SetNetworkForMaskedCard(card.network());
+    card.set_instrument_id(card.instrument_id());
   }
   table->SetServerCreditCards(as_masked_cards);
 
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc
index b1e36cec..b9e2436 100644
--- a/components/autofill/core/browser/form_data_importer.cc
+++ b/components/autofill/core/browser/form_data_importer.cc
@@ -598,7 +598,11 @@
         // match the |app_locale|. Try setting the value again using the
         // language of the page. Note, there should be a locale associated with
         // every language code.
-        std::string page_language = client_->GetPageLanguage();
+        std::string page_language;
+        const translate::LanguageState* language_state =
+            client_->GetLanguageState();
+        if (language_state)
+          page_language = language_state->original_language();
         // Retry to set the country of there is known page language.
         if (!page_language.empty()) {
           candidate_profile.SetInfoWithVerificationStatus(
diff --git a/components/autofill/core/browser/form_data_importer_unittest.cc b/components/autofill/core/browser/form_data_importer_unittest.cc
index e66fe05..ea53e689 100644
--- a/components/autofill/core/browser/form_data_importer_unittest.cc
+++ b/components/autofill/core/browser/form_data_importer_unittest.cc
@@ -1510,6 +1510,9 @@
   test::CreateTestFormField("Country:", "country", "Armenien", "text", &field);
   form.fields.push_back(field);
 
+  // Set up language state mock.
+  autofill_client_->GetLanguageState()->SetOriginalLanguage("");
+
   // Verify that the country code is not determined from the country value if
   // the page language is not set.
   FormStructure form_structure(form);
@@ -1518,10 +1521,9 @@
 
   ASSERT_EQ(0U, personal_data_manager_->GetProfiles().size());
   ASSERT_EQ(0U, personal_data_manager_->GetCreditCards().size());
-  ASSERT_EQ(autofill_client_->GetPageLanguage(), std::string());
 
   // Set the page language to match the localized country value and try again.
-  autofill_client_->set_page_language("de");
+  autofill_client_->GetLanguageState()->SetOriginalLanguage("de");
 
   // TODO(crbug.com/1075604): Remove test with disabled feature.
   // Verify that nothing is changed if using the page language feature is not
@@ -1541,7 +1543,6 @@
   // There should be no imported address profile.
   ASSERT_EQ(0U, personal_data_manager_->GetProfiles().size());
   ASSERT_EQ(0U, personal_data_manager_->GetCreditCards().size());
-  ASSERT_EQ(autofill_client_->GetPageLanguage(), std::string("de"));
 
   // Enable the feature and to test if the profile can now be imported.
   scoped_feature_list_.Reset();
diff --git a/components/autofill/core/browser/test_autofill_client.cc b/components/autofill/core/browser/test_autofill_client.cc
index f1060e6..f2d2ed7 100644
--- a/components/autofill/core/browser/test_autofill_client.cc
+++ b/components/autofill/core/browser/test_autofill_client.cc
@@ -80,8 +80,8 @@
   return security_level_;
 }
 
-std::string TestAutofillClient::GetPageLanguage() const {
-  return page_language_;
+translate::LanguageState* TestAutofillClient::GetLanguageState() {
+  return &mock_translate_driver_.GetLanguageState();
 }
 
 #if !defined(OS_IOS)
diff --git a/components/autofill/core/browser/test_autofill_client.h b/components/autofill/core/browser/test_autofill_client.h
index e6363b9..dbe27e0d 100644
--- a/components/autofill/core/browser/test_autofill_client.h
+++ b/components/autofill/core/browser/test_autofill_client.h
@@ -24,6 +24,8 @@
 #include "components/autofill/core/browser/test_personal_data_manager.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
+#include "components/translate/core/browser/language_state.h"
+#include "components/translate/core/browser/mock_translate_driver.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "services/metrics/public/cpp/delegating_ukm_recorder.h"
 
@@ -53,7 +55,7 @@
   AddressNormalizer* GetAddressNormalizer() override;
   const GURL& GetLastCommittedURL() override;
   security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
-  std::string GetPageLanguage() const override;
+  translate::LanguageState* GetLanguageState() override;
 #if !defined(OS_IOS)
   std::unique_ptr<InternalAuthenticator> CreateCreditCardInternalAuthenticator(
       content::RenderFrameHost* rfh) override;
@@ -165,11 +167,6 @@
     payments_client_ = std::move(payments_client);
   }
 
-  // Sets the page language that is retrieved by |GetPageLanguage()|.
-  void set_page_language(std::string page_language) {
-    page_language_ = page_language;
-  }
-
   void set_test_form_data_importer(
       std::unique_ptr<TestFormDataImporter> form_data_importer) {
     form_data_importer_ = std::move(form_data_importer);
@@ -261,8 +258,8 @@
 
   std::vector<std::string> migration_card_selection_;
 
-  // The language that is returned by |GetPageLanguage()|.
-  std::string page_language_;
+  // A mock translate driver which provides the language state.
+  translate::testing::MockTranslateDriver mock_translate_driver_;
 
   // The last URL submitted by the user in the URL bar. Set in the constructor.
   GURL last_committed_url_;
diff --git a/components/autofill/core/browser/webdata/autofill_sync_bridge_util.cc b/components/autofill/core/browser/webdata/autofill_sync_bridge_util.cc
index badd7f1..48dc9b3 100644
--- a/components/autofill/core/browser/webdata/autofill_sync_bridge_util.cc
+++ b/components/autofill/core/browser/webdata/autofill_sync_bridge_util.cc
@@ -103,6 +103,7 @@
       static_cast<CreditCard::Issuer>(card.card_issuer().issuer()));
   if (!card.nickname().empty())
     result.SetNickname(base::UTF8ToUTF16(card.nickname()));
+  result.set_instrument_id(card.instrument_id());
   return result;
 }
 
@@ -247,6 +248,7 @@
     wallet_card->set_nickname(base::UTF16ToUTF8(card.nickname()));
   wallet_card->mutable_card_issuer()->set_issuer(
       static_cast<sync_pb::CardIssuer::Issuer>(card.card_issuer()));
+  wallet_card->set_instrument_id(card.instrument_id());
 }
 
 void SetAutofillWalletSpecificsFromPaymentsCustomerData(
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc
index e654fb8..0e069ec 100644
--- a/components/autofill/core/browser/webdata/autofill_table.cc
+++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -1432,7 +1432,8 @@
       "metadata.billing_address_id,"  // 10
       "bank_name,"                    // 11
       "nickname,"                     // 12
-      "card_issuer "                  // 13
+      "card_issuer,"                  // 13
+      "instrument_id "                // 14
       "FROM masked_credit_cards masked "
       "LEFT OUTER JOIN unmasked_credit_cards USING (id) "
       "LEFT OUTER JOIN server_card_metadata metadata USING (id)"));
@@ -1478,6 +1479,7 @@
     card->SetNickname(s.ColumnString16(index++));
     card->set_card_issuer(
         static_cast<CreditCard::Issuer>(s.ColumnInt(index++)));
+    card->set_instrument_id(s.ColumnInt64(index++));
     credit_cards->push_back(std::move(card));
   }
   return s.Succeeded();
@@ -1728,17 +1730,18 @@
   // Add all the masked cards.
   sql::Statement masked_insert(
       db_->GetUniqueStatement("INSERT INTO masked_credit_cards("
-                              "id,"            // 0
-                              "network,"       // 1
-                              "status,"        // 2
-                              "name_on_card,"  // 3
-                              "last_four,"     // 4
-                              "exp_month,"     // 5
-                              "exp_year,"      // 6
-                              "bank_name,"     // 7
-                              "nickname,"      // 8
-                              "card_issuer)"   // 9
-                              "VALUES (?,?,?,?,?,?,?,?,?,?)"));
+                              "id,"             // 0
+                              "network,"        // 1
+                              "status,"         // 2
+                              "name_on_card,"   // 3
+                              "last_four,"      // 4
+                              "exp_month,"      // 5
+                              "exp_year,"       // 6
+                              "bank_name,"      // 7
+                              "nickname,"       // 8
+                              "card_issuer,"    // 9
+                              "instrument_id)"  // 10
+                              "VALUES (?,?,?,?,?,?,?,?,?,?,?)"));
   int index;
   for (const CreditCard& card : credit_cards) {
     DCHECK_EQ(CreditCard::MASKED_SERVER_CARD, card.record_type());
@@ -1755,6 +1758,7 @@
     masked_insert.BindString(index++, card.bank_name());
     masked_insert.BindString16(index++, card.nickname());
     masked_insert.BindInt(index++, static_cast<int>(card.card_issuer()));
+    masked_insert.BindInt(index++, card.instrument_id());
     masked_insert.Run();
     masked_insert.Reset(true);
   }
@@ -3240,17 +3244,18 @@
   DCHECK_GT(db_->transaction_nesting(), 0);
   sql::Statement masked_insert(
       db_->GetUniqueStatement("INSERT INTO masked_credit_cards("
-                              "id,"            // 0
-                              "network,"       // 1
-                              "status,"        // 2
-                              "name_on_card,"  // 3
-                              "last_four,"     // 4
-                              "exp_month,"     // 5
-                              "exp_year,"      // 6
-                              "bank_name,"     // 7
-                              "nickname,"      // 8
-                              "card_issuer)"   // 9
-                              "VALUES (?,?,?,?,?,?,?,?,?,?)"));
+                              "id,"             // 0
+                              "network,"        // 1
+                              "status,"         // 2
+                              "name_on_card,"   // 3
+                              "last_four,"      // 4
+                              "exp_month,"      // 5
+                              "exp_year,"       // 6
+                              "bank_name,"      // 7
+                              "nickname,"       // 8
+                              "card_issuer,"    // 9
+                              "instrument_id)"  // 10
+                              "VALUES (?,?,?,?,?,?,?,?,?,?,?)"));
   int index;
   for (const CreditCard& card : credit_cards) {
     DCHECK_EQ(CreditCard::MASKED_SERVER_CARD, card.record_type());
@@ -3267,6 +3272,7 @@
     masked_insert.BindString(index++, card.bank_name());
     masked_insert.BindString16(index++, card.nickname());
     masked_insert.BindInt(index++, static_cast<int>(card.card_issuer()));
+    masked_insert.BindInt(index++, card.instrument_id());
     masked_insert.Run();
     masked_insert.Reset(true);
 
diff --git a/components/autofill/core/browser/webdata/autofill_table_unittest.cc b/components/autofill/core/browser/webdata/autofill_table_unittest.cc
index fb9e66f..e8d7597c 100644
--- a/components/autofill/core/browser/webdata/autofill_table_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_table_unittest.cc
@@ -2447,6 +2447,7 @@
   inputs[0].SetRawInfo(CREDIT_CARD_EXP_MONTH, ASCIIToUTF16("1"));
   inputs[0].SetRawInfo(CREDIT_CARD_EXP_4_DIGIT_YEAR, ASCIIToUTF16("2020"));
   inputs[0].SetRawInfo(CREDIT_CARD_NUMBER, ASCIIToUTF16("4111111111111111"));
+  inputs[0].set_instrument_id(321);
 
   inputs.push_back(CreditCard(CreditCard::MASKED_SERVER_CARD, "b456"));
   inputs[1].SetRawInfo(CREDIT_CARD_NAME_FULL, ASCIIToUTF16("Rick Roman"));
@@ -2458,6 +2459,7 @@
   base::string16 nickname = ASCIIToUTF16("Grocery card");
   inputs[1].SetNickname(nickname);
   inputs[1].set_card_issuer(CreditCard::Issuer::GOOGLE);
+  inputs[1].set_instrument_id(123);
 
   test::SetServerCreditCards(table_.get(), inputs);
 
@@ -2488,6 +2490,9 @@
 
   EXPECT_EQ(CreditCard::Issuer::ISSUER_UNKNOWN, outputs[0]->card_issuer());
   EXPECT_EQ(CreditCard::Issuer::GOOGLE, outputs[1]->card_issuer());
+
+  EXPECT_EQ(321, outputs[0]->instrument_id());
+  EXPECT_EQ(123, outputs[1]->instrument_id());
 }
 
 TEST_F(AutofillTableTest, SetGetRemoveServerCardMetadata) {
@@ -2697,6 +2702,7 @@
   inputs[0].SetNetworkForMaskedCard(kVisaCard);
   inputs[0].SetServerStatus(CreditCard::EXPIRED);
   inputs[0].SetNickname(ASCIIToUTF16("Grocery card"));
+  inputs[0].set_instrument_id(1);
   table_->SetServerCardsData(inputs);
 
   // Make sure the card was added correctly.
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
index 3d4b6c1f..0af9de6e 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
+++ b/components/autofill/core/browser/webdata/autofill_wallet_sync_bridge_unittest.cc
@@ -882,6 +882,7 @@
   EXPECT_EQ(card.billing_address_id(), cards[0]->billing_address_id());
   EXPECT_EQ(card.nickname(), cards[0]->nickname());
   EXPECT_EQ(card.card_issuer(), cards[0]->card_issuer());
+  EXPECT_EQ(card.instrument_id(), cards[0]->instrument_id());
 
   // Also make sure that those types are not empty, to exercice all the code
   // paths.
@@ -890,6 +891,7 @@
   EXPECT_NE(0, card.expiration_month());
   EXPECT_NE(0, card.expiration_year());
   EXPECT_FALSE(card.nickname().empty());
+  EXPECT_NE(0, card.instrument_id());
 }
 
 // Test that all field values for a cloud token data sent from the server are
diff --git a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskBroadcastReceiver.java b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskBroadcastReceiver.java
index 34ac07d..99385a4 100644
--- a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskBroadcastReceiver.java
+++ b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskBroadcastReceiver.java
@@ -16,6 +16,8 @@
 import android.os.PowerManager;
 import android.text.format.DateUtils;
 
+import androidx.annotation.Nullable;
+
 import org.chromium.base.ContextUtils;
 import org.chromium.base.Log;
 import org.chromium.base.ThreadUtils;
@@ -155,7 +157,8 @@
         PostTask.postTask(UiThreadTaskTraits.BEST_EFFORT, taskExecutor::execute);
     }
 
-    private boolean networkRequirementsMet(Context context, int taskId, int requiredNetworkType) {
+    private boolean networkRequirementsMet(Context context, int taskId,
+            @Nullable @TaskInfo.NetworkType Integer requiredNetworkType) {
         if (requiredNetworkType == TaskInfo.NetworkType.NONE) return true;
 
         ConnectivityManager connectivityManager =
@@ -188,7 +191,7 @@
                 || status == BatteryManager.BATTERY_STATUS_FULL;
     }
 
-    private @TaskInfo.NetworkType int convertToTaskInfoNetworkType(
+    private @Nullable @TaskInfo.NetworkType Integer convertToTaskInfoNetworkType(
             ScheduledTaskProto.ScheduledTask.RequiredNetworkType networkType) {
         switch (networkType) {
             case NONE:
@@ -199,7 +202,7 @@
                 return TaskInfo.NetworkType.UNMETERED;
             default:
                 assert false : "Incorrect value of RequiredNetworkType";
-                return -1;
+                return null;
         }
     }
 }
diff --git a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionHelper.java b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionHelper.java
index 7c9422e..6eeba11 100644
--- a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionHelper.java
+++ b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionHelper.java
@@ -17,6 +17,7 @@
 import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.SysUtils;
+import org.chromium.components.browser_ui.media.MediaSessionUma.MediaSessionActionSource;
 import org.chromium.components.url_formatter.UrlFormatter;
 import org.chromium.content_public.browser.MediaSession;
 import org.chromium.content_public.browser.MediaSessionObserver;
@@ -411,18 +412,18 @@
      *               {@link MediaNotificationListener} interface.
      * @return the corresponding histogram value.
      */
-    public static @MediaSessionUma.MediaSessionActionSource int convertMediaActionSourceToUMA(
+    public static @Nullable @MediaSessionActionSource Integer convertMediaActionSourceToUMA(
             int source) {
         if (source == MediaNotificationListener.ACTION_SOURCE_MEDIA_NOTIFICATION) {
-            return MediaSessionUma.MediaSessionActionSource.MEDIA_NOTIFICATION;
+            return MediaSessionActionSource.MEDIA_NOTIFICATION;
         } else if (source == MediaNotificationListener.ACTION_SOURCE_MEDIA_SESSION) {
-            return MediaSessionUma.MediaSessionActionSource.MEDIA_SESSION;
+            return MediaSessionActionSource.MEDIA_SESSION;
         } else if (source == MediaNotificationListener.ACTION_SOURCE_HEADSET_UNPLUG) {
-            return MediaSessionUma.MediaSessionActionSource.HEADSET_UNPLUG;
+            return MediaSessionActionSource.HEADSET_UNPLUG;
         }
 
         assert false;
-        return MediaSessionUma.MediaSessionActionSource.NUM_ENTRIES;
+        return null;
     }
 
     private Activity getActivity() {
diff --git a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionUma.java b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionUma.java
index 58f489f..05bce434 100644
--- a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionUma.java
+++ b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionUma.java
@@ -5,6 +5,7 @@
 package org.chromium.components.browser_ui.media;
 
 import androidx.annotation.IntDef;
+import androidx.annotation.Nullable;
 
 import org.chromium.base.metrics.RecordHistogram;
 
@@ -25,18 +26,24 @@
         int NUM_ENTRIES = 3;
     }
 
-    public static void recordPlay(@MediaSessionActionSource int action) {
-        RecordHistogram.recordEnumeratedHistogram(
-                "Media.Session.Play", action, MediaSessionActionSource.NUM_ENTRIES);
+    public static void recordPlay(@Nullable @MediaSessionActionSource Integer action) {
+        if (action != null) {
+            RecordHistogram.recordEnumeratedHistogram(
+                    "Media.Session.Play", action, MediaSessionActionSource.NUM_ENTRIES);
+        }
     }
 
-    public static void recordPause(@MediaSessionActionSource int action) {
-        RecordHistogram.recordEnumeratedHistogram(
-                "Media.Session.Pause", action, MediaSessionActionSource.NUM_ENTRIES);
+    public static void recordPause(@Nullable @MediaSessionActionSource Integer action) {
+        if (action != null) {
+            RecordHistogram.recordEnumeratedHistogram(
+                    "Media.Session.Pause", action, MediaSessionActionSource.NUM_ENTRIES);
+        }
     }
 
-    public static void recordStop(@MediaSessionActionSource int action) {
-        RecordHistogram.recordEnumeratedHistogram(
-                "Media.Session.Stop", action, MediaSessionActionSource.NUM_ENTRIES);
+    public static void recordStop(@Nullable @MediaSessionActionSource Integer action) {
+        if (action != null) {
+            RecordHistogram.recordEnumeratedHistogram(
+                    "Media.Session.Stop", action, MediaSessionActionSource.NUM_ENTRIES);
+        }
     }
 }
diff --git a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/TabModalPresenter.java b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/TabModalPresenter.java
index 22430bd..759283c 100644
--- a/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/TabModalPresenter.java
+++ b/components/browser_ui/modaldialog/android/java/src/org/chromium/components/browser_ui/modaldialog/TabModalPresenter.java
@@ -131,6 +131,10 @@
         // has not yet started.
         if (ViewCompat.isAttachedToWindow(mDialogView)) {
             runExitAnimation();
+        } else {
+            // Cancel any existing animations as when the animation completes it may try to make use
+            // of objects that have been set to null.
+            mDialogContainer.animate().cancel();
         }
 
         if (mModelChangeProcessor != null) {
diff --git a/components/cdm/browser/BUILD.gn b/components/cdm/browser/BUILD.gn
index 0a5771a04..1b1c7858 100644
--- a/components/cdm/browser/BUILD.gn
+++ b/components/cdm/browser/BUILD.gn
@@ -2,47 +2,51 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-source_set("browser") {
-  sources = [
-    "media_drm_storage_impl.cc",
-    "media_drm_storage_impl.h",
-  ]
+import("//media/media_options.gni")
 
-  public_deps = [
-    "//base",
-    "//base/util/values:values_util",
-    "//content/public/browser",
-    "//media/mojo/mojom",
-    "//url",
-  ]
-
-  deps = [
-    "//components/cdm/common",
-    "//components/prefs",
-    "//components/user_prefs",
-    "//content/public/common",
-    "//ipc",
-    "//media",
-  ]
-
-  if (is_android) {
-    sources += [
-      "cdm_message_filter_android.cc",
-      "cdm_message_filter_android.h",
+if (enable_media_drm_storage) {
+  source_set("browser") {
+    sources = [
+      "media_drm_storage_impl.cc",
+      "media_drm_storage_impl.h",
     ]
-    deps += [ "//third_party/widevine/cdm:headers" ]
-  }
-}
 
-source_set("unit_tests") {
-  testonly = true
-  sources = [ "media_drm_storage_impl_unittest.cc" ]
-  deps = [
-    ":browser",
-    "//base/test:test_support",
-    "//components/prefs:test_support",
-    "//content/test:test_support",
-    "//media/mojo/services",
-    "//testing/gtest",
-  ]
+    public_deps = [
+      "//base",
+      "//base/util/values:values_util",
+      "//content/public/browser",
+      "//media/mojo/mojom",
+      "//url",
+    ]
+
+    deps = [
+      "//components/cdm/common",
+      "//components/prefs",
+      "//components/user_prefs",
+      "//content/public/common",
+      "//ipc",
+      "//media",
+    ]
+
+    if (is_android) {
+      sources += [
+        "cdm_message_filter_android.cc",
+        "cdm_message_filter_android.h",
+      ]
+      deps += [ "//third_party/widevine/cdm:headers" ]
+    }
+  }
+
+  source_set("unit_tests") {
+    testonly = true
+    sources = [ "media_drm_storage_impl_unittest.cc" ]
+    deps = [
+      ":browser",
+      "//base/test:test_support",
+      "//components/prefs:test_support",
+      "//content/test:test_support",
+      "//media/mojo/services",
+      "//testing/gtest",
+    ]
+  }
 }
diff --git a/components/translate/core/browser/mock_translate_driver.cc b/components/translate/core/browser/mock_translate_driver.cc
index 10e4046..86cdd0a 100644
--- a/components/translate/core/browser/mock_translate_driver.cc
+++ b/components/translate/core/browser/mock_translate_driver.cc
@@ -64,6 +64,10 @@
   return ukm::kInvalidSourceId;
 }
 
+LanguageState& MockTranslateDriver::GetLanguageState() {
+  return language_state_;
+}
+
 bool MockTranslateDriver::HasCurrentPage() {
   return true;
 }
diff --git a/components/translate/core/browser/mock_translate_driver.h b/components/translate/core/browser/mock_translate_driver.h
index 63ba9d0e..72742b9 100644
--- a/components/translate/core/browser/mock_translate_driver.h
+++ b/components/translate/core/browser/mock_translate_driver.h
@@ -40,6 +40,7 @@
   const GURL& GetLastCommittedURL() override;
   const GURL& GetVisibleURL() override;
   ukm::SourceId GetUkmSourceId() override;
+  LanguageState& GetLanguageState();
   bool HasCurrentPage() override;
   void OpenUrlInNewTab(const GURL& url) override {}
 
diff --git a/components/translate/core/browser/translate_manager.cc b/components/translate/core/browser/translate_manager.cc
index 0951ce7..177d21e 100644
--- a/components/translate/core/browser/translate_manager.cc
+++ b/components/translate/core/browser/translate_manager.cc
@@ -180,7 +180,7 @@
 }
 
 bool TranslateManager::CanManuallyTranslate() {
-  if (!base::FeatureList::IsEnabled(translate::kTranslateUI) ||
+  if (!base::FeatureList::IsEnabled(translate::kTranslate) ||
       net::NetworkChangeNotifier::IsOffline() ||
       (!ignore_missing_key_for_testing_ &&
        !::google_apis::HasAPIKeyConfigured()))
@@ -548,7 +548,7 @@
 // static
 bool TranslateManager::IsAvailable(const TranslatePrefs* prefs) {
   // These conditions mirror the conditions in InitiateTranslation.
-  return base::FeatureList::IsEnabled(translate::kTranslateUI) &&
+  return base::FeatureList::IsEnabled(translate::kTranslate) &&
          (ignore_missing_key_for_testing_ ||
           ::google_apis::HasAPIKeyConfigured()) &&
          prefs->IsOfferTranslateEnabled();
@@ -700,7 +700,7 @@
         TranslateBrowserMetrics::INITIATION_STATUS_DOESNT_NEED_TRANSLATION);
   }
 
-  if (!base::FeatureList::IsEnabled(translate::kTranslateUI)) {
+  if (!base::FeatureList::IsEnabled(translate::kTranslate)) {
     decision->PreventAllTriggering();
     decision->initiation_statuses.push_back(
         TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_SWITCH);
diff --git a/components/translate/core/browser/translate_prefs.cc b/components/translate/core/browser/translate_prefs.cc
index 85926e34..4e7c9a5 100644
--- a/components/translate/core/browser/translate_prefs.cc
+++ b/components/translate/core/browser/translate_prefs.cc
@@ -122,8 +122,7 @@
 const base::Feature kTranslateRecentTarget{"TranslateRecentTarget",
                                            base::FEATURE_ENABLED_BY_DEFAULT};
 
-const base::Feature kTranslateUI{"TranslateUI",
-                                 base::FEATURE_ENABLED_BY_DEFAULT};
+const base::Feature kTranslate{"Translate", base::FEATURE_ENABLED_BY_DEFAULT};
 
 DenialTimeUpdate::DenialTimeUpdate(PrefService* prefs,
                                    base::StringPiece language,
diff --git a/components/translate/core/browser/translate_prefs.h b/components/translate/core/browser/translate_prefs.h
index c602b2e7..c9ab155 100644
--- a/components/translate/core/browser/translate_prefs.h
+++ b/components/translate/core/browser/translate_prefs.h
@@ -25,7 +25,7 @@
 namespace base {
 class DictionaryValue;
 class ListValue;
-}
+}  // namespace base
 
 namespace user_prefs {
 class PrefRegistrySyncable;
@@ -41,8 +41,9 @@
 // target language option.
 extern const base::Feature kTranslateRecentTarget;
 
-// Enable or disable the Translate popup altogether.
-extern const base::Feature kTranslateUI;
+// This allows the user to disable translate by using the
+// `--disable-features=Translate` command-line flag.
+extern const base::Feature kTranslate;
 
 // Minimum number of times the user must accept a translation before we show
 // a shortcut to the "Always Translate" functionality.
diff --git a/content/browser/net/cross_origin_opener_policy_reporter.cc b/content/browser/net/cross_origin_opener_policy_reporter.cc
index 5c86a8b..76e8339 100644
--- a/content/browser/net/cross_origin_opener_policy_reporter.cc
+++ b/content/browser/net/cross_origin_opener_policy_reporter.cc
@@ -113,6 +113,16 @@
   return opener ? opener->frame_tree()->root() : nullptr;
 }
 
+// Remove sensitive data from URL used in reports.
+std::string SanitizedURL(const GURL& url) {
+  // Strip username, password and ref fragment from the URL.
+  // Keep only the valid http/https ones.
+  //
+  // Note: This is the exact same operation used in
+  // ReportingServiceImpl::QueueReport() for the |url|.
+  return url.GetAsReferrer().spec();
+}
+
 }  // namespace
 
 CrossOriginOpenerPolicyReporter::CrossOriginOpenerPolicyReporter(
@@ -137,21 +147,12 @@
   if (!endpoint)
     return;
 
-  url::Replacements<char> replacements;
-  replacements.ClearUsername();
-  replacements.ClearPassword();
-  std::string sanitized_previous_url;
-  if (same_origin_with_previous) {
-    sanitized_previous_url =
-        previous_url.ReplaceComponents(replacements).spec();
-  }
-  std::string sanitized_referrer_url =
-      referrer_url.ReplaceComponents(replacements).spec();
   base::DictionaryValue body;
   body.SetString(kDisposition,
                  is_report_only ? kDispositionReporting : kDispositionEnforce);
-  body.SetString(kPreviousURL, sanitized_previous_url);
-  body.SetString(kReferrer, sanitized_referrer_url);
+  body.SetString(kPreviousURL,
+                 same_origin_with_previous ? SanitizedURL(previous_url) : "");
+  body.SetString(kReferrer, SanitizedURL(referrer_url));
   body.SetString(kViolationType, kTypeToResponse);
   QueueNavigationReport(std::move(body), *endpoint, is_report_only);
 }
@@ -167,13 +168,9 @@
   if (!endpoint)
     return;
 
-  url::Replacements<char> replacements;
-  replacements.ClearUsername();
-  replacements.ClearPassword();
   std::string sanitized_next_url;
-  if (is_current_source || same_origin_with_next) {
-    sanitized_next_url = next_url.ReplaceComponents(replacements).spec();
-  }
+  if (is_current_source || same_origin_with_next)
+    sanitized_next_url = SanitizedURL(next_url);
   base::DictionaryValue body;
   body.SetString(kNextURL, sanitized_next_url);
   body.SetString(kViolationType, kTypeFromResponse);
@@ -331,12 +328,8 @@
   body.SetString(
       kEffectivePolicy,
       ToString(is_report_only ? coop_.report_only_value : coop_.value));
-  url::Replacements<char> replacements;
-  replacements.ClearUsername();
-  replacements.ClearPassword();
-  GURL sanitized_context_url = context_url_.ReplaceComponents(replacements);
   storage_partition_->GetNetworkContext()->QueueReport(
-      "coop", endpoint, sanitized_context_url, /*user_agent=*/base::nullopt,
+      "coop", endpoint, context_url_, /*user_agent=*/base::nullopt,
       std::move(body));
 }
 
diff --git a/content/browser/net/cross_origin_opener_policy_reporter_unittest.cc b/content/browser/net/cross_origin_opener_policy_reporter_unittest.cc
index e345287..db364a9f 100644
--- a/content/browser/net/cross_origin_opener_policy_reporter_unittest.cc
+++ b/content/browser/net/cross_origin_opener_policy_reporter_unittest.cc
@@ -80,7 +80,8 @@
 
 TEST_F(CrossOriginOpenerPolicyReporterTest, Basic) {
   auto reporter = GetReporter();
-  std::string url1 = "https://www1.example.com/y#foo?bar=baz";
+  std::string url1 = "https://www1.example.com/y?bar=baz#foo";
+  std::string url1_report = "https://www1.example.com/y?bar=baz";
   std::string url2 = "https://www1.example.com/";
   std::string url3 = "http://www2.example.com:41/z";
 
@@ -94,7 +95,7 @@
   EXPECT_EQ(r1.type, "coop");
   EXPECT_EQ(r1.url, context_url());
   EXPECT_EQ(r1.body.FindKey("disposition")->GetString(), "enforce");
-  EXPECT_EQ(r1.body.FindKey("previousResponseURL")->GetString(), url1);
+  EXPECT_EQ(r1.body.FindKey("previousResponseURL")->GetString(), url1_report);
   EXPECT_EQ(r1.body.FindKey("referrer")->GetString(), url2);
   EXPECT_EQ(r1.body.FindKey("type")->GetString(), "navigation-to-response");
   EXPECT_EQ(r1.body.FindKey("effectivePolicy")->GetString(),
@@ -135,7 +136,8 @@
 
 TEST_F(CrossOriginOpenerPolicyReporterTest, Clone) {
   auto reporter = GetReporter();
-  std::string url1 = "https://www1.example.com/y#foo?bar=baz";
+  std::string url1 = "https://www1.example.com/y?bar=baz#foo";
+  std::string url1_sanitized = "https://www1.example.com/y?bar=baz";
 
   mojo::Remote<network::mojom::CrossOriginOpenerPolicyReporter> remote;
   reporter->Clone(remote.BindNewPipeAndPassReceiver());
@@ -150,8 +152,9 @@
   EXPECT_EQ(r1.type, "coop");
   EXPECT_EQ(r1.url, context_url());
   EXPECT_EQ(r1.body.FindKey("disposition")->GetString(), "enforce");
-  EXPECT_EQ(r1.body.FindKey("previousResponseURL")->GetString(), url1);
-  EXPECT_EQ(r1.body.FindKey("referrer")->GetString(), url1);
+  EXPECT_EQ(r1.body.FindKey("previousResponseURL")->GetString(),
+            url1_sanitized);
+  EXPECT_EQ(r1.body.FindKey("referrer")->GetString(), url1_sanitized);
   EXPECT_EQ(r1.body.FindKey("type")->GetString(), "navigation-to-response");
   EXPECT_EQ(r1.body.FindKey("effectivePolicy")->GetString(),
             "same-origin-plus-coep");
diff --git a/infra/config/generated/cr-buildbucket.cfg b/infra/config/generated/cr-buildbucket.cfg
index 25085c31..dd345a15 100644
--- a/infra/config/generated/cr-buildbucket.cfg
+++ b/infra/config/generated/cr-buildbucket.cfg
@@ -26783,12 +26783,11 @@
       name: "win10_chromium_x64_1909_fyi_rel_ng"
       swarming_host: "chromium-swarm.appspot.com"
       swarming_tags: "vpython:native-python-wrapper"
-      dimensions: "builderless:1"
+      dimensions: "builder:win10_chromium_x64_1909_fyi_rel_ng"
       dimensions: "cores:8"
       dimensions: "cpu:x86-64"
       dimensions: "os:Windows-10-18363"
       dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:0"
       exe {
         cipd_package: "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build"
         cipd_version: "refs/heads/master"
diff --git a/infra/config/subprojects/chromium/try.star b/infra/config/subprojects/chromium/try.star
index c62026c3..007312d 100644
--- a/infra/config/subprojects/chromium/try.star
+++ b/infra/config/subprojects/chromium/try.star
@@ -1383,6 +1383,7 @@
 
 try_.chromium_win_builder(
     name = "win10_chromium_x64_1909_fyi_rel_ng",
+    builderless = False,
     os = os.WINDOWS_10_1909,
 )
 
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
index 069f7179..8c70d128 100644
--- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
+++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.h
@@ -64,7 +64,7 @@
   AddressNormalizer* GetAddressNormalizer() override;
   const GURL& GetLastCommittedURL() override;
   security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
-  std::string GetPageLanguage() const override;
+  const translate::LanguageState* GetLanguageState() override;
   std::string GetVariationConfigCountryCode() const override;
 
   void ShowAutofillSettings(bool show_credit_card_settings) override;
diff --git a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
index 310f576..d5e32e2 100644
--- a/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
+++ b/ios/chrome/browser/ui/autofill/chrome_autofill_client_ios.mm
@@ -194,16 +194,16 @@
   return security_state::GetSecurityLevelForWebState(web_state_);
 }
 
-std::string ChromeAutofillClientIOS::GetPageLanguage() const {
+const translate::LanguageState* ChromeAutofillClientIOS::GetLanguageState() {
   // TODO(crbug.com/912597): iOS vs other platforms extracts language from
   // the top level frame vs whatever frame directly holds the form.
   auto* translate_client = ChromeIOSTranslateClient::FromWebState(web_state_);
   if (translate_client) {
     auto* translate_manager = translate_client->GetTranslateManager();
     if (translate_manager)
-      return translate_manager->GetLanguageState().original_language();
+      return &translate_manager->GetLanguageState();
   }
-  return std::string();
+  return nullptr;
 }
 
 std::string ChromeAutofillClientIOS::GetVariationConfigCountryCode() const {
diff --git a/ios/chrome/browser/ui/content_suggestions/discover_feed_metrics_recorder.mm b/ios/chrome/browser/ui/content_suggestions/discover_feed_metrics_recorder.mm
index 696ab2c..54fea54 100644
--- a/ios/chrome/browser/ui/content_suggestions/discover_feed_metrics_recorder.mm
+++ b/ios/chrome/browser/ui/content_suggestions/discover_feed_metrics_recorder.mm
@@ -5,6 +5,8 @@
 #import "ios/chrome/browser/ui/content_suggestions/discover_feed_metrics_recorder.h"
 
 #import "base/metrics/histogram_macros.h"
+#import "base/metrics/user_metrics.h"
+#import "base/metrics/user_metrics_action.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -81,66 +83,125 @@
 const char kDiscoverFeedInfiniteFeedTriggered[] =
     "ContentSuggestions.Feed.LoadStreamStatus.LoadMore";
 
-// Histogram name for the feed header items.
-const char kDiscoverFeedUserAction[] = "ContentSuggestions.Feed.UserActions";
+// Histogram name for the Discover feed user actions.
+const char kDiscoverFeedUserActionHistogram[] =
+    "ContentSuggestions.Feed.UserActions";
 
+// User action names for toggling the feed visibility from the header menu.
+const char kDiscoverFeedUserActionTurnOn[] =
+    "Suggestions.ExpandableHeader.Expanded";
+const char kDiscoverFeedUserActionTurnOff[] =
+    "Suggestions.ExpandableHeader.Collapsed";
+
+// User action names for feed back of card items.
+const char kDiscoverFeedUserActionLearnMoreTapped[] =
+    "ContentSuggestions.Feed.CardAction.LearnMore";
+const char kDiscoverFeedUserActionOpenSameTab[] =
+    "ContentSuggestions.Feed.CardAction.Open";
+const char kDiscoverFeedUserActionOpenIncognitoTab[] =
+    "ContentSuggestions.Feed.CardAction.OpenInNewIncognitoTab";
+const char kDiscoverFeedUserActionOpenNewTab[] =
+    "ContentSuggestions.Feed.CardAction.OpenInNewTab";
+const char kDiscoverFeedUserActionReadLaterTapped[] =
+    "ContentSuggestions.Feed.CardAction.ReadLater";
+const char kDiscoverFeedUserActionSendFeedbackOpened[] =
+    "ContentSuggestions.Feed.CardAction.SendFeedback";
+
+// User action names for feed header menu.
+const char kDiscoverFeedUserActionManageActivityTapped[] =
+    "ContentSuggestions.Feed.HeaderAction.ManageActivity";
+const char kDiscoverFeedUserActionManageInterestsTapped[] =
+    "ContentSuggestions.Feed.HeaderAction.ManageInterests";
+
+// User action name for infinite feed triggering.
+const char kDiscoverFeedUserActionInfiniteFeedTriggered[] =
+    "ContentSuggestions.Feed.InfiniteFeedTriggered";
 }  // namespace
 
 @implementation DiscoverFeedMetricsRecorder
 
+#pragma mark - Public
+
 - (void)recordInfiniteFeedTriggered {
   UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedInfiniteFeedTriggered,
                             FeedLoadStreamStatus::kLoadedFromNetwork);
+  base::RecordAction(
+      base::UserMetricsAction(kDiscoverFeedUserActionInfiniteFeedTriggered));
 }
 
 - (void)recordHeaderMenuLearnMoreTapped {
-  UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserAction,
-                            FeedUserActionType::kTappedLearnMore);
+  [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::
+                                                  kTappedLearnMore];
+  base::RecordAction(
+      base::UserMetricsAction(kDiscoverFeedUserActionLearnMoreTapped));
 }
 
 - (void)recordHeaderMenuManageActivityTapped {
-  UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserAction,
-                            FeedUserActionType::kTappedManageActivity);
+  [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::
+                                                  kTappedManageActivity];
+  base::RecordAction(
+      base::UserMetricsAction(kDiscoverFeedUserActionManageActivityTapped));
 }
 
 - (void)recordHeaderMenuManageInterestsTapped {
-  UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserAction,
-                            FeedUserActionType::kTappedManageInterests);
+  [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::
+                                                  kTappedManageInterests];
+  base::RecordAction(
+      base::UserMetricsAction(kDiscoverFeedUserActionManageInterestsTapped));
 }
 
 - (void)recordDiscoverFeedVisibilityChanged:(BOOL)visible {
   if (visible) {
-    UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserAction,
-                              FeedUserActionType::kTappedTurnOn);
+    [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::
+                                                    kTappedTurnOn];
+    base::RecordAction(base::UserMetricsAction(kDiscoverFeedUserActionTurnOn));
   } else {
-    UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserAction,
-                              FeedUserActionType::kTappedTurnOff);
+    [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::
+                                                    kTappedTurnOff];
+    base::RecordAction(base::UserMetricsAction(kDiscoverFeedUserActionTurnOff));
   }
 }
 
 - (void)recordOpenURLInSameTab {
-  UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserAction,
-                            FeedUserActionType::kTappedOnCard);
+  [self
+      recordDiscoverFeedUserActionHistogram:FeedUserActionType::kTappedOnCard];
+  base::RecordAction(
+      base::UserMetricsAction(kDiscoverFeedUserActionOpenSameTab));
 }
 
 - (void)recordOpenURLInNewTab {
-  UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserAction,
-                            FeedUserActionType::kTappedOpenInNewTab);
+  [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::
+                                                  kTappedOpenInNewTab];
+  base::RecordAction(
+      base::UserMetricsAction(kDiscoverFeedUserActionOpenNewTab));
 }
 
 - (void)recordOpenURLInIncognitoTab {
-  UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserAction,
-                            FeedUserActionType::kTappedOpenInNewIncognitoTab);
+  [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::
+                                                  kTappedOpenInNewIncognitoTab];
+  base::RecordAction(
+      base::UserMetricsAction(kDiscoverFeedUserActionOpenIncognitoTab));
 }
 
 - (void)recordAddURLToReadLater {
-  UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserAction,
-                            FeedUserActionType::kAddedToReadLater);
+  [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::
+                                                  kAddedToReadLater];
+  base::RecordAction(
+      base::UserMetricsAction(kDiscoverFeedUserActionReadLaterTapped));
 }
 
 - (void)recordTapSendFeedback {
-  UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserAction,
-                            FeedUserActionType::kTappedSendFeedback);
+  [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::
+                                                  kTappedSendFeedback];
+  base::RecordAction(
+      base::UserMetricsAction(kDiscoverFeedUserActionSendFeedbackOpened));
+}
+
+#pragma mark - Private
+
+// Records histogram metrics for Discover feed user actions.
+- (void)recordDiscoverFeedUserActionHistogram:(FeedUserActionType)actionType {
+  UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserActionHistogram, actionType);
 }
 
 @end
diff --git a/ios/web/navigation/resources/restore_session.html b/ios/web/navigation/resources/restore_session.html
index 6301e793..77d676d 100644
--- a/ios/web/navigation/resources/restore_session.html
+++ b/ios/web/navigation/resources/restore_session.html
@@ -90,24 +90,34 @@
               getRestoreURL(sessionHistoryObject.urls[i] || "about:blank"));
         }
 
-        // iOS12.2 added a throttling mechanism where previous pushStates may
-        // not immediately be available. Set a 10ms interval delay until
-        // history.length reaches sessionHistory.length.
+        // iOS12.2 added a throttling mechanism where the previous pushStates
+        // may not immediately be available.  Instead of directly calling
+        // finishRestore(currentItemOffset) here, call it via a round trip
+        // native call to flush out the pushState IPC backlog.
         var currentItemOffset = parseInt(sessionHistoryObject.offset);
-        var goWhenReady = setInterval(() => {
-          if (history.length == sessionHistoryObject.urls.length) {
-            history.go(currentItemOffset);
-            window.clearInterval(goWhenReady);
+        var offset = {'offset': currentItemOffset}
+        window.webkit.messageHandlers['session_restore'].postMessage(offset);
+       } catch (e) {
+         handleError(e.name + ": " + e.message + " raw session history: " + sessionHistory);
+       }
+     }
 
-            // Queue a reload to redirect to the target URL after history.go
-            // is processed.
-            setTimeout(() => {
-              location.reload();
-            });
-           }
-        }, 10);
+    /**
+     * Finishes restoration by history.go-ing to |offset| and reloading the
+     * page.
+     * @param {int} offset Either zero, or the number of pages (negative) to
+     * go backwards.
+     */
+    function _crFinishSessionRestoration(offset) {
+      try {
+        history.go(offset);
+        // Queue a reload to redirect to the target URL after history.go
+        // is processed.
+        setTimeout(() => {
+          location.reload();
+        });
       } catch (e) {
-        handleError(e.name + ": " + e.message + " raw session history: " + sessionHistory);
+        handleError(e.name + ": " + e.message + " offset: " + offset);
       }
     }
 
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
index 2712a623..3c7c84b 100644
--- a/ios/web/web_state/ui/crw_web_controller.mm
+++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -86,6 +86,9 @@
 // URL scheme for messages sent from javascript for asynchronous processing.
 NSString* const kScriptMessageName = @"crwebinvoke";
 
+// URL scheme for session restore.
+NSString* const kSessionRestoreScriptMessageName = @"session_restore";
+
 }  // namespace
 
 @interface CRWWebController () <CRWWKNavigationHandlerDelegate,
@@ -443,6 +446,15 @@
                            name:kScriptMessageName
                         webView:_webView];
 
+    // TODO(crbug.com/1127521) Consider consolidating session restore script
+    // logic into a different place.
+    [messageRouter
+        setScriptMessageHandler:^(WKScriptMessage* message) {
+          [weakSelf didReceiveSessionRestoreScriptMessage:message];
+        }
+                           name:kSessionRestoreScriptMessageName
+                        webView:_webView];
+
     _webView.allowsBackForwardNavigationGestures =
         _allowsBackForwardNavigationGestures;
   }
@@ -1105,6 +1117,22 @@
   }
 }
 
+// TODO(crbug.com/1127521) Consider consolidating session restore script
+// logic into a different place.
+- (void)didReceiveSessionRestoreScriptMessage:(WKScriptMessage*)message {
+  if ([message.name isEqualToString:kSessionRestoreScriptMessageName] &&
+      [message.body[@"offset"] isKindOfClass:[NSNumber class]]) {
+    NSString* method =
+        [NSString stringWithFormat:@"_crFinishSessionRestoration('%@')",
+                                   message.body[@"offset"]];
+    // Don't use |_jsInjector| -executeJavaScript here, as it relies on
+    // |windowID| being injected before window.onload starts.
+    web::ExecuteJavaScript(self.webView, method, nil);
+  } else {
+    DLOG(WARNING) << "Invalid session restore JS message name.";
+  }
+}
+
 - (BOOL)respondToWKScriptMessage:(WKScriptMessage*)scriptMessage {
   if (![scriptMessage.name isEqualToString:kScriptMessageName]) {
     return NO;
diff --git a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
index 00be2ae..7eea102 100644
--- a/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
+++ b/ios/web_view/internal/autofill/web_view_autofill_client_ios.h
@@ -59,6 +59,7 @@
   AddressNormalizer* GetAddressNormalizer() override;
   const GURL& GetLastCommittedURL() override;
   security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
+  const translate::LanguageState* GetLanguageState() override;
   void ShowAutofillSettings(bool show_credit_card_settings) override;
   void ShowUnmaskPrompt(const CreditCard& card,
                         UnmaskCardReason reason,
diff --git a/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm b/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm
index deab840..ace0712 100644
--- a/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm
+++ b/ios/web_view/internal/autofill/web_view_autofill_client_ios.mm
@@ -151,6 +151,10 @@
   return security_state::GetSecurityLevelForWebState(web_state_);
 }
 
+const translate::LanguageState* WebViewAutofillClientIOS::GetLanguageState() {
+  return nullptr;
+}
+
 void WebViewAutofillClientIOS::ShowAutofillSettings(
     bool show_credit_card_settings) {
   NOTREACHED();
diff --git a/services/test/user_id/BUILD.gn b/services/test/user_id/BUILD.gn
deleted file mode 100644
index 272d376..0000000
--- a/services/test/user_id/BUILD.gn
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-source_set("lib") {
-  sources = [
-    "user_id_service.cc",
-    "user_id_service.h",
-  ]
-
-  deps = [
-    "//base",
-    "//services/service_manager/public/cpp",
-    "//services/service_manager/public/mojom",
-    "//services/test/user_id/public/mojom",
-  ]
-}
diff --git a/services/test/user_id/OWNERS b/services/test/user_id/OWNERS
deleted file mode 100644
index e69de29..0000000
--- a/services/test/user_id/OWNERS
+++ /dev/null
diff --git a/services/test/user_id/README.md b/services/test/user_id/README.md
deleted file mode 100644
index 370b6bfb..0000000
--- a/services/test/user_id/README.md
+++ /dev/null
@@ -1 +0,0 @@
-A simple service that can be used for testing per-user services.
diff --git a/services/test/user_id/public/cpp/BUILD.gn b/services/test/user_id/public/cpp/BUILD.gn
deleted file mode 100644
index d964c958..0000000
--- a/services/test/user_id/public/cpp/BUILD.gn
+++ /dev/null
@@ -1,16 +0,0 @@
-# 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.
-
-source_set("manifest") {
-  sources = [
-    "manifest.cc",
-    "manifest.h",
-  ]
-
-  deps = [
-    "//base",
-    "//services/service_manager/public/cpp",
-    "//services/test/user_id/public/mojom",
-  ]
-}
diff --git a/services/test/user_id/public/cpp/OWNERS b/services/test/user_id/public/cpp/OWNERS
deleted file mode 100644
index 6faeaa47..0000000
--- a/services/test/user_id/public/cpp/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-per-file manifest.cc=set noparent
-per-file manifest.cc=file://ipc/SECURITY_OWNERS
-per-file manifest.h=set noparent
-per-file manifest.h=file://ipc/SECURITY_OWNERS
diff --git a/services/test/user_id/public/cpp/manifest.cc b/services/test/user_id/public/cpp/manifest.cc
deleted file mode 100644
index 7bff2cb..0000000
--- a/services/test/user_id/public/cpp/manifest.cc
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/test/user_id/public/cpp/manifest.h"
-
-#include "base/no_destructor.h"
-#include "services/service_manager/public/cpp/manifest_builder.h"
-#include "services/test/user_id/public/mojom/user_id.mojom.h"
-
-namespace user_id {
-
-const service_manager::Manifest& GetManifest() {
-  static base::NoDestructor<service_manager::Manifest> manifest{
-      service_manager::ManifestBuilder()
-          .WithServiceName("user_id")
-          .WithDisplayName("User ID Service")
-          .WithOptions(service_manager::ManifestOptionsBuilder().Build())
-          .ExposeCapability(
-              "user_id",
-              service_manager::Manifest::InterfaceList<mojom::UserId>())
-          .Build()};
-  return *manifest;
-}
-
-}  // namespace user_id
diff --git a/services/test/user_id/public/cpp/manifest.h b/services/test/user_id/public/cpp/manifest.h
deleted file mode 100644
index 88f060f..0000000
--- a/services/test/user_id/public/cpp/manifest.h
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright 2019 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_TEST_USER_ID_PUBLIC_CPP_MANIFEST_H_
-#define SERVICES_TEST_USER_ID_PUBLIC_CPP_MANIFEST_H_
-
-#include "services/service_manager/public/cpp/manifest.h"
-
-namespace user_id {
-
-const service_manager::Manifest& GetManifest();
-
-}  // namespace user_id
-
-#endif  // SERVICES_TEST_USER_ID_PUBLIC_CPP_MANIFEST_H_
diff --git a/services/test/user_id/public/mojom/BUILD.gn b/services/test/user_id/public/mojom/BUILD.gn
deleted file mode 100644
index 615c838e..0000000
--- a/services/test/user_id/public/mojom/BUILD.gn
+++ /dev/null
@@ -1,10 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//mojo/public/tools/bindings/mojom.gni")
-
-mojom("mojom") {
-  sources = [ "user_id.mojom" ]
-  public_deps = [ "//mojo/public/mojom/base" ]
-}
diff --git a/services/test/user_id/public/mojom/OWNERS b/services/test/user_id/public/mojom/OWNERS
deleted file mode 100644
index 08850f4..0000000
--- a/services/test/user_id/public/mojom/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-per-file *.mojom=set noparent
-per-file *.mojom=file://ipc/SECURITY_OWNERS
diff --git a/services/test/user_id/public/mojom/user_id.mojom b/services/test/user_id/public/mojom/user_id.mojom
deleted file mode 100644
index 8a41fda..0000000
--- a/services/test/user_id/public/mojom/user_id.mojom
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-module user_id.mojom;
-
-import "mojo/public/mojom/base/token.mojom";
-
-// Provides access to the instance group ID of the service in which this
-// interface is running.
-//
-// TODO(https://crbug.com/895591): This should be renamed or the entire service
-// removed. There are other test services, and Connector.BindInterface already
-// replies with the instance's instance group ID when connecting to any service.
-interface UserId {
-  // Returns the instance group of the service in which this interface is
-  // running.
-  GetInstanceGroup() => (mojo_base.mojom.Token instance_group);
-};
diff --git a/services/test/user_id/user_id_service.cc b/services/test/user_id/user_id_service.cc
deleted file mode 100644
index d1b5e638b..0000000
--- a/services/test/user_id/user_id_service.cc
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "services/test/user_id/user_id_service.h"
-#include "base/bind.h"
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-
-namespace user_id {
-
-UserIdService::UserIdService(
-    mojo::PendingReceiver<service_manager::mojom::Service> receiver)
-    : service_receiver_(this, std::move(receiver)) {
-  registry_.AddInterface<mojom::UserId>(base::BindRepeating(
-      &UserIdService::BindUserIdReceiver, base::Unretained(this)));
-}
-
-UserIdService::~UserIdService() = default;
-
-void UserIdService::OnBindInterface(
-    const service_manager::BindSourceInfo& source_info,
-    const std::string& interface_name,
-    mojo::ScopedMessagePipeHandle interface_pipe) {
-  registry_.BindInterface(interface_name, std::move(interface_pipe));
-}
-
-void UserIdService::BindUserIdReceiver(
-    mojo::PendingReceiver<mojom::UserId> receiver) {
-  receivers_.Add(this, std::move(receiver));
-}
-
-void UserIdService::GetInstanceGroup(GetInstanceGroupCallback callback) {
-  std::move(callback).Run(service_receiver_.identity().instance_group());
-}
-
-}  // namespace user_id
diff --git a/services/test/user_id/user_id_service.h b/services/test/user_id/user_id_service.h
deleted file mode 100644
index 7c4d3044..0000000
--- a/services/test/user_id/user_id_service.h
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef SERVICES_USER_ID_USER_ID_SERVICE_H_
-#define SERVICES_USER_ID_USER_ID_SERVICE_H_
-
-#include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/receiver_set.h"
-#include "services/service_manager/public/cpp/binder_registry.h"
-#include "services/service_manager/public/cpp/service.h"
-#include "services/service_manager/public/cpp/service_receiver.h"
-#include "services/service_manager/public/mojom/service.mojom.h"
-#include "services/test/user_id/public/mojom/user_id.mojom.h"
-
-namespace user_id {
-
-class UserIdService : public service_manager::Service, public mojom::UserId {
- public:
-  explicit UserIdService(
-      mojo::PenidngReceiver<service_manager::mojom::Service> receiver);
-  ~UserIdService() override;
-
- private:
-  // service_manager::Service:
-  void OnBindInterface(const service_manager::BindSourceInfo& source_info,
-                       const std::string& interface_name,
-                       mojo::ScopedMessagePipeHandle interface_pipe) override;
-
-  // mojom::UserId:
-  void GetInstanceGroup(GetInstanceGroupCallback callback) override;
-
-  void BindUserIdReceiver(mojo::PendingReceiver<mojom::UserId> receiver);
-
-  service_manager::ServiceReceiver service_receiver_;
-  service_manager::BinderRegistry registry_;
-  mojo::ReceiverSet<mojom::UserId> receivers_;
-
-  DISALLOW_COPY_AND_ASSIGN(UserIdService);
-};
-
-}  // namespace user_id
-
-#endif  // SERVICES_USER_ID_USER_ID_SERVICE_H_
diff --git a/testing/test.gni b/testing/test.gni
index 06537e31..1fab44d 100644
--- a/testing/test.gni
+++ b/testing/test.gni
@@ -249,6 +249,7 @@
     }
   } else if (is_ios) {
     assert(!defined(invoker.use_xvfb) || !invoker.use_xvfb)
+    _runtime_deps_file = "$root_out_dir/${target_name}.runtime_deps"
 
     declare_args() {
       # Keep the unittest-as-xctest functionality defaulted to off until the
@@ -335,6 +336,7 @@
 
       # Include the generate_wrapper as part of data_deps
       data_deps += [ ":${_wrapper_output_name}" ]
+      write_runtime_deps = _runtime_deps_file
     }
   } else if (is_chromeos && cros_board != "") {
     assert(!defined(invoker.use_xvfb) || !invoker.use_xvfb)
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 5e967a9..07ab6d4 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -6910,27 +6910,6 @@
             ]
         }
     ],
-    "TextureLayerSkipWaitForActivation": [
-        {
-            "platforms": [
-                "android",
-                "android_webview",
-                "chromeos",
-                "ios",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "TextureLayerSkipWaitForActivation",
-                    "enable_features": [
-                        "TextureLayerSkipWaitForActivation"
-                    ]
-                }
-            ]
-        }
-    ],
     "ThrottleInstallingServiceWorker": [
         {
             "platforms": [
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 b0d2e3d..9c359c2 100644
--- a/third_party/blink/renderer/bindings/core/v8/module_record.cc
+++ b/third_party/blink/renderer/bindings/core/v8/module_record.cc
@@ -56,12 +56,9 @@
 ScriptPromise ModuleEvaluationResult::GetPromise(
     ScriptState* script_state) const {
   DCHECK(base::FeatureList::IsEnabled(features::kTopLevelAwait));
+  DCHECK(IsSuccess());
   DCHECK(!value_.IsEmpty());
-  if (IsSuccess()) {
-    return ScriptPromise(script_state, value_);
-  } else {
-    return ScriptPromise::Reject(script_state, value_);
-  }
+  return ScriptPromise(script_state, value_);
 }
 
 ModuleRecordProduceCacheData::ModuleRecordProduceCacheData(
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index 57a29ee2..4e5f756 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -303,11 +303,13 @@
 }
 
 void WebViewImpl::DoDeferredCloseWindowSoon() {
-  // The main widget is currently not active. The active main frame widget is
-  // in a different process.  Have the browser route the close request to the
-  // active widget instead, so that the correct unload handlers are run.
-  DCHECK(remote_main_frame_host_remote_);
-  remote_main_frame_host_remote_->RouteCloseEvent();
+  // The main widget is currently not active. The active main frame widget is in
+  // a different process. Have the browser route the close request to the active
+  // widget instead, so that the correct unload handlers are run. We do an early
+  // return instead of a DCHECK to guard against DidDetachRemoteMainFrame()
+  // being called between this method is schedule and when it's actually run.
+  if (remote_main_frame_host_remote_.is_bound())
+    remote_main_frame_host_remote_->RouteCloseEvent();
 }
 
 WebViewImpl::WebViewImpl(
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 6ce90f6a..62fe7d4b 100644
--- a/third_party/blink/renderer/core/script/modulator_impl_base.cc
+++ b/third_party/blink/renderer/core/script/modulator_impl_base.cc
@@ -8,7 +8,6 @@
 #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"
@@ -49,24 +48,6 @@
 
 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);
 }
@@ -370,17 +351,15 @@
                                        v8::MicrotasksScope::kRunMicrotasks);
   ScriptState::EscapableScope scope(script_state_);
 
-  // Without TLA: <spec step="5">Let evaluationStatus be null.</spec>
+  // <spec step="5">Let evaluationStatus be null.</spec>
+  //
+  // |result| corresponds to "evaluationStatus of [[Type]]: throw".
   ModuleEvaluationResult result = ModuleEvaluationResult::Empty();
 
   // <spec step="6">If script's error to rethrow is not null, ...</spec>
   if (module_script->HasErrorToRethrow()) {
-    // 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>
+    // <spec step="6">... then set evaluationStatus to Completion { [[Type]]:
+    // throw, [[Value]]: script's error to rethrow, [[Target]]: empty }.</spec>
     result = ModuleEvaluationResult::FromException(
         module_script->CreateErrorToRethrow().V8Value());
   } else {
@@ -408,36 +387,25 @@
     }
   }
 
-  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 {
-    // <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">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();
+    // <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))
+    return result.Escape(&scope);
+  else
+    return ModuleEvaluationResult::Empty();
 }
 
 void ModulatorImplBase::Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/modules/canvas/canvas_fuzzer.cc b/third_party/blink/renderer/modules/canvas/canvas_fuzzer.cc
index c828a022..cd74623 100644
--- a/third_party/blink/renderer/modules/canvas/canvas_fuzzer.cc
+++ b/third_party/blink/renderer/modules/canvas/canvas_fuzzer.cc
@@ -81,6 +81,10 @@
 
 // Fuzzer for blink::ManifestParser
 int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
+  // TODO(bug/1124824) Disabling CanvasFuzzer as it seems to be producing lots
+  // of false positives.
+  return 0;
+
   // We are ignoring small tests
   constexpr int minSizeHtml = 20;
   if (size < minSizeHtml)
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
index 584b1e72..d379ff72 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
@@ -250,15 +250,15 @@
 
   canvas_resource->PrepareTransferableResource(
       &resource, &frame_resource->release_callback, kVerifiedSyncToken);
-  resource.id = next_resource_id_;
+  const unsigned resource_id = next_resource_id_;
+  resource.id = resource_id;
 
-  resources_.insert(next_resource_id_, std::move(frame_resource));
+  resources_.insert(resource_id, std::move(frame_resource));
 
   // TODO(crbug.com/869913): add unit testing for this.
   const gfx::Size canvas_resource_size(canvas_resource->Size());
 
-  PostImageToPlaceholderIfNotBlocked(std::move(canvas_resource),
-                                     next_resource_id_);
+  PostImageToPlaceholderIfNotBlocked(std::move(canvas_resource), resource_id);
 
   frame->resource_list.push_back(std::move(resource));
 
@@ -278,7 +278,7 @@
   // marked as vertically flipped unless someone else has done the flip for us.
   const bool yflipped =
       SharedGpuContext::IsGpuCompositingEnabled() && needs_vertical_flip;
-  quad->SetAll(sqs, bounds, bounds, needs_blending, resource.id,
+  quad->SetAll(sqs, bounds, bounds, needs_blending, resource_id,
                canvas_resource_size, kPremultipliedAlpha, uv_top_left,
                uv_bottom_right, SK_ColorTRANSPARENT, vertex_opacity, yflipped,
                nearest_neighbor, /*secure_output_only=*/false,
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
index 2d175599..abd8322 100644
--- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
+++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider.cc
@@ -893,6 +893,9 @@
   if (!context_provider_wrapper)
     return nullptr;
 
+  if (size.Width() <= 0 || size.Height() <= 0)
+    return nullptr;
+
   const auto& capabilities =
       context_provider_wrapper->ContextProvider()->GetCapabilities();
   bool skia_use_dawn =
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
index c2be07c..ad71c43 100644
--- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
+++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
@@ -584,15 +584,19 @@
   // Has no 3D rendering context.
   auto transform1 = CreateTransform(t0(), TransformationMatrix());
   // Establishes a 3D rendering context.
-  TransformPaintPropertyNode::State transform2_3_state;
-  transform2_3_state.rendering_context_id = 1;
-  transform2_3_state.direct_compositing_reasons =
+  TransformPaintPropertyNode::State transform2_state;
+  transform2_state.rendering_context_id = 1;
+  transform2_state.direct_compositing_reasons =
       CompositingReason::kWillChangeTransform;
   auto transform2 = TransformPaintPropertyNode::Create(
-      *transform1, std::move(transform2_3_state));
+      *transform1, std::move(transform2_state));
   // Extends the 3D rendering context of transform2.
+  TransformPaintPropertyNode::State transform3_state;
+  transform3_state.rendering_context_id = 1;
+  transform3_state.direct_compositing_reasons =
+      CompositingReason::kWillChangeTransform;
   auto transform3 = TransformPaintPropertyNode::Create(
-      *transform2, std::move(transform2_3_state));
+      *transform2, std::move(transform3_state));
   // Establishes a 3D rendering context distinct from transform2.
   TransformPaintPropertyNode::State transform4_state;
   transform4_state.rendering_context_id = 2;
@@ -4301,8 +4305,9 @@
   matrix.Scale(2);
   TransformPaintPropertyNode::State transform_state{matrix};
   transform_state.flags.in_subtree_of_page_scale = false;
-  transform_state.compositor_element_id =
+  const CompositorElementId compositor_element_id =
       CompositorElementIdFromUniqueObjectId(1);
+  transform_state.compositor_element_id = compositor_element_id;
 
   auto scale_transform_node = TransformPaintPropertyNode::Create(
       TransformPaintPropertyNode::Root(), std::move(transform_state));
@@ -4313,8 +4318,8 @@
   Update(artifact.Build(), viewport_properties);
 
   cc::TransformTree& transform_tree = GetPropertyTrees().transform_tree;
-  cc::TransformNode* cc_transform_node = transform_tree.FindNodeFromElementId(
-      transform_state.compositor_element_id);
+  cc::TransformNode* cc_transform_node =
+      transform_tree.FindNodeFromElementId(compositor_element_id);
   EXPECT_TRUE(cc_transform_node);
   EXPECT_EQ(TransformationMatrix::ToTransform(matrix),
             cc_transform_node->local);
@@ -4331,14 +4336,18 @@
 
   TransformPaintPropertyNode::State page_scale_transform_state;
   page_scale_transform_state.flags.in_subtree_of_page_scale = false;
-  page_scale_transform_state.compositor_element_id =
+  const CompositorElementId page_scale_compositor_element_id =
       CompositorElementIdFromUniqueObjectId(1);
+  page_scale_transform_state.compositor_element_id =
+      page_scale_compositor_element_id;
   auto page_scale_transform = TransformPaintPropertyNode::Create(
       *ancestor_transform, std::move(page_scale_transform_state));
 
   TransformPaintPropertyNode::State descendant_transform_state;
-  descendant_transform_state.compositor_element_id =
+  const CompositorElementId descendant_compositor_element_id =
       CompositorElementIdFromUniqueObjectId(2);
+  descendant_transform_state.compositor_element_id =
+      descendant_compositor_element_id;
   descendant_transform_state.flags.in_subtree_of_page_scale = true;
   descendant_transform_state.direct_compositing_reasons =
       CompositingReason::kWillChangeTransform;
@@ -4353,8 +4362,8 @@
   Update(artifact.Build(), viewport_properties);
 
   cc::TransformTree& transform_tree = GetPropertyTrees().transform_tree;
-  const auto* cc_page_scale_transform = transform_tree.FindNodeFromElementId(
-      page_scale_transform_state.compositor_element_id);
+  const auto* cc_page_scale_transform =
+      transform_tree.FindNodeFromElementId(page_scale_compositor_element_id);
   // The page scale node is not in a subtree of the page scale layer.
   EXPECT_FALSE(cc_page_scale_transform->in_subtree_of_page_scale_layer);
 
@@ -4367,8 +4376,8 @@
   }
 
   // Descendants of the page scale node should be in the page scale subtree.
-  const auto* cc_descendant_transform = transform_tree.FindNodeFromElementId(
-      descendant_transform_state.compositor_element_id);
+  const auto* cc_descendant_transform =
+      transform_tree.FindNodeFromElementId(descendant_compositor_element_id);
   EXPECT_TRUE(cc_descendant_transform->in_subtree_of_page_scale_layer);
 }
 
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
index d81d3a73..251f55c 100644
--- a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
+++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
@@ -75,7 +75,7 @@
       return *cached_value;
 
     SkColor inverted_color = filter->InvertColor(color);
-    cache_.Put(key, std::move(inverted_color));
+    cache_.Put(key, static_cast<SkColor>(inverted_color));
     return inverted_color;
   }
 
diff --git a/third_party/blink/renderer/platform/graphics/paint/display_item_client.h b/third_party/blink/renderer/platform/graphics/paint/display_item_client.h
index 27441eaf2..a7d7b94 100644
--- a/third_party/blink/renderer/platform/graphics/paint/display_item_client.h
+++ b/third_party/blink/renderer/platform/graphics/paint/display_item_client.h
@@ -27,15 +27,12 @@
 // dereferenced unless we can make sure the client is still alive.
 class PLATFORM_EXPORT DisplayItemClient {
  public:
-  DisplayItemClient()
-      : paint_invalidation_reason_(PaintInvalidationReason::kJustCreated),
-        is_in_paint_controller_before_finish_cycle_(false) {
+  DisplayItemClient() {
 #if DCHECK_IS_ON()
     OnCreate();
 #endif
   }
   virtual ~DisplayItemClient() {
-    CHECK(!is_in_paint_controller_before_finish_cycle_);
 #if DCHECK_IS_ON()
     OnDestroy();
 #endif
@@ -109,12 +106,6 @@
     return paint_invalidation_reason_ == PaintInvalidationReason::kNone;
   }
 
-  // This is used to track early deletion of DisplayItemClient after paint
-  // before PaintController::FinishCycle().
-  void SetIsInPaintControllerBeforeFinishCycle(bool b) const {
-    is_in_paint_controller_before_finish_cycle_ = b;
-  }
-
   String ToString() const;
 
  private:
@@ -131,8 +122,8 @@
   void OnDestroy();
 #endif
 
-  mutable PaintInvalidationReason paint_invalidation_reason_ : 7;
-  mutable bool is_in_paint_controller_before_finish_cycle_ : 1;
+  mutable PaintInvalidationReason paint_invalidation_reason_ =
+      PaintInvalidationReason::kJustCreated;
 
   DISALLOW_COPY_AND_ASSIGN(DisplayItemClient);
 };
diff --git a/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc b/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc
index ce448cc7e..2b75e09 100644
--- a/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc
+++ b/third_party/blink/renderer/platform/graphics/paint/paint_controller.cc
@@ -277,9 +277,6 @@
   if (usage_ == kTransient)
     return;
 
-  if (!display_item.IsMovedFromCachedSubsequence())
-    display_item.Client().SetIsInPaintControllerBeforeFinishCycle(true);
-
 #if DCHECK_IS_ON()
   if (display_item.IsCacheable()) {
     auto index = FindItemFromIdIndexMap(display_item.GetId(),
@@ -330,12 +327,6 @@
 }
 
 void PaintController::DidAppendChunk() {
-  if (usage_ == kMultiplePaints &&
-      !new_paint_chunks_.LastChunk().is_moved_from_cached_subsequence) {
-    new_paint_chunks_.LastChunk()
-        .id.client.SetIsInPaintControllerBeforeFinishCycle(true);
-  }
-
 #if DCHECK_IS_ON()
   if (new_paint_chunks_.LastChunk().is_cacheable) {
     AddToIdIndexMap(new_paint_chunks_.LastChunk().id,
@@ -612,7 +603,6 @@
     client.ClearPartialInvalidationVisualRect();
     if (client.IsCacheable())
       client.Validate();
-    client.SetIsInPaintControllerBeforeFinishCycle(false);
   }
   for (const auto& chunk : current_paint_artifact_->PaintChunks()) {
     const auto& client = chunk.id.client;
@@ -625,7 +615,6 @@
     }
     if (client.IsCacheable())
       client.Validate();
-    client.SetIsInPaintControllerBeforeFinishCycle(false);
   }
 
   current_paint_artifact_->FinishCycle();
diff --git a/third_party/blink/renderer/platform/heap/heap.cc b/third_party/blink/renderer/platform/heap/heap.cc
index c27d0ed..2a5b1790 100644
--- a/third_party/blink/renderer/platform/heap/heap.cc
+++ b/third_party/blink/renderer/platform/heap/heap.cc
@@ -314,9 +314,10 @@
                    YieldPredicate should_yield,
                    int task_id) {
   // For concurrent markers, should_yield also reports marked bytes.
-  if (should_yield()) {
+  if (worklist->IsLocalViewEmpty(task_id))
+    return true;
+  if (should_yield())
     return false;
-  }
   size_t processed_callback_count = kDeadlineCheckInterval;
   typename Worklist::EntryType item;
   while (worklist->Pop(task_id, &item)) {
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index cee8339..5bd048fe 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -726,7 +726,7 @@
 crbug.com/1111708 external/wpt/css/css-flexbox/flexbox_justifycontent-center-overflow.html [ Failure ]
 crbug.com/1111128 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-min-height-auto-002b.html [ Failure ]
 
-# These have some incorrect expectations.
+# These have some incorrect expectations and will supposedly be deleted soon (Sep 2020) by mozilla.
 crbug.com/704294 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003.html [ Failure ]
 crbug.com/704294 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-003v.html [ Failure ]
 crbug.com/704294 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-intrinsic-ratio-004.html [ Failure ]
@@ -1624,17 +1624,10 @@
 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 ]
 
-# 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/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 ]
 
 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 ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 3b7e9c8..f62870f 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1,14 +1,7 @@
 [
   {
     "prefix": "module-top-level-await",
-    "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/"
-    ],
+    "bases": [],
     "args": ["--enable-features=TopLevelAwait"]
   },
   {
diff --git a/third_party/blink/web_tests/W3CImportExpectations b/third_party/blink/web_tests/W3CImportExpectations
index d653d5999..b9b7018 100644
--- a/third_party/blink/web_tests/W3CImportExpectations
+++ b/third_party/blink/web_tests/W3CImportExpectations
@@ -73,7 +73,6 @@
 external/wpt/css/CSS2/selector [ Skip ]
 external/wpt/css/CSS2/selectors [ Skip ]
 external/wpt/css/CSS2/syntax [ Skip ]
-external/wpt/css/CSS2/tables [ Skip ]
 external/wpt/css/CSS2/ui [ Skip ]
 external/wpt/css/CSS2/values [ Skip ]
 external/wpt/css/CSS2/visudet [ Skip ]
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 8001eeed..fad51a4 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
@@ -161839,15 +161839,15 @@
      []
     ],
     "domain": {
-     "domain-attribute-host-with-and-without-leading-period.sub.html.sub.headers": [
+     "domain-attribute-host-with-and-without-leading-period.sub.https.html.sub.headers": [
       "77d3d8c0c447c99fa556ea58dee090fadf7ad31d",
       []
      ],
-     "domain-attribute-host-with-leading-period.sub.html.sub.headers": [
+     "domain-attribute-host-with-leading-period.sub.https.html.sub.headers": [
       "7de4ae2e6a5093fce5cc4405c0f1b92bf5f0981a",
       []
      ],
-     "domain-attribute-matches-host.sub.html.sub.headers": [
+     "domain-attribute-matches-host.sub.https.html.sub.headers": [
       "8a2329e8c2f7fdd09847ae8a51e543e4b9495c87",
       []
      ],
@@ -220531,7 +220531,7 @@
      []
     ],
     "sanitizer-api.tentative.idl": [
-     "25cba22ecfc4ee194cf4f21aa2c0d24c7c16de05",
+     "600ae0514a3094e19813476cd065162b9e0dfb4c",
      []
     ],
     "savedata.idl": [
@@ -226915,16 +226915,16 @@
      []
     ],
     "sanitizer-sanitize.tentative-expected.txt": [
-     "0b905ce775358ec7f21e604200f393f883d26cab",
+     "c5224d4efab840963aa3acd47e776238cc13cf9e",
      []
     ],
     "sanitizer-sanitizeToString.tentative-expected.txt": [
-     "04e4c685a582f453af3d22b02b82be4f6fd7298a",
+     "de05576e7ba55e476dde82fdb42f3b9e014089ff",
      []
     ],
     "support": {
      "testcases.sub.js": [
-      "d1af1c9b5a9fc5d057fd3fd14c48283ecfbb7337",
+      "a3cc6d38c8cd3d98a93a082fa4216a83de00d471",
       []
      ]
     }
@@ -231912,19 +231912,19 @@
       []
      ],
      "cacert.key": [
-      "c36ebcbc91054d4d61036004883f9bfbf7d4f5ac",
+      "7b83e8f0e9ebe229c83335b3a2f0632540942ed2",
       []
      ],
      "cacert.pem": [
-      "f450f014d9f09b7f7c4e60f23a2f7cb779ab8188",
+      "a8ce54be5579b743001fa0de3c163129965d356c",
       []
      ],
      "web-platform.test.key": [
-      "0d422053f76ba4df1e69df513fe916532c4ccfad",
+      "c4f5dc3f2cfba081e4536708c4667e7595e09d74",
       []
      ],
      "web-platform.test.pem": [
-      "e7b1b018466895f32356c24ae1f3da0fff2f1c4c",
+      "438f504b2b696757ea292e3c53ea0f0baa1fdd23",
       []
      ]
     },
@@ -238204,7 +238204,7 @@
         []
        ],
        "chrome.py": [
-        "880e2bd43eb6bbb4c9b8d052af77537ce3f27e3d",
+        "486070ad86d451e73f0e56ce720134024ffc1121",
         []
        ],
        "chrome_android.py": [
@@ -238216,7 +238216,7 @@
         []
        ],
        "chrome_spki_certs.py": [
-        "e8971e7acde3ed68bf5671e7e2f812765eb7c6c8",
+        "289453bd080959445ea5a452362b05a7675735e4",
         []
        ],
        "edge.py": [
@@ -269079,21 +269079,21 @@
      ]
     ],
     "domain": {
-     "domain-attribute-host-with-and-without-leading-period.sub.html": [
+     "domain-attribute-host-with-and-without-leading-period.sub.https.html": [
       "7273daa8499f6b37cc959b390cbab77d46665ffb",
       [
        null,
        {}
       ]
      ],
-     "domain-attribute-host-with-leading-period.sub.html": [
+     "domain-attribute-host-with-leading-period.sub.https.html": [
       "5b295e7393fba696bfef438179de15c05a765def",
       [
        null,
        {}
       ]
      ],
-     "domain-attribute-matches-host.sub.html": [
+     "domain-attribute-matches-host.sub.https.html": [
       "f790b49d98b91cc8db63ba440b635eb8e165cfac",
       [
        null,
@@ -269396,7 +269396,7 @@
        }
       ]
      ],
-     "iframe.document.html": [
+     "iframe.document.https.html": [
       "2d276dbcaa9ce740ffdd8c8516defe18ab51de95",
       [
        null,
@@ -382207,21 +382207,21 @@
      ]
     ],
     "sanitizer-config.tentative.html": [
-     "c780bbe21b74fc96c491b29181a05decb3e5fea5",
+     "5c115a467cb64e1e93e9293692d122271d64df8a",
      [
       null,
       {}
      ]
     ],
     "sanitizer-sanitize.tentative.html": [
-     "219eff418918484a2b8f42062ea7bf8cb60dbad8",
+     "44961e02f4e8dcd876b250f2826cea4c7fe487ae",
      [
       null,
       {}
      ]
     ],
     "sanitizer-sanitizeToString.tentative.html": [
-     "98bb4a4601863d2ee50ef18333f88cfbe43e40fe",
+     "7efbc3ca7bd7d8c84595744d622dc4c92c87e347",
      [
       null,
       {}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-001.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-001.html
new file mode 100644
index 0000000..6972d9c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-001.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on non-stretched flex item w/ intrinsic ratio.
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: row;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: flex-start;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="16" data-expected-height="16">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 0 0 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-001v.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-001v.html
new file mode 100644
index 0000000..91231dc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-001v.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on non-stretched flex item w/ intrinsic ratio
+      (with a vertical writing-mode on the flex items).
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: row;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: flex-start;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        writing-mode: vertical-lr;
+
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="16" data-expected-height="16">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 0 0 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-002.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-002.html
new file mode 100644
index 0000000..4ae30b8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-002.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on non-stretched flex item w/ intrinsic ratio.
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: column;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: flex-start;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="16" data-expected-height="16">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 0 0 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-002v.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-002v.html
new file mode 100644
index 0000000..6d0c0ca
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-002v.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on non-stretched flex item w/ intrinsic ratio
+      (with a vertical writing-mode on the flex items).
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: column;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: flex-start;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        writing-mode: vertical-lr;
+
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="16" data-expected-height="16">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 0 0 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="34" data-expected-height="34">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003-expected.txt
new file mode 100644
index 0000000..4b4d219c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003-expected.txt
@@ -0,0 +1,33 @@
+This is a testharness.js-based test.
+FAIL .flexbox > img 1 assert_equals: 
+<img src="support/solidblue.png" data-expected-width="16" data-expected-height="40">
+width expected 16 but got 40
+PASS .flexbox > img 2
+PASS .flexbox > img 3
+PASS .flexbox > img 4
+FAIL .flexbox > img 5 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 34px" data-expected-width="34" data-expected-height="40">
+width expected 34 but got 40
+FAIL .flexbox > img 6 assert_equals: 
+<img src="support/solidblue.png" style="min-height: 34px" data-expected-width="34" data-expected-height="40">
+width expected 34 but got 40
+FAIL .flexbox > img 7 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="34" data-expected-height="40">
+width expected 34 but got 40
+FAIL .flexbox > img 8 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="34" data-expected-height="40">
+width expected 34 but got 40
+PASS .flexbox > img 9
+PASS .flexbox > img 10
+PASS .flexbox > img 11
+PASS .flexbox > img 12
+PASS .flexbox > img 13
+PASS .flexbox > img 14
+PASS .flexbox > img 15
+PASS .flexbox > img 16
+PASS .flexbox > img 17
+PASS .flexbox > img 18
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003.html
new file mode 100644
index 0000000..03a9a6e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on stretched flex item w/ intrinsic ratio.
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: row;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: stretch;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="16" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 0 0 30px" data-expected-width="30" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="34" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="34" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="34" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="34" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="10">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="40">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003v-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003v-expected.txt
new file mode 100644
index 0000000..4b4d219c
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003v-expected.txt
@@ -0,0 +1,33 @@
+This is a testharness.js-based test.
+FAIL .flexbox > img 1 assert_equals: 
+<img src="support/solidblue.png" data-expected-width="16" data-expected-height="40">
+width expected 16 but got 40
+PASS .flexbox > img 2
+PASS .flexbox > img 3
+PASS .flexbox > img 4
+FAIL .flexbox > img 5 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 34px" data-expected-width="34" data-expected-height="40">
+width expected 34 but got 40
+FAIL .flexbox > img 6 assert_equals: 
+<img src="support/solidblue.png" style="min-height: 34px" data-expected-width="34" data-expected-height="40">
+width expected 34 but got 40
+FAIL .flexbox > img 7 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="34" data-expected-height="40">
+width expected 34 but got 40
+FAIL .flexbox > img 8 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="34" data-expected-height="40">
+width expected 34 but got 40
+PASS .flexbox > img 9
+PASS .flexbox > img 10
+PASS .flexbox > img 11
+PASS .flexbox > img 12
+PASS .flexbox > img 13
+PASS .flexbox > img 14
+PASS .flexbox > img 15
+PASS .flexbox > img 16
+PASS .flexbox > img 17
+PASS .flexbox > img 18
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003v.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003v.html
new file mode 100644
index 0000000..fd72802
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-003v.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on stretched flex item w/ intrinsic ratio
+      (with a vertical writing-mode on the flex items).
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: row;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: stretch;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        writing-mode: vertical-rl;
+
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="16" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 0 0 30px" data-expected-width="30" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="34" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="34" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="34" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="34" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="10">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="40">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004-expected.txt
new file mode 100644
index 0000000..f88cc075
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004-expected.txt
@@ -0,0 +1,33 @@
+This is a testharness.js-based test.
+FAIL .flexbox > img 1 assert_equals: 
+<img src="support/solidblue.png" data-expected-width="40" data-expected-height="16">
+height expected 16 but got 40
+PASS .flexbox > img 2
+PASS .flexbox > img 3
+PASS .flexbox > img 4
+FAIL .flexbox > img 5 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 34px" data-expected-width="40" data-expected-height="34">
+height expected 34 but got 40
+FAIL .flexbox > img 6 assert_equals: 
+<img src="support/solidblue.png" style="min-height: 34px" data-expected-width="40" data-expected-height="34">
+height expected 34 but got 40
+FAIL .flexbox > img 7 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="40" data-expected-height="34">
+height expected 34 but got 40
+FAIL .flexbox > img 8 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="40" data-expected-height="34">
+height expected 34 but got 40
+PASS .flexbox > img 9
+PASS .flexbox > img 10
+PASS .flexbox > img 11
+PASS .flexbox > img 12
+PASS .flexbox > img 13
+PASS .flexbox > img 14
+PASS .flexbox > img 15
+PASS .flexbox > img 16
+PASS .flexbox > img 17
+PASS .flexbox > img 18
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004.html
new file mode 100644
index 0000000..15e9f729
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on stretched flex item w/ intrinsic ratio.
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: column;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: stretch;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="40" data-expected-height="16">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="40" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 0 0 30px" data-expected-width="40" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="40" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="40" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="40" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="40" data-expected-height="34">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="10" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004v-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004v-expected.txt
new file mode 100644
index 0000000..f88cc075
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004v-expected.txt
@@ -0,0 +1,33 @@
+This is a testharness.js-based test.
+FAIL .flexbox > img 1 assert_equals: 
+<img src="support/solidblue.png" data-expected-width="40" data-expected-height="16">
+height expected 16 but got 40
+PASS .flexbox > img 2
+PASS .flexbox > img 3
+PASS .flexbox > img 4
+FAIL .flexbox > img 5 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 34px" data-expected-width="40" data-expected-height="34">
+height expected 34 but got 40
+FAIL .flexbox > img 6 assert_equals: 
+<img src="support/solidblue.png" style="min-height: 34px" data-expected-width="40" data-expected-height="34">
+height expected 34 but got 40
+FAIL .flexbox > img 7 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="40" data-expected-height="34">
+height expected 34 but got 40
+FAIL .flexbox > img 8 assert_equals: 
+<img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="40" data-expected-height="34">
+height expected 34 but got 40
+PASS .flexbox > img 9
+PASS .flexbox > img 10
+PASS .flexbox > img 11
+PASS .flexbox > img 12
+PASS .flexbox > img 13
+PASS .flexbox > img 14
+PASS .flexbox > img 15
+PASS .flexbox > img 16
+PASS .flexbox > img 17
+PASS .flexbox > img 18
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004v.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004v.html
new file mode 100644
index 0000000..10e871a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-004v.html
@@ -0,0 +1,131 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on stretched flex item w/ intrinsic ratio
+      (with a vertical writing-mode on the flex items).
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: column;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: stretch;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        writing-mode: vertical-rl;
+
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="40" data-expected-height="16">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="40" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 0 0 30px" data-expected-width="40" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="40" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="40" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="40" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="40" data-expected-height="34">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="10" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-005.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-005.html
new file mode 100644
index 0000000..c4250956
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-005.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on non-stretched flexible flex item w/ intrinsic ratio.
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: row;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: flex-start;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        flex: 1;
+
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="40" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 1 1 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="10" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-005v.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-005v.html
new file mode 100644
index 0000000..4acb8e25
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-005v.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on non-stretched flexible flex item w/ intrinsic ratio
+      (with a vertical writing-mode on the flex items).
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: row;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: flex-start;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        flex: 1;
+        writing-mode: vertical-lr;
+
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="40" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 1 1 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="10" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="40" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-006.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-006.html
new file mode 100644
index 0000000..e97305e7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-006.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on non-stretched flexible flex item w/ intrinsic ratio.
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: column;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: flex-start;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        flex: 1;
+
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 1 1 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="10">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="40">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-006v.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-006v.html
new file mode 100644
index 0000000..4f42288
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-006v.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on non-stretched flexible flex item w/ intrinsic ratio
+      (with a vertical writing-mode on the flex items).
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: column;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: flex-start;
+
+        float: left; /* For testing in "rows" */
+      }
+      br { clear: both; }
+
+      .flexbox > * {
+        flex: 1;
+        writing-mode: vertical-lr;
+
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 1 1 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px" data-expected-width="10" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 10px" data-expected-width="10" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              max-height: 6px" data-expected-width="6" data-expected-height="6">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 6px;
+                                              max-height: 10px" data-expected-width="6" data-expected-height="10">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="40">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="40" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="40">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="40">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007.html
new file mode 100644
index 0000000..16728b8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on non-stretched flex item w/ intrinsic ratio,
+      some padding, and box-sizing:border-box.
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: row;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: flex-start;
+
+        float: left; /* For testing in "rows" */
+      }
+      img {
+        padding: 1px 2px 3px 4px;
+        box-sizing: border-box;
+        background: pink;
+      }
+
+      br { clear: both; }
+
+      .flexbox > * {
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="22" data-expected-height="20">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="28">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="32" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 0 0 30px" data-expected-width="30" data-expected-height="28">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="34" data-expected-height="32">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="36" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="36" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="34" data-expected-height="32">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 16px" data-expected-width="16" data-expected-height="14">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 16px" data-expected-width="18" data-expected-height="16">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 20px;
+                                              max-height: 14px" data-expected-width="16" data-expected-height="14">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 14px;
+                                              max-height: 20px" data-expected-width="14" data-expected-height="12">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007v.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007v.html
new file mode 100644
index 0000000..c9fbcc3e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/image-as-flexitem-size-007v.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<!--
+     Any copyright is dedicated to the Public Domain.
+     http://creativecommons.org/publicdomain/zero/1.0/
+-->
+<html>
+  <head>
+    <meta charset="utf-8">
+    <title>
+      CSS Test: Testing how explicit main-size & cross-size constraints
+      influence sizing on non-stretched flex item w/ intrinsic ratio,
+      some padding, box-sizing:border-box, and a vertical writing-mode.
+    </title>
+    <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com">
+    <link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-main-size">
+    <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#hypothetical-cross-size">
+    <style>
+      .flexbox {
+        display: flex;
+        flex-direction: row;
+        border: 1px solid black;
+        margin: 0 2px 2px 0; /* (Just for spacing things out, visually) */
+        width: 40px;
+        height: 40px;
+
+        justify-content: flex-start;
+        align-items: flex-start;
+
+        float: left; /* For testing in "rows" */
+      }
+      img {
+        padding: 1px 2px 3px 4px;
+        box-sizing: border-box;
+        background: pink;
+      }
+
+      br { clear: both; }
+
+      .flexbox > * {
+        writing-mode: vertical-lr;
+
+        /* Disable "min-width:auto"/"min-height:auto" to focus purely on
+           later channels of influence. */
+        min-width: 0;
+        min-height: 0;
+      }
+    </style>
+    <script src="/resources/testharness.js"></script>
+    <script src="/resources/testharnessreport.js"></script>
+    <script src="/resources/check-layout-th.js"></script>
+  </head>
+  <body onload="checkLayout('.flexbox > img')">
+    <!-- NOTE: solidblue.png has an intrinsic size of 16px by 16px. -->
+
+    <!-- Row 1: no special sizing: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" data-expected-width="22" data-expected-height="20">
+    </div>
+    <br>
+
+    <!-- Row 2: Specified main-size, cross-size, or flex-basis: -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px" data-expected-width="30" data-expected-height="28">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="height: 30px" data-expected-width="32" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="flex: 0 0 30px" data-expected-width="30" data-expected-height="28">
+    </div>
+    <br>
+
+    <!-- Row 3: min main-size OR min cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px" data-expected-width="34" data-expected-height="32">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-height: 34px" data-expected-width="36" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              min-height: 34px" data-expected-width="36" data-expected-height="34">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 34px;
+                                              min-height: 30px" data-expected-width="34" data-expected-height="32">
+    </div>
+    <br>
+
+    <!-- Row 4: max main-size OR max cross-size, or both -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 16px" data-expected-width="16" data-expected-height="14">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-height: 16px" data-expected-width="18" data-expected-height="16">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 20px;
+                                              max-height: 14px" data-expected-width="16" data-expected-height="14">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 14px;
+                                              max-height: 20px" data-expected-width="14" data-expected-height="12">
+    </div>
+    <br>
+
+    <!-- Row 5: min main-size vs. max cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <br>
+
+    <!-- Row 6: min|max main-size vs. explicit cross-size, & vice versa -->
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="min-width: 30px;
+                                              height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 30px;
+                                              max-height: 10px" data-expected-width="30" data-expected-height="10">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="max-width: 10px;
+                                              height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+    <div class="flexbox">
+      <img src="support/solidblue.png" style="width: 10px;
+                                              min-height: 30px" data-expected-width="10" data-expected-height="30">
+    </div>
+  </body>
+</html>
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 50933da..73a6ce3 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,7 +9,6 @@
     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 51adb09d..0d67cb8 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,7 +9,6 @@
     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 bc52119b..5c0adff 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,7 +9,6 @@
     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 2480a60..6f119e30 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,7 +9,6 @@
     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 673bf28..a7df1df0 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,7 +9,6 @@
     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 8a16266f..9b00df3 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,7 +9,6 @@
     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
deleted file mode 100644
index da07faf4..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4-tla.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!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
deleted file mode 100644
index f3347c1..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4.1.mjs
+++ /dev/null
@@ -1,8 +0,0 @@
-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
deleted file mode 100644
index 96a5cca..0000000
--- a/third_party/blink/web_tests/external/wpt/html/semantics/scripting-1/the-script-element/module/evaluation-order-4.2.mjs
+++ /dev/null
@@ -1,5 +0,0 @@
-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 e54bf5d..f269dcbcb 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,9 +10,7 @@
 
   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 20645f4d..f59c3c0 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,20 +6,17 @@
 <script>
 async_test(t => {
   const iframe = document.createElement("iframe");
+
   iframe.onerror = t.unreached_func("Error loading iframe");
-
-  let onLoadWasCalled = false;
-
-  iframe.onload = t.step_func(() => {
-    onLoadWasCalled = true;
+  let testEndWasCalled = false;
+  document.addEventListener("documentWriteDone", t.step_func(() => {
     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");
+    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");
+  });
 
   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 edc9e80c..5c55bed6 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,11 +1,10 @@
 <!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 4f1281b..5fc30a8 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,14 +9,18 @@
   document.test = t;
 
   const iframe = document.createElement("iframe");
-  iframe.onerror = t.unreached_func("Error loading iframe");
 
-  document.addEventListener("documentWriteDone", t.step_func(() => {
+  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);
     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/tools/certs/cacert.key b/third_party/blink/web_tests/external/wpt/tools/certs/cacert.key
index c36ebcb..7b83e8f0 100644
--- a/third_party/blink/web_tests/external/wpt/tools/certs/cacert.key
+++ b/third_party/blink/web_tests/external/wpt/tools/certs/cacert.key
@@ -1,30 +1,30 @@
 -----BEGIN ENCRYPTED PRIVATE KEY-----
-MIIFHzBJBgkqhkiG9w0BBQ0wPDAbBgkqhkiG9w0BBQwwDgQIwt8BG3xFhxYCAggA
-MB0GCWCGSAFlAwQBKgQQSn81QCB6EGEMiE6pZO1i9gSCBND1XL0OV5alXhRx/wna
-TuDqgFVyDjKbFWkm4gV394chFtOBSlODjAJnDyn25YUCYAf4pj44OQ13YpxFoFtR
-lvqA4TKdETHAONdij2CKIfZONO02Z5qURzySYQ2T4GRANS+UtO5KWD2vS0V4xVHL
-p+BLLoxQM2TgO5vG9/SiktTY7QI7wS7prqUPiUkROOATMR24E+tNlzmCXVRVpMp6
-m8PUecEO4sobYE8KdUgXCiWNb23nok5mM38BTWgxs/6H/ARCPvAUutyqo/gsHMNv
-uaOhev/yWTlF207/E/EtaS2pQcS0MT9sR7rK5KRLsoxpYrmPnEiid4nVvXPSmFAH
-cRCivlb9+VhhJZTtpLCUPgIj7ek9ljZZsr9lw10FELHJNYgQD/2/hkkhdZMQTF/d
-I+Yeq89t13PlyrGQUmL5k+XvmiCbWQWfNGw6p4vWznz6iB1P9L5IuWliQRXW4P3U
-gh/3hRc+C1sDCzCqV1Tr4GFQ7gFTsM5a2AroiT9bJGONGmILPYf6X7UQINruvmBt
-gBLeGJWAtdSN+1Fy7qLz/TbfEYCe0pBChVy1mKuSDXQ3mzWQA4UIJMBeIXkTtEPM
-ijL0Q8SLpt6MTrH8bP78IgrzynugVNvX3gFeVscsGQSUNJvIK+pqgYE1YuwrzNWd
-hpXbQCSgJaLajlyldrXCRudYchqCw4j4Y55BPN4mdgqW6P/9rOyyX9T5Lu/06HZH
-ceRQtsZR5+Qy+aLVL/TJ6nAGp1huVj+Gmz0P+DVb75eqnF7dHBJNqwrrKjq3aIIc
-YrXrKUa1OLkJAm1USHoIKTQS3tG/2xseVdRMCmC8HlaxzXxWxng/ho2L3pQ4MI+e
-5FLqoZruNKUzB9IakfEscEHxleqi+r29gz0FIUWIJU4hPpnE3xL/RF6jP3/f99uJ
-oOhKYVPZLRVgPP7bzO8dzvoF2qiqMRB6lWR7IrOAlHASkfzCkapaOGWgoKf9MqBO
-BptdCA5me2Im5Yrn8DggTogr1o2ZRnvWtZ4S8Ynms4G7P1NM0Da92W08JLLH4/iU
-4IimrFl7dPOn3jvKzr5hhGTmmxcVbO/XXnhY5qTqxlaB1fwq424vzQ7XeRMnlPeI
-NQ/oqO/4Kzz0DrezIz36cXtW4hZt+xNzbvy0FQEqBvWJa3+44nP751owIUG+Af4g
-EIj04smQz1AgiX+ojnvX8udSRsSfpylsUo8K4oF1uZuY3QlzoRgrb0cjR826YL5v
-byd1pJrgxz0oRxduhzR/bHa4mtVmrHiCOYoBjvzEbfQMhnunri8W3HjNDLu50Pdp
-u6xRzUuwL56aF7dqfUafez99KT2eFJBqPmSWnFyfVpL5iFW23KKPD9Oe/jxHWPLh
-/zLqvHaZk4TCT6E0KCn9mv/S6JSoOt+lD6gUnerLqhOnFTKmrZkWCzfchu8Y8NVJ
-nUCdOq/zKZVT1h8p0E8qLVYpTqRGQ4lgPkJt0i1qYJy5FXWmTnZQRdOKeWVh5vwK
-q63ueNwEMGpYCKgm+Gm1StmAQc/eLVL2KmES1BTgTBq1olyiYMHKyIkes1paSvHh
-kkirSf+XJxbQBXw6MpofKHQ5K9sdEfh8jofGwHudwdkrsXoIv/WTYANyg2h//6xh
-qPtyTnrApHAKTsnVbbMt/+4tnw==
+MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIkaenDsgd4ocCAggA
+MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECJAqFIqfz3yoBIIEyJzn9rsqRfFD
+I75CcWTCXZM+f0oTgtBAmx2ZUVn46M9hOq1DGZo1QNcIV53MP+m3QPTwo2AZRsx+
+Q0YobCtHqQRtl3WjLmpWZTA8W/f15A/+N0IQDZy+hxfrYgbhcgT9EhaRMs8NH5Iu
+GaMCmZDNm0RborKLdAtR3EtlFI3WZPejVv5r9HRl6TDHBjpfM+nB3Its11OfUoKO
+QZQyqiAzZpGmwkxPvPVDVk9kKwR6k5ypvANRNS73txQojfDUdLh/Zz2B136Qk8iZ
+f42gI/jbZQD81BT+9t+kfI5BDPYocsGQHSZ/l55NcBPnE3TtfPBWMXJ2T2IrA6LN
+x7C6J5GGwBZ2RYQnim/1tOc6lrx2iGRfBlJa360JfO7jNLyssnChLMeQ1t3KmEN8
+ALxV9jMqN1w58px4qzbj4wVGHIEKb5o1/VhymhwuXBBYY4ztKKv9EKOu+ZMJfPtu
+XILgXUuwnv1jetUXT+SbwVcGj4DoE+LSV7pB65jdmwQePH0icjkFmUXMVW/Pml/J
+KBPuM4Ju4Wxt1+mLXp9maKICK3jJ8Gok2gi5x4axEHx3l8JOAIl+qA5gJ1N24yPl
+1pkJcoEByU1pL32jtDMEn1Isf+pBl9vj5MdKs6EDh+ZrJhovc5puSDfENY1bv/Q6
+IqzLu45TQX6MTqkmGoE8wMJ9MP6otLYEY836+gk5F1cdf9Yw/FiIS3oha8mzj9F3
+BUKZj6ot5/q6Fcr9AQU94hwuJpl7iKAeR3DkDl26lVhbtxtZy0v18bXcqL+iFtMX
+vlc8jAX2Aj8W5OgiAFq069W63Q9pa8HmkAQBoi62yRivJlcXpEoE0hn7en/Hmje1
+58OoiSGHM7c+FyYqBzXJg7j+hU5gn2hKm+PQD+Vyic/TC9mOJozuuOSMd8F94/4q
+2FX9wAyCsyfq6JtJZVjcLu/Xu1h8LfFEyFGDehL6wj1/T3+lkFjc06QY+m7giWmn
+J7ksUZOvZcpV8Z2LGMPZf2h+oOgfQ2df2qKCGz/2e4w5cu3wlZqd3+CxJU9cephZ
+KJl8NRd3LI8SCbVGS21/tRRj65d3jbHgkbN15zbyinWeoggCpKbK/04Pue3aHs77
+NlmPVQyI6Pevl8eJM1YdXrbQCO0zXSg6FdUMm6ACknjRYXgD8rb8HLDj69M5mj5q
+sCayfF0dsh20758w6E6BCtNo1RQyrvIc54SFWBXFwuxfpJmGgbp1jxQSx4ixRZ7i
+zj3JHhlq8ldczaKqiRHhrr3utwVvH5+X9Yw8Bh9wzUrSOFu4TTMPfA7Dl+RjXxg2
+ymX81nv8uSnLc9cnHptug/pIpJh6xBLMcl0rmT7h3hH0u3ahrnu+oAp+M3zNHrsa
+kUxOYe8bn9X2fVqN5rKCQe8OEpczXgtjS5C2DErciIWJhqaUTg3lAfN9xuaz4/KC
+4APc+d7aVMef1tsd3T9JaTdh2KxjgOzE3Af/d+VwOxFMv71+hUXF5zgK/bkg6LPk
+VGiRcShSbM7VbcAaCBMqY/7gz1m134FglMWCVmv9GCDR4AdAlD9KlQ9q0cfGaNJS
+jj86YIu3Z4kzd4pPsjy4bX9k9OOPZ/eO6oSDB2+LqFGn0vHj/zAxfEcWJDm30KhN
+Nkbwd5VFFkXdiQmePxAiGA==
 -----END ENCRYPTED PRIVATE KEY-----
diff --git a/third_party/blink/web_tests/external/wpt/tools/certs/cacert.pem b/third_party/blink/web_tests/external/wpt/tools/certs/cacert.pem
index f450f01..a8ce54b 100644
--- a/third_party/blink/web_tests/external/wpt/tools/certs/cacert.pem
+++ b/third_party/blink/web_tests/external/wpt/tools/certs/cacert.pem
@@ -1,16 +1,16 @@
 -----BEGIN CERTIFICATE-----
-MIJAhzCCP2+gAwIBAgIDC+NXMA0GCSqGSIb3DQEBCwUAMB0xGzAZBgNVBAMMEndl
-Yi1wbGF0Zm9ybS10ZXN0czAeFw0yMDA3MzAyMDEyNDhaFw0yMjEwMDgyMDEyNDha
+MIJAhzCCP2+gAwIBAgIDBsfzMA0GCSqGSIb3DQEBCwUAMB0xGzAZBgNVBAMMEndl
+Yi1wbGF0Zm9ybS10ZXN0czAeFw0yMDA5MTIwMDI1MzBaFw0yMTA5MTIwMDI1MzBa
 MB0xGzAZBgNVBAMMEndlYi1wbGF0Zm9ybS10ZXN0czCCASIwDQYJKoZIhvcNAQEB
-BQADggEPADCCAQoCggEBAONFL+vCrQenoebExCh0nArZa2+BRz3NmEkS0z7EBtc0
-i6FDQr3lwo+b2zDSqllvrpQHCFReuSagHAW1wPRo0mHicdvhHOCfFc2+bBPXS4db
-8cUNUOc4ClRqOLPwGu+yPteWv/OJPx4nS9COU3HWj+KIAINtKtlxoRe6XbXs2D5J
-3iMfJcI3ZINVWmnhAlMTKqzMLjn8ouIDAsyCf7aZj+JS39B4GN1CzBbomXEeJHad
-36PChji2R+k7LJPK/4gwOsfSpiTfOoF0FK1IxZwQ9cWRhqEEgcFpt4CZSR0HadlG
-MYnrgG4a0v/A1BbBQYDe1M0UPttUOHy2+7XHaEdB/vUCAwEAAaOCPc4wgj3KMAwG
-A1UdEwQFMAMBAf8wHQYDVR0OBBYEFLN13aCb8lr+F42Asfynt8EreSkrMEcGA1Ud
-IwRAMD6AFLN13aCb8lr+F42Asfynt8EreSkroSGkHzAdMRswGQYDVQQDDBJ3ZWIt
-cGxhdGZvcm0tdGVzdHOCAwvjVzALBgNVHQ8EBAMCAgQwgh+bBgNVHR4Egh+SMIIf
+BQADggEPADCCAQoCggEBAJ4nWe+DDK0SJZPqgT0i9Cfx7Wg4v1vN+q4yh/sPNmQ+
+wcNbSu7/UwzhBj4SsP/Wpu4DYpnsn19IW3sAsIpkeLvTNGJThV9uc63UHKuT12wx
+LrXAVQogX7Ieou/WRKUUW+S6AMEP9Daa92UA0WPjlplW+l4HgDNStbXJEFF5zCZC
+ZvVO7hI4CzZxbx/o0komKTEklKcSoigsSMs/n9DUWqd+rd6lVQRIqKbowPzs65C2
+6BxT6YqVwD4QxGnRCv+T4EFxfT2GOmn9e5I3O6oN9pgOinzo8QG9ae9izhFHOnaG
++rgRWl430Djg9wQtv8BBSgxgT2swe6PYr9drE1w7Zi0CAwEAAaOCPc4wgj3KMAwG
+A1UdEwQFMAMBAf8wHQYDVR0OBBYEFBItKeGCg0NYb1P7c2KraTOzvBwVMEcGA1Ud
+IwRAMD6AFBItKeGCg0NYb1P7c2KraTOzvBwVoSGkHzAdMRswGQYDVQQDDBJ3ZWIt
+cGxhdGZvcm0tdGVzdHOCAwbH8zALBgNVHQ8EBAMCAgQwgh+bBgNVHR4Egh+SMIIf
 jqCCH4owE4IRd2ViLXBsYXRmb3JtLnRlc3QwF4IVb3A4LndlYi1wbGF0Zm9ybS50
 ZXN0MBeCFW9wNy53ZWItcGxhdGZvcm0udGVzdDAXghVvcDkud2ViLXBsYXRmb3Jt
 LnRlc3QwF4IVb3A0LndlYi1wbGF0Zm9ybS50ZXN0MBeCFW5vdC13ZWItcGxhdGZv
@@ -337,11 +337,11 @@
 cnFodjI4YS5ub3Qtd2ViLXBsYXRmb3JtLnRlc3SCQXhuLS1uOGo2ZHM1M2x3d2ty
 cWh2MjhhLnhuLS1uOGo2ZHM1M2x3d2tycWh2MjhhLndlYi1wbGF0Zm9ybS50ZXN0
 gkV4bi0tbjhqNmRzNTNsd3drcnFodjI4YS54bi0tbjhqNmRzNTNsd3drcnFodjI4
-YS5ub3Qtd2ViLXBsYXRmb3JtLnRlc3QwDQYJKoZIhvcNAQELBQADggEBAHjDIDWw
-i7O1qdt/nBYLqerRN8HqAY6CRWENg50zWKGIPCr2lz2vLDfASy4pUH2ZgPVXWCrN
-Nkw2gHUtMYf1KdY6FOVvRvEWbccsUUR/mPDpjxXkbiALo1WHm/h7NSMg4aqyZi8q
-IJfWwVOgxCOYj5AroHguRG5NvyQ0pcvrVAYUN03DvnV0AT4jxzDi6mo9zLkpgmsM
-GLE4LaHgJfkbhuaX2g0tPSee7pJeXAz/2BaGWyPtb0XGTn5GEPLNDlMKuNCVZewX
-k1Ukk3EAUph+VJXTro3qscP4AJRknLLfoM7LIwPgVrN+4bvHA3w0XIlnreQ25dhF
-1Z567hdoFFgoHdY=
+YS5ub3Qtd2ViLXBsYXRmb3JtLnRlc3QwDQYJKoZIhvcNAQELBQADggEBABJT/1Fz
+fcRod/d4XOiprc0e64D9Ohd91E6grSPdIt/xEt5NEUY+E2F4RSuEYcznruGmnYjG
+SqRaCk6GKRQRNopYH869EqvfvAuLwpL4ZhJZYlEkq2TVY9FHHyDIuSAZ0LbpNvcQ
+68W1hIs9jEJX/WGnaJtOFqrEBY5Ep22+Elm1I+mJmsEbyiKvyw9ovZGGG0HnHODs
+PwkQdfsNEgXnH2OcHZpDqt8xc9VWH2gNnJg2XfxfesUHcGhFY4joki+QiMdQRoHs
+gc8D0R7QauBhc4NLWwat8EIRjKavmZvr+6QN2kGM4w/LYdX/JW121JWP5PbdwS29
+aRxZsfc6+YK+O+k=
 -----END CERTIFICATE-----
diff --git a/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.key b/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.key
index 0d422053..c4f5dc3f 100644
--- a/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.key
+++ b/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.key
@@ -1,28 +1,28 @@
 -----BEGIN PRIVATE KEY-----
-MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQDIC2Z1QbJG1A+y
-gY1nqcGHWaXyNIFx4uwS0h88ayz8kE6c2JEvUqfMYVuC40f1chv63rsruV9Pusn+
-fptnshAyOcbko5R6Hpw5hHFPGztfhmPMn8swt+FO8FpJNCyx0X5bRG6+N/UyQpra
-WsLpuYUNlIUCirZGBLFX6Uwk2gQWzxY9NUSBue8azNm3l6NskbyURReX27SxaKpW
-3Q8Yt3ay0j0QM6DD7KZ4Dvk9zlbLPStFB2lukV3a+M+YpAyG8jYR5Py40ZkJ4RIc
-yWLvel3dERHraxSAU2hTWsScxCli7mMhDbUtoCfkpP4Wh0H2hT5dIc/ATDbO39dJ
-l2vmphtNAgMBAAECggEAHQKKOTbtw5e9LwXam83iYt59UkKLAxkFYzVVkk14mKfU
-vqopY9N4wgrcWn7bUJzbseXa/txDFizgXie+IauQ7bezQDT4szz9KtoqFG6+jXvP
-vTzvGoGQCwKQFU2bra3TxSiHZs52oHNIQaIn4f0lbnK7V0MGa+ECVt1eTXnQXf4o
-M1dkN6NHvizwG9YWZf3EdgVRmSnFl2IoiCkw4kjh76iHD02OgOpMtFEKScirxGbo
-OFZGcQ3nID0rcGlPqA0IeM1LblS8qFH2DlE+I4cDDoLsHIREZaE6BZtttdvGnGo6
-2fNv6U5K/NFVonWXWQF9EIunm509LrIOcfttmOoMAQKBgQD30rrNOfeRxJ1F2Ucf
-1dEY0sI1KHJHkXYITWfsair39CqmObehICUN62vlp7dvcSJQ7H5QNNymbUoSWq5I
-jtUTpNV4GGpGREenx4CrXsJBcosoKX6SGuUrUk/kpvurgGaMphNEMnCjO9oEo6R2
-xPTy1mJN1HhOPrkgOnYyLOS3uQKBgQDOpRonk2i8+WZbmupP+jIiyrq0yudOEDlQ
-vEQxBqLKzCn+fgKFtu+9po5tXmnuweXvDZYPi+fISV1mrlEhdFL+ERt4rVQQexPb
-PdCR8R6Bi/pr7XE5ucAiGXYZPsssNa+5D7YU1wgvBthExHgUEQCdyb7bXlZB4nz8
-xLxjadGiNQKBgCVaV9mTASOxdNsQUs4Tlj6dlbQZcpAi9p1tvVo+7lcNMFh5npnk
-lHEyqMKmstlTPg7gdnF0ZkWXd3CoxlgdXzRkxeAiHfKVXA+H3Hb4A2OF9j+JcZBo
-CV6sO2qFWK2S3uIYLhM7XwrbfJLyb1mPejQX6B0/BxsUDSc0aJhLd/XRAn91Cw7F
-W7j3UEuplxUgN5YuHqWhwUtB6+6KzBfTrO6H7xvaCYVkNzmTMcN6Lv/RPAIAZLGa
-HKQrzWIZxqItULWxMf9dWs9ChnO4ukpoXynoNmCgwNxg1dT9e25o3ig14jKln0CC
-jUkVWcslKCLbOsYemSaBGe3BY4dnpAcQR991AoGAR5F0Q8rd8WleWFDJAOY2t5jR
-oqQ98iH2pQ23fFxwnebnPnyMsX0bG+zXuHtGpEEuFOGc7xqjNTm8MigLcLZ0PAzO
-tscuFcjPG6QwWVjylC2/7+DiAiOHrhsx8jEXMc63Rb9fn3ILH55ZOeZig+A3+ZLk
-pDcbFQ8tKaSChRCy6c0=
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDuGifF9hdWxBC2
+YF7bXIO7xXEREIQw97SL8LEuc7gHfG+0PCya8YNsDssxVdf0xb9Z0XbP4ApKn+Vg
+6aTiTHFYXrQdlyU/o5sVbC3dDInFA3BKBhDOIltHAqIcq1HlFJrq+5wheh+Wv22F
+i2Ceix8cVImA6aJdWLVds/bSLQgLPR0Ez1EP2FHaXZCZvtgFXk2oym6oei1OopZB
+l/AF9sOybD/U2cao6xIX6EIkwgLXrC+Bh7lJLKvX6I8nGKUF3KFwO5RsU50j7d5S
+3U+38QsB8n46QNGgCMAWwe0GoVRnH3SVgR9zGVsS02NLUi3ciGzHnahjYP3Tj8wM
+AR5KH+UbAgMBAAECggEBAIPNKrMklKrNActS8W9QeQOaOgqOL/7DP8gvRoVGPVq3
+gUYuASsMAgnw7n2y3UZ7qH7ZuoE7rba9aEYLT+CNHDkkw2OV5WKi+BgVuBWi+Sh7
+zM7NKMRStGBMjtx74WuDynXFLhpB9faGpOPF0Ygxztjp2uvnaJ9vmYXzNvAFSWye
+KHfj72vFTvLsyrwhEMz0+t6pviiXTZdqTBkZbkbEUN73YQFEsiCNxzoL8SAn4klh
+wFPJdC2AWGXd+FQYUkiYeoocGN01cSlVPCJgv7hwjPCM8ZPXwZWhUxg2RgQHgn8q
+mbPzk8m3gCgrHh5pMmm/V0Zwm3Y4SAEqcmXn9zDtl2ECgYEA+Pw5vKogtT0OC2aK
+SH4MRq9BU+LoC4XkoFilxvZ4n54hEwovau2f4l+fOhL37kWkzgMPHp15tfw3dhb4
+9KUVI7Lu4eNqcjxa0FWnmLxaJMKVo4/fuD3283Fy3feT4p8m8gowUT4fT9PaAQY1
+qwO6W2Y8KyAzb1EMDnjc0KYu5QkCgYEA9M9v3B901kPyi3IYZe/NYM7aUgluWodF
+ge5+6oX7uRsjBeQZgRvXz+8/gswpYkh4anHwqm2uiyy6NrNIRqY5oYpjf1131e/7
+rgkzKNqlscflHdbIw9Gg1PnPKb6qt/nBJtUebE7zOmaRIJq6ItPwB/8jsCm7zWqa
+hbnohqbNBgMCgYEAxjt6dH03AVUU43rGSiUg/P33kyQq/1GgzxEFG72MF/k79/65
+9fYuv3rGOOR1RN1p8yN4XDWge4XNWlW77Huqsvt5OZtoWn83BnvLrcz4MCBEJy8b
+PYMIJJaEj7jXoyx3Q2ldQrGlGFdhUENzYy7apn5lFSjUCqKKaNNNa0mEOJECgYAU
+Y1o7iNsgJRSEDIJ/qtL95vxDrMll/LILOiOTwIjQR7RI/1AocnsstA4kBIDF0KdG
+piqW5v+MU7NGbvPr/lf6Xh4fM1eRl6TsP5PlKSB3h+BK9eJOfJzaX9ui7GAnZkNx
+ynn4JzMWgAhCIOCzmdb5s4PzXeZoGyK3VF5LKIUWpQKBgFem49WIPYZwuJKO+Gjt
+9CdlY5bUyb1z//lxpSxX99YWn4Azo5cNjKI5wo+k/0b7DT1grUqiviv50UxE7XoW
++0DZvgDXvWrr/7c92ARazNGr/gTe2D7TWyIKhyQ9Zrv1dH1NIEjouvXzkLsfB0tY
+eiC3cV07lWvFpXUGIzkzIqpQ
 -----END PRIVATE KEY-----
diff --git a/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.pem b/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.pem
index e7b1b01..438f504b 100644
--- a/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.pem
+++ b/third_party/blink/web_tests/external/wpt/tools/certs/web-platform.test.pem
@@ -1,43 +1,43 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 779096 (0xbe358)
-    Signature Algorithm: sha256WithRSAEncryption
+        Serial Number: 444404 (0x6c7f4)
+        Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=web-platform-tests
         Validity
-            Not Before: Jul 30 20:12:48 2020 GMT
-            Not After : Oct  8 20:12:48 2022 GMT
+            Not Before: Sep 12 00:25:31 2020 GMT
+            Not After : Sep 12 00:25:31 2021 GMT
         Subject: CN=web-platform.test
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
-                Public-Key: (2048 bit)
+                RSA Public-Key: (2048 bit)
                 Modulus:
-                    00:c8:0b:66:75:41:b2:46:d4:0f:b2:81:8d:67:a9:
-                    c1:87:59:a5:f2:34:81:71:e2:ec:12:d2:1f:3c:6b:
-                    2c:fc:90:4e:9c:d8:91:2f:52:a7:cc:61:5b:82:e3:
-                    47:f5:72:1b:fa:de:bb:2b:b9:5f:4f:ba:c9:fe:7e:
-                    9b:67:b2:10:32:39:c6:e4:a3:94:7a:1e:9c:39:84:
-                    71:4f:1b:3b:5f:86:63:cc:9f:cb:30:b7:e1:4e:f0:
-                    5a:49:34:2c:b1:d1:7e:5b:44:6e:be:37:f5:32:42:
-                    9a:da:5a:c2:e9:b9:85:0d:94:85:02:8a:b6:46:04:
-                    b1:57:e9:4c:24:da:04:16:cf:16:3d:35:44:81:b9:
-                    ef:1a:cc:d9:b7:97:a3:6c:91:bc:94:45:17:97:db:
-                    b4:b1:68:aa:56:dd:0f:18:b7:76:b2:d2:3d:10:33:
-                    a0:c3:ec:a6:78:0e:f9:3d:ce:56:cb:3d:2b:45:07:
-                    69:6e:91:5d:da:f8:cf:98:a4:0c:86:f2:36:11:e4:
-                    fc:b8:d1:99:09:e1:12:1c:c9:62:ef:7a:5d:dd:11:
-                    11:eb:6b:14:80:53:68:53:5a:c4:9c:c4:29:62:ee:
-                    63:21:0d:b5:2d:a0:27:e4:a4:fe:16:87:41:f6:85:
-                    3e:5d:21:cf:c0:4c:36:ce:df:d7:49:97:6b:e6:a6:
-                    1b:4d
+                    00:ee:1a:27:c5:f6:17:56:c4:10:b6:60:5e:db:5c:
+                    83:bb:c5:71:11:10:84:30:f7:b4:8b:f0:b1:2e:73:
+                    b8:07:7c:6f:b4:3c:2c:9a:f1:83:6c:0e:cb:31:55:
+                    d7:f4:c5:bf:59:d1:76:cf:e0:0a:4a:9f:e5:60:e9:
+                    a4:e2:4c:71:58:5e:b4:1d:97:25:3f:a3:9b:15:6c:
+                    2d:dd:0c:89:c5:03:70:4a:06:10:ce:22:5b:47:02:
+                    a2:1c:ab:51:e5:14:9a:ea:fb:9c:21:7a:1f:96:bf:
+                    6d:85:8b:60:9e:8b:1f:1c:54:89:80:e9:a2:5d:58:
+                    b5:5d:b3:f6:d2:2d:08:0b:3d:1d:04:cf:51:0f:d8:
+                    51:da:5d:90:99:be:d8:05:5e:4d:a8:ca:6e:a8:7a:
+                    2d:4e:a2:96:41:97:f0:05:f6:c3:b2:6c:3f:d4:d9:
+                    c6:a8:eb:12:17:e8:42:24:c2:02:d7:ac:2f:81:87:
+                    b9:49:2c:ab:d7:e8:8f:27:18:a5:05:dc:a1:70:3b:
+                    94:6c:53:9d:23:ed:de:52:dd:4f:b7:f1:0b:01:f2:
+                    7e:3a:40:d1:a0:08:c0:16:c1:ed:06:a1:54:67:1f:
+                    74:95:81:1f:73:19:5b:12:d3:63:4b:52:2d:dc:88:
+                    6c:c7:9d:a8:63:60:fd:d3:8f:cc:0c:01:1e:4a:1f:
+                    e5:1b
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: 
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                D4:78:96:D1:22:40:93:76:CE:17:EB:B6:70:B6:09:05:E0:A3:17:F8
+                69:30:CF:1C:78:FD:0E:13:3A:FC:91:6A:B2:1D:18:B3:F8:4F:C8:09
             X509v3 Authority Key Identifier: 
-                keyid:B3:75:DD:A0:9B:F2:5A:FE:17:8D:80:B1:FC:A7:B7:C1:2B:79:29:2B
+                keyid:12:2D:29:E1:82:83:43:58:6F:53:FB:73:62:AB:69:33:B3:BC:1C:15
 
             X509v3 Key Usage: 
                 Digital Signature, Non Repudiation, Key Encipherment
@@ -46,33 +46,33 @@
             X509v3 Subject Alternative Name: 
                 DNS:web-platform.test, DNS:op8.web-platform.test, DNS:op7.web-platform.test, DNS:op9.web-platform.test, DNS:op4.web-platform.test, DNS:not-web-platform.test, DNS:op6.web-platform.test, DNS:op3.web-platform.test, DNS:op2.web-platform.test, DNS:op1.web-platform.test, DNS:www.web-platform.test, DNS:op5.web-platform.test, DNS:op88.web-platform.test, DNS:op98.web-platform.test, DNS:op85.web-platform.test, DNS:op89.web-platform.test, DNS:op66.web-platform.test, DNS:op72.web-platform.test, DNS:op24.web-platform.test, DNS:op41.web-platform.test, DNS:op79.web-platform.test, DNS:op91.web-platform.test, DNS:op59.web-platform.test, DNS:op39.web-platform.test, DNS:op60.web-platform.test, DNS:op58.web-platform.test, DNS:op28.web-platform.test, DNS:www1.web-platform.test, DNS:op14.web-platform.test, DNS:op69.web-platform.test, DNS:op40.web-platform.test, DNS:op74.web-platform.test, DNS:op31.web-platform.test, DNS:op18.web-platform.test, DNS:op73.web-platform.test, DNS:op77.web-platform.test, DNS:op12.web-platform.test, DNS:op54.web-platform.test, DNS:op63.web-platform.test, DNS:op71.web-platform.test, DNS:op95.web-platform.test, DNS:op16.web-platform.test, DNS:op36.web-platform.test, DNS:op27.web-platform.test, DNS:op29.web-platform.test, DNS:op94.web-platform.test, DNS:op44.web-platform.test, DNS:op33.web-platform.test, DNS:op84.web-platform.test, DNS:op32.web-platform.test, DNS:op61.web-platform.test, DNS:op70.web-platform.test, DNS:www2.web-platform.test, DNS:op43.web-platform.test, DNS:op78.web-platform.test, DNS:op26.web-platform.test, DNS:op76.web-platform.test, DNS:op52.web-platform.test, DNS:op99.web-platform.test, DNS:op86.web-platform.test, DNS:op46.web-platform.test, DNS:op17.web-platform.test, DNS:op90.web-platform.test, DNS:op93.web-platform.test, DNS:op10.web-platform.test, DNS:op55.web-platform.test, DNS:op47.web-platform.test, DNS:op51.web-platform.test, DNS:op45.web-platform.test, DNS:op80.web-platform.test, DNS:op68.web-platform.test, DNS:op49.web-platform.test, DNS:op57.web-platform.test, DNS:op35.web-platform.test, DNS:op67.web-platform.test, DNS:op92.web-platform.test, DNS:op15.web-platform.test, DNS:op13.web-platform.test, DNS:op75.web-platform.test, DNS:op64.web-platform.test, DNS:op97.web-platform.test, DNS:op37.web-platform.test, DNS:op56.web-platform.test, DNS:op62.web-platform.test, DNS:op82.web-platform.test, DNS:op25.web-platform.test, DNS:op11.web-platform.test, DNS:op50.web-platform.test, DNS:op38.web-platform.test, DNS:op83.web-platform.test, DNS:op81.web-platform.test, DNS:op20.web-platform.test, DNS:op21.web-platform.test, DNS:op23.web-platform.test, DNS:op42.web-platform.test, DNS:op22.web-platform.test, DNS:op65.web-platform.test, DNS:op96.web-platform.test, DNS:op87.web-platform.test, DNS:op19.web-platform.test, DNS:op53.web-platform.test, DNS:op30.web-platform.test, DNS:op48.web-platform.test, DNS:op34.web-platform.test, DNS:op6.not-web-platform.test, DNS:op3.not-web-platform.test, DNS:op2.not-web-platform.test, DNS:op5.not-web-platform.test, DNS:www.not-web-platform.test, DNS:www.www.web-platform.test, DNS:op7.not-web-platform.test, DNS:op4.not-web-platform.test, DNS:op8.not-web-platform.test, DNS:op9.not-web-platform.test, DNS:op1.not-web-platform.test, DNS:op36.not-web-platform.test, DNS:op53.not-web-platform.test, DNS:op50.not-web-platform.test, DNS:op24.not-web-platform.test, DNS:op31.not-web-platform.test, DNS:op95.not-web-platform.test, DNS:op83.not-web-platform.test, DNS:www2.not-web-platform.test, DNS:op73.not-web-platform.test, DNS:op19.not-web-platform.test, DNS:op21.not-web-platform.test, DNS:op81.not-web-platform.test, DNS:op70.not-web-platform.test, DNS:op78.not-web-platform.test, DNS:op40.not-web-platform.test, DNS:op25.not-web-platform.test, DNS:op65.not-web-platform.test, DNS:www.www2.web-platform.test, DNS:op80.not-web-platform.test, DNS:op52.not-web-platform.test, DNS:op68.not-web-platform.test, DNS:op45.not-web-platform.test, DNS:op71.not-web-platform.test, DNS:op72.not-web-platform.test, DNS:op90.not-web-platform.test, DNS:op89.not-web-platform.test, DNS:op49.not-web-platform.test, DNS:op77.not-web-platform.test, DNS:op79.not-web-platform.test, DNS:op82.not-web-platform.test, DNS:www.www1.web-platform.test, DNS:op12.not-web-platform.test, DNS:op39.not-web-platform.test, DNS:op44.not-web-platform.test, DNS:www1.not-web-platform.test, DNS:op58.not-web-platform.test, DNS:op14.not-web-platform.test, DNS:op30.not-web-platform.test, DNS:op62.not-web-platform.test, DNS:op61.not-web-platform.test, DNS:op92.not-web-platform.test, DNS:op29.not-web-platform.test, DNS:op98.not-web-platform.test, DNS:op64.not-web-platform.test, DNS:op26.not-web-platform.test, DNS:op22.not-web-platform.test, DNS:op94.not-web-platform.test, DNS:op38.not-web-platform.test, DNS:op33.not-web-platform.test, DNS:op23.not-web-platform.test, DNS:op57.not-web-platform.test, DNS:op54.not-web-platform.test, DNS:op85.not-web-platform.test, DNS:op46.not-web-platform.test, DNS:op97.not-web-platform.test, DNS:op32.not-web-platform.test, DNS:op60.not-web-platform.test, DNS:op96.not-web-platform.test, DNS:op51.not-web-platform.test, DNS:op41.not-web-platform.test, DNS:op35.not-web-platform.test, DNS:op99.not-web-platform.test, DNS:op42.not-web-platform.test, DNS:op67.not-web-platform.test, DNS:op37.not-web-platform.test, DNS:op48.not-web-platform.test, DNS:op55.not-web-platform.test, DNS:op56.not-web-platform.test, DNS:op84.not-web-platform.test, DNS:op34.not-web-platform.test, DNS:op69.not-web-platform.test, DNS:op11.not-web-platform.test, DNS:op93.not-web-platform.test, DNS:www1.www.web-platform.test, DNS:op86.not-web-platform.test, DNS:op13.not-web-platform.test, DNS:op20.not-web-platform.test, DNS:op76.not-web-platform.test, DNS:op27.not-web-platform.test, DNS:op17.not-web-platform.test, DNS:op75.not-web-platform.test, DNS:op15.not-web-platform.test, DNS:op47.not-web-platform.test, DNS:op18.not-web-platform.test, DNS:op63.not-web-platform.test, DNS:op28.not-web-platform.test, DNS:op43.not-web-platform.test, DNS:op66.not-web-platform.test, DNS:www2.www.web-platform.test, DNS:op91.not-web-platform.test, DNS:op74.not-web-platform.test, DNS:op59.not-web-platform.test, DNS:op88.not-web-platform.test, DNS:op87.not-web-platform.test, DNS:op10.not-web-platform.test, DNS:op16.not-web-platform.test, DNS:www1.www2.web-platform.test, DNS:www2.www2.web-platform.test, DNS:www2.www1.web-platform.test, DNS:www1.www1.web-platform.test, DNS:www.www.not-web-platform.test, DNS:xn--lve-6lad.web-platform.test, DNS:www1.www.not-web-platform.test, DNS:www.www2.not-web-platform.test, DNS:www2.www.not-web-platform.test, DNS:www.www1.not-web-platform.test, DNS:www2.www2.not-web-platform.test, DNS:www2.www1.not-web-platform.test, DNS:www1.www1.not-web-platform.test, DNS:www1.www2.not-web-platform.test, DNS:xn--lve-6lad.www.web-platform.test, DNS:xn--lve-6lad.not-web-platform.test, DNS:www.xn--lve-6lad.web-platform.test, DNS:www2.xn--lve-6lad.web-platform.test, DNS:xn--lve-6lad.www2.web-platform.test, DNS:xn--lve-6lad.www1.web-platform.test, DNS:www1.xn--lve-6lad.web-platform.test, DNS:xn--lve-6lad.www.not-web-platform.test, DNS:www.xn--lve-6lad.not-web-platform.test, DNS:xn--lve-6lad.www1.not-web-platform.test, DNS:www2.xn--lve-6lad.not-web-platform.test, DNS:www1.xn--lve-6lad.not-web-platform.test, DNS:xn--lve-6lad.www2.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--lve-6lad.xn--lve-6lad.web-platform.test, DNS:www.xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www.web-platform.test, DNS:www1.xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www2.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www1.web-platform.test, DNS:www2.xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--lve-6lad.xn--lve-6lad.not-web-platform.test, DNS:www.xn--n8j6ds53lwwkrqhv28a.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www2.not-web-platform.test, DNS:www1.xn--n8j6ds53lwwkrqhv28a.not-web-platform.test, DNS:www2.xn--n8j6ds53lwwkrqhv28a.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.www1.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.xn--lve-6lad.web-platform.test, DNS:xn--lve-6lad.xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.xn--lve-6lad.not-web-platform.test, DNS:xn--lve-6lad.xn--n8j6ds53lwwkrqhv28a.not-web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.xn--n8j6ds53lwwkrqhv28a.web-platform.test, DNS:xn--n8j6ds53lwwkrqhv28a.xn--n8j6ds53lwwkrqhv28a.not-web-platform.test
     Signature Algorithm: sha256WithRSAEncryption
-         87:1a:f7:82:48:e1:85:0a:cd:c9:eb:26:3a:f0:d2:70:1e:cc:
-         1e:1e:8f:61:ed:41:a5:72:4c:0b:dd:7f:9f:6d:eb:f6:96:6c:
-         f5:41:3d:78:6e:69:74:bb:49:d4:d1:8b:e1:5f:c9:1e:43:7f:
-         19:6b:db:fe:37:52:d7:3a:88:a9:29:df:64:63:ae:82:2d:e1:
-         8f:19:10:13:8a:73:c6:8d:ae:ca:99:50:89:49:90:a5:4f:cf:
-         ec:13:5b:2f:eb:dc:a0:d2:53:15:1a:d1:93:4c:47:f0:9b:6f:
-         65:1a:51:e2:4b:73:56:de:57:2a:11:ad:5a:68:92:ad:36:be:
-         b8:f5:b9:72:28:b8:ec:d7:55:d1:0d:e1:40:27:b9:e4:2b:c0:
-         de:a1:e9:38:25:4e:b6:43:dc:1a:0b:38:96:2b:14:5f:88:1a:
-         75:92:fc:bf:76:3a:23:96:37:7f:f4:83:62:8e:fd:5f:29:06:
-         0c:52:2b:e5:23:95:9b:0f:b0:1e:1a:bb:99:b4:3c:1b:83:c9:
-         4d:f5:b7:2c:6b:98:fa:67:48:63:8a:9e:1e:6c:ef:cb:d4:eb:
-         82:a8:49:21:68:a2:d1:34:35:b0:9b:ef:a8:51:22:8b:3a:fd:
-         87:8e:5a:d6:1f:b2:1c:64:c3:10:e2:7d:b6:c9:ce:27:97:16:
-         1a:a6:66:4f
+         70:a3:c2:d4:02:32:83:2c:57:4e:cf:42:0e:d6:50:c1:40:2f:
+         75:84:54:26:ed:21:7b:5e:97:94:ed:ff:43:15:33:4c:fe:eb:
+         b8:d9:a2:ac:ca:ad:59:e7:52:cf:74:59:62:df:a6:01:e5:d5:
+         53:04:6c:97:87:7e:2c:da:44:dd:64:ec:cc:1a:ab:38:99:65:
+         e1:f6:94:59:b7:65:b3:a6:e5:21:7d:96:04:0e:87:d9:13:32:
+         27:50:11:7a:01:7d:6e:a9:42:b1:78:40:4f:0a:89:18:0b:8d:
+         7a:a2:73:39:88:8c:49:da:17:91:6b:c7:2f:ee:7e:79:4e:f5:
+         aa:97:1a:28:c6:5d:89:eb:5e:bc:68:ac:e9:dd:c8:6f:89:50:
+         34:c2:fe:69:70:7a:ce:6b:ef:09:fb:f6:9d:a1:d8:eb:2f:e6:
+         44:1d:1d:f6:e4:97:e4:0e:3e:a5:cc:8b:5b:5b:8c:7c:8c:57:
+         b9:d3:c4:a2:ac:98:c2:91:8b:b9:7f:5a:a6:fb:e4:fb:5b:0b:
+         11:c2:e2:4a:62:d0:98:d0:f9:77:c6:eb:72:b5:92:0d:e6:5d:
+         3c:20:f9:d6:0e:60:2c:45:0f:b9:67:e7:b7:05:9c:a1:a0:e0:
+         3b:40:52:56:fb:64:12:85:f7:56:9e:2d:8c:12:a0:c1:58:27:
+         56:0d:af:d8
 -----BEGIN CERTIFICATE-----
-MIIgvDCCH6SgAwIBAgIDC+NYMA0GCSqGSIb3DQEBCwUAMB0xGzAZBgNVBAMMEndl
-Yi1wbGF0Zm9ybS10ZXN0czAeFw0yMDA3MzAyMDEyNDhaFw0yMjEwMDgyMDEyNDha
+MIIgvDCCH6SgAwIBAgIDBsf0MA0GCSqGSIb3DQEBCwUAMB0xGzAZBgNVBAMMEndl
+Yi1wbGF0Zm9ybS10ZXN0czAeFw0yMDA5MTIwMDI1MzFaFw0yMTA5MTIwMDI1MzFa
 MBwxGjAYBgNVBAMMEXdlYi1wbGF0Zm9ybS50ZXN0MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAyAtmdUGyRtQPsoGNZ6nBh1ml8jSBceLsEtIfPGss/JBO
-nNiRL1KnzGFbguNH9XIb+t67K7lfT7rJ/n6bZ7IQMjnG5KOUeh6cOYRxTxs7X4Zj
-zJ/LMLfhTvBaSTQssdF+W0Ruvjf1MkKa2lrC6bmFDZSFAoq2RgSxV+lMJNoEFs8W
-PTVEgbnvGszZt5ejbJG8lEUXl9u0sWiqVt0PGLd2stI9EDOgw+ymeA75Pc5Wyz0r
-RQdpbpFd2vjPmKQMhvI2EeT8uNGZCeESHMli73pd3RER62sUgFNoU1rEnMQpYu5j
-IQ21LaAn5KT+FodB9oU+XSHPwEw2zt/XSZdr5qYbTQIDAQABo4IeBDCCHgAwCQYD
-VR0TBAIwADAdBgNVHQ4EFgQU1HiW0SJAk3bOF+u2cLYJBeCjF/gwHwYDVR0jBBgw
-FoAUs3XdoJvyWv4XjYCx/Ke3wSt5KSswCwYDVR0PBAQDAgXgMBMGA1UdJQQMMAoG
+AAOCAQ8AMIIBCgKCAQEA7honxfYXVsQQtmBe21yDu8VxERCEMPe0i/CxLnO4B3xv
+tDwsmvGDbA7LMVXX9MW/WdF2z+AKSp/lYOmk4kxxWF60HZclP6ObFWwt3QyJxQNw
+SgYQziJbRwKiHKtR5RSa6vucIXoflr9thYtgnosfHFSJgOmiXVi1XbP20i0ICz0d
+BM9RD9hR2l2Qmb7YBV5NqMpuqHotTqKWQZfwBfbDsmw/1NnGqOsSF+hCJMIC16wv
+gYe5SSyr1+iPJxilBdyhcDuUbFOdI+3eUt1Pt/ELAfJ+OkDRoAjAFsHtBqFUZx90
+lYEfcxlbEtNjS1It3Ihsx52oY2D904/MDAEeSh/lGwIDAQABo4IeBDCCHgAwCQYD
+VR0TBAIwADAdBgNVHQ4EFgQUaTDPHHj9DhM6/JFqsh0Ys/hPyAkwHwYDVR0jBBgw
+FoAUEi0p4YKDQ1hvU/tzYqtpM7O8HBUwCwYDVR0PBAQDAgXgMBMGA1UdJQQMMAoG
 CCsGAQUFBwMBMIIdjwYDVR0RBIIdhjCCHYKCEXdlYi1wbGF0Zm9ybS50ZXN0ghVv
 cDgud2ViLXBsYXRmb3JtLnRlc3SCFW9wNy53ZWItcGxhdGZvcm0udGVzdIIVb3A5
 LndlYi1wbGF0Zm9ybS50ZXN0ghVvcDQud2ViLXBsYXRmb3JtLnRlc3SCFW5vdC13
@@ -231,10 +231,10 @@
 c3SCQXhuLS1uOGo2ZHM1M2x3d2tycWh2MjhhLnhuLS1uOGo2ZHM1M2x3d2tycWh2
 MjhhLndlYi1wbGF0Zm9ybS50ZXN0gkV4bi0tbjhqNmRzNTNsd3drcnFodjI4YS54
 bi0tbjhqNmRzNTNsd3drcnFodjI4YS5ub3Qtd2ViLXBsYXRmb3JtLnRlc3QwDQYJ
-KoZIhvcNAQELBQADggEBAIca94JI4YUKzcnrJjrw0nAezB4ej2HtQaVyTAvdf59t
-6/aWbPVBPXhuaXS7SdTRi+FfyR5Dfxlr2/43Utc6iKkp32RjroIt4Y8ZEBOKc8aN
-rsqZUIlJkKVPz+wTWy/r3KDSUxUa0ZNMR/Cbb2UaUeJLc1beVyoRrVpokq02vrj1
-uXIouOzXVdEN4UAnueQrwN6h6TglTrZD3BoLOJYrFF+IGnWS/L92OiOWN3/0g2KO
-/V8pBgxSK+UjlZsPsB4au5m0PBuDyU31tyxrmPpnSGOKnh5s78vU64KoSSFootE0
-NbCb76hRIos6/YeOWtYfshxkwxDifbbJzieXFhqmZk8=
+KoZIhvcNAQELBQADggEBAHCjwtQCMoMsV07PQg7WUMFAL3WEVCbtIXtel5Tt/0MV
+M0z+67jZoqzKrVnnUs90WWLfpgHl1VMEbJeHfizaRN1k7MwaqziZZeH2lFm3ZbOm
+5SF9lgQOh9kTMidQEXoBfW6pQrF4QE8KiRgLjXqiczmIjEnaF5Frxy/ufnlO9aqX
+GijGXYnrXrxorOndyG+JUDTC/mlwes5r7wn79p2h2Osv5kQdHfbkl+QOPqXMi1tb
+jHyMV7nTxKKsmMKRi7l/Wqb75PtbCxHC4kpi0JjQ+XfG63K1kg3mXTwg+dYOYCxF
+D7ln57cFnKGg4DtAUlb7ZBKF91aeLYwSoMFYJ1YNr9g=
 -----END CERTIFICATE-----
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome.py
index 880e2bd..486070ad 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome.py
@@ -69,7 +69,6 @@
     # browsing context, whereas the CLI flag works for workers, too.
     chrome_options["args"] = []
 
-    chrome_options["args"].append("--ignore-certificate-errors")
     chrome_options["args"].append("--ignore-certificate-errors-spki-list=%s" %
                                   ','.join(chrome_spki_certs.IGNORE_CERTIFICATE_ERRORS_SPKI_LIST))
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_spki_certs.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_spki_certs.py
index e8971e7..289453b 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_spki_certs.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/browsers/chrome_spki_certs.py
@@ -2,7 +2,7 @@
 # DO NOT EDIT MANUALLY.
 
 # tools/certs/web-platform.test.pem
-WPT_FINGERPRINT = 'VPzsk0tdACJMqhsnPpMDesIkQYZrI2RGR+UlPK4emE4='
+WPT_FINGERPRINT = 'Jjw17d8tPl/0TWUbC9g897DgEswu02sENyt5VUgT0wI='
 
 # signed-exchange/resources/127.0.0.1.sxg.pem
 SXG_WPT_FINGERPRINT = '0Rt4mT6SJXojEMHTnKnlJ/hBKMBcI4kteBlhR1eTTdk='
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
deleted file mode 100644
index cf2aed88..0000000
--- 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
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 7ce88a5..0000000
--- 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
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 7433b031..0000000
--- 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
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 269cc86..0000000
--- 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
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index eb817cba..0000000
--- 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
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index ab8b9e3..0000000
--- 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
+++ /dev/null
@@ -1,4 +0,0 @@
-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
deleted file mode 100644
index 8dc5a1ae..0000000
--- 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
+++ /dev/null
@@ -1,4 +0,0 @@
-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/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 21e81b3..38a78a1 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -5006,6 +5006,15 @@
   </description>
 </action>
 
+<action name="ContentSuggestions.Feed.CardAction.ReadLater">
+  <owner>adamta@google.org</owner>
+  <owner>sczs@chromium.org</owner>
+  <owner>feed@chromium.org</owner>
+  <description>
+    The user selected the 'Read Later' option for a Feed card.
+  </description>
+</action>
+
 <action name="ContentSuggestions.Feed.CardAction.SendFeedback">
   <owner>harringtond@chromium.org</owner>
   <owner>carlosk@chromium.org</owner>
@@ -5015,6 +5024,33 @@
   </description>
 </action>
 
+<action name="ContentSuggestions.Feed.HeaderAction.ManageActivity">
+  <owner>adamta@google.org</owner>
+  <owner>sczs@chromium.org</owner>
+  <owner>feed@chromium.org</owner>
+  <description>
+    The user selected the 'Manage Activity' option in the feed header menu.
+  </description>
+</action>
+
+<action name="ContentSuggestions.Feed.HeaderAction.ManageInterests">
+  <owner>adamta@google.org</owner>
+  <owner>sczs@chromium.org</owner>
+  <owner>feed@chromium.org</owner>
+  <description>
+    The user selected the 'Manage Interests' option in the feed header menu.
+  </description>
+</action>
+
+<action name="ContentSuggestions.Feed.InfiniteFeedTriggered">
+  <owner>adamta@google.org</owner>
+  <owner>sczs@chromium.org</owner>
+  <owner>feed@chromium.org</owner>
+  <description>
+    The user has scrolled down enough to trigger the infinite feed pagination.
+  </description>
+</action>
+
 <action name="ContentSuggestions.NotificationsPreferenceOff">
   <owner>dgn@chromium.org</owner>
   <owner>finkm@chromium.org</owner>
@@ -24238,8 +24274,7 @@
   <owner>twellington@chromium.org</owner>
   <owner>chrome-android-app@chromium.org</owner>
   <description>
-    Android: The suggestions section is collapsed by user click on the section
-    header.
+    The suggestions section is collapsed through the section header.
   </description>
 </action>
 
@@ -24247,8 +24282,7 @@
   <owner>twellington@chromium.org</owner>
   <owner>chrome-android-app@chromium.org</owner>
   <description>
-    Android: The suggestions section is expanded by user click on the section
-    header.
+    The suggestions section is expanded through the section header.
   </description>
 </action>
 
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index fb48d46..796889b82 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -40528,6 +40528,7 @@
   <int value="-2075725205" label="disable-new-zip-unpacker"/>
   <int value="-2074080173" label="NightLight:disabled"/>
   <int value="-2071515296" label="allow-sync-xhr-in-page-dismissal"/>
+  <int value="-2071202821" label="CopyLinkToText:enabled"/>
   <int value="-2068490665" label="PasswordChange:enabled"/>
   <int value="-2067166422" label="enable-slimming-paint-v2"/>
   <int value="-2066541315" label="Mus:enabled"/>
@@ -41961,6 +41962,7 @@
   <int value="-662064703" label="MediaSessionService:enabled"/>
   <int value="-661978438" label="enable-data-reduction-proxy-lo-fi"/>
   <int value="-660160292" label="enable-apps-show-on-first-paint"/>
+  <int value="-657808907" label="CopyLinkToText:disabled"/>
   <int value="-654196854" label="PasswordsKeyboardAccessory:enabled"/>
   <int value="-653616608" label="MacSyscallSandbox:disabled"/>
   <int value="-650504533" label="enable-speculative-launch-service-worker"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index d1a6bd03..65de6fc 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -15798,6 +15798,16 @@
   </summary>
 </histogram>
 
+<histogram name="Autofill.PageTranslationStatus" enum="Boolean"
+    expires_after="2020-10-25">
+  <owner>marsin@google.com</owner>
+  <owner>koerber@google.com</owner>
+  <summary>
+    Tracks whether the visible page language was translated or not upon form
+    submission.
+  </summary>
+</histogram>
+
 <histogram name="Autofill.PasswordFormQueryVolume"
     enum="PasswordFormQueryVolume" expires_after="2015-11-10">
   <obsolete>
@@ -16570,6 +16580,18 @@
   </summary>
 </histogram>
 
+<histogram name="Autofill.TranslatedPageLanguage" enum="LanguageCode"
+    expires_after="2020-10-25">
+  <owner>marsin@google.com</owner>
+  <owner>koerber@google.com</owner>
+  <summary>
+    The visible page language (best guess of the original or the translated
+    language, if translation was used) upon form submission. This is a sparse
+    histogram where the integer value represents the language code as described
+    by the ISO 639 standard.
+  </summary>
+</histogram>
+
 <histogram name="Autofill.Unknown.BackoffDelay" units="ms"
     expires_after="2019-01-04">
   <obsolete>
diff --git a/tools/metrics/histograms/histograms_index.txt b/tools/metrics/histograms/histograms_index.txt
index 5fa0506..27cbede 100644
--- a/tools/metrics/histograms/histograms_index.txt
+++ b/tools/metrics/histograms/histograms_index.txt
@@ -1,4 +1,4 @@
 tools/metrics/histograms/histograms.xml
 tools/metrics/histograms/histograms_xml/Fingerprint/histograms.xml
 tools/metrics/histograms/histograms_xml/UMA/histograms.xml
-tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
\ No newline at end of file
+tools/metrics/histograms/histograms_xml/histogram_suffixes_list.xml
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index b929605..1d2c174 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -7679,6 +7679,44 @@
   </metric>
 </event>
 
+<event name="NavigationPredictorRendererWarmup">
+  <owner>robertogden@chromium.org</owner>
+  <owner>tbansal@chromium.org</owner>
+  <summary>
+    Internal feature metrics for a feature that decides whether to start a spare
+    renderer on pages where Chrome heuristically determines that a cross-origin
+    page load is likely to occur based on the anchor elements on the page being
+    cross-origin and/or whether the current page is a search engine result page.
+  </summary>
+  <metric name="CrossOriginLinksRatio">
+    <summary>
+      An int in the range [0, 100] to represent a percentage of the ratio of the
+      links on a page that are cross-origin to the source document. Recorded
+      when there are 1 or more links on a page.
+    </summary>
+  </metric>
+  <metric name="DidWarmup" enum="Boolean">
+    <summary>
+      A bool that is set if a spare renderer was started. Also set on
+      counter-factual arms when the same criteria were met.
+    </summary>
+  </metric>
+  <metric name="PageIndependentStatusBitMask">
+    <summary>
+      A bitmask, recorded on every page when the feature flag is enabled. 0b0001
+      - Set if the feature is in a cooldown period following the last renderer
+      warmup. 0b0010 - Set if the browser already had a spare renderer. 0b0100 -
+      Set if the device memory is below the experiment threshold.
+    </summary>
+  </metric>
+  <metric name="WasDSESRP" enum="Boolean">
+    <summary>
+      A bool that is set if the page is a search result page for the browser's
+      default search engine
+    </summary>
+  </metric>
+</event>
+
 <event name="NavigationTiming" singular="True">
   <owner>nhiroki@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
diff --git a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DownloadCallbackTest.java b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DownloadCallbackTest.java
index bb59addd..fa42a33 100644
--- a/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DownloadCallbackTest.java
+++ b/weblayer/browser/android/javatests/src/org/chromium/weblayer/test/DownloadCallbackTest.java
@@ -18,15 +18,19 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.net.test.util.TestWebServer;
+import org.chromium.weblayer.Browser;
 import org.chromium.weblayer.Download;
 import org.chromium.weblayer.DownloadCallback;
 import org.chromium.weblayer.DownloadError;
 import org.chromium.weblayer.DownloadState;
 import org.chromium.weblayer.Profile;
+import org.chromium.weblayer.Tab;
+import org.chromium.weblayer.TabListCallback;
 import org.chromium.weblayer.WebLayer;
 import org.chromium.weblayer.shell.InstrumentationActivity;
 
@@ -180,6 +184,46 @@
     }
 
     /**
+     * Verifies that if the first navigation in a Tab is for a download then it is deleted.
+     */
+    @Test
+    @SmallTest
+    public void testFirstNavigationIsDownloadClosesTab() throws Throwable {
+        // Set up listening for the tab removal that we expect to happen.
+        CallbackHelper onTabRemovedCallbackHelper = new CallbackHelper();
+        TabListCallback tabListCallback = new TabListCallback() {
+            @Override
+            public void onTabRemoved(Tab tab) {
+                onTabRemovedCallbackHelper.notifyCalled();
+            }
+        };
+        Browser browser = mActivityTestRule.getActivity().getBrowser();
+        TestThreadUtils.runOnUiThreadBlocking(
+                () -> { browser.registerTabListCallback(tabListCallback); });
+
+        final String data = "download data";
+        final String contentDisposition = "attachment;filename=\"download.txt\"";
+        final String mimetype = "text/plain";
+
+        List<Pair<String, String>> downloadHeaders = new ArrayList<Pair<String, String>>();
+        downloadHeaders.add(Pair.create("Content-Disposition", contentDisposition));
+        downloadHeaders.add(Pair.create("Content-Type", mimetype));
+        downloadHeaders.add(Pair.create("Content-Length", Integer.toString(data.length())));
+
+        TestWebServer webServer = TestWebServer.start();
+        try {
+            final String pageUrl = webServer.setResponse("/download.txt", data, downloadHeaders);
+            TestThreadUtils.runOnUiThreadBlocking(() -> {
+                mActivity.getTab().getNavigationController().navigate(Uri.parse(pageUrl));
+            });
+            mCallback.waitForCompleted();
+            onTabRemovedCallbackHelper.waitForFirst();
+        } finally {
+            webServer.shutdown();
+        }
+    }
+
+    /**
      * Verifies the DownloadCallback is informed of downloads resulting from the user clicking on a
      * download link.
      */
diff --git a/weblayer/browser/autofill_client_impl.cc b/weblayer/browser/autofill_client_impl.cc
index cd7e303..5abdd76b 100644
--- a/weblayer/browser/autofill_client_impl.cc
+++ b/weblayer/browser/autofill_client_impl.cc
@@ -80,6 +80,10 @@
   return security_state::SecurityLevel::SECURITY_LEVEL_COUNT;
 }
 
+const translate::LanguageState* AutofillClientImpl::GetLanguageState() {
+  return nullptr;
+}
+
 void AutofillClientImpl::ShowAutofillSettings(bool show_credit_card_settings) {
   NOTREACHED();
 }
diff --git a/weblayer/browser/autofill_client_impl.h b/weblayer/browser/autofill_client_impl.h
index f6b57dab..1d184e1 100644
--- a/weblayer/browser/autofill_client_impl.h
+++ b/weblayer/browser/autofill_client_impl.h
@@ -37,6 +37,7 @@
   autofill::AddressNormalizer* GetAddressNormalizer() override;
   const GURL& GetLastCommittedURL() override;
   security_state::SecurityLevel GetSecurityLevelForUmaHistograms() override;
+  const translate::LanguageState* GetLanguageState() override;
 
   void ShowAutofillSettings(bool show_credit_card_settings) override;
   void ShowUnmaskPrompt(
diff --git a/weblayer/browser/download_browsertest.cc b/weblayer/browser/download_browsertest.cc
index 15918ee..c05a0eba 100644
--- a/weblayer/browser/download_browsertest.cc
+++ b/weblayer/browser/download_browsertest.cc
@@ -281,6 +281,10 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DownloadBrowserTest, PauseResume) {
+  // Add an initial navigation to avoid the tab being deleted if the first
+  // navigation is a download, since we use the tab for convenience in the
+  // lambda.
+  shell()->tab()->GetNavigationController()->Navigate(GURL("about:blank"));
   set_started_callback(base::BindLambdaForTesting([&](Download* download) {
     download->Pause();
     GURL url = embedded_test_server()->GetURL(
diff --git a/weblayer/browser/download_manager_delegate_impl.cc b/weblayer/browser/download_manager_delegate_impl.cc
index 00c35b6..1f889a9 100644
--- a/weblayer/browser/download_manager_delegate_impl.cc
+++ b/weblayer/browser/download_manager_delegate_impl.cc
@@ -209,6 +209,16 @@
 
 void DownloadManagerDelegateImpl::OnDownloadUpdated(
     download::DownloadItem* item) {
+  // If this is the first navigation in a tab it should be closed. Wait until
+  // the target path is determined or the download is canceled to check.
+  if (!item->GetTargetFilePath().empty() ||
+      item->GetState() == download::DownloadItem::CANCELLED) {
+    content::WebContents* web_contents =
+        content::DownloadItemUtils::GetWebContents(item);
+    if (web_contents && web_contents->GetController().IsInitialNavigation())
+      web_contents->Close();
+  }
+
   auto* delegate = GetDelegate(item);
   if (item->GetState() == download::DownloadItem::COMPLETE ||
       item->GetState() == download::DownloadItem::CANCELLED ||
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java b/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java
index ad3702b..816da01 100644
--- a/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java
+++ b/weblayer/browser/java/org/chromium/weblayer_private/ContentViewRenderView.java
@@ -49,7 +49,7 @@
 @JNINamespace("weblayer")
 public class ContentViewRenderView extends RelativeLayout {
     @Retention(RetentionPolicy.SOURCE)
-    @IntDef({MODE_SURFACE_VIEW, MODE_SURFACE_VIEW})
+    @IntDef({MODE_SURFACE_VIEW, MODE_TEXTURE_VIEW})
     public @interface Mode {}
     public static final int MODE_SURFACE_VIEW = 0;
     public static final int MODE_TEXTURE_VIEW = 1;
diff --git a/weblayer/shell/browser/shell.cc b/weblayer/shell/browser/shell.cc
index 58adffab..0f72142 100644
--- a/weblayer/shell/browser/shell.cc
+++ b/weblayer/shell/browser/shell.cc
@@ -103,7 +103,8 @@
 Tab* Shell::tab() {
   if (!browser())
     return nullptr;
-  CHECK(!browser()->GetTabs().empty());
+  if (browser()->GetTabs().empty())
+    return nullptr;
   return browser()->GetTabs()[0];
 }