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 && !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 && 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=" <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]; }